Overview
The Job Manager frontend is built using a Headless UI Architecture with Next.js, separating business logic (hooks) from visual presentation (UI components). This page provides detailed C4 component diagrams for each feature module.Architecture Pattern
Headless Hooks
UI Components
Feature Services
Validation Schemas
Common Infrastructure
All feature components connect to these shared containers:| Container | Technology | Purpose |
|---|---|---|
| Page | Next.js | Root page container and routing |
| Fetcher Utilities | TypeScript | HTTP/HTTPS requests to backend |
| Constants Manager | TypeScript | Centralized URL and config management |
| bamboo-ui | React + TailwindCSS | Shared UI component library |
Signup Component
Implements multi-path registration flow with credentials and Google SSO support. By leveraging a Headless UI pattern, the Next.js page remains a pure composition layer that delegates validation and API interactions to specialized hooks and services.
Component Breakdown
Signup Service
Signup Service
- Internal: Calls Fetcher Utilities to submit data
- External: Indirectly communicates with the Identity Provider via the fetcher to persist the new user
Signup UI Form
Signup UI Form
- Internal: Consumes ValidateSchema for validation rules and passes specific field children/styles to the generic Headless UI Form wrapper
- Displays real-time validation feedback
ValidateSchema
ValidateSchema
- Internal: Used strictly by Signup UI Form to validate form state before submission is allowed, isolating validation logic from UI rendering
SSO Service
SSO Service
- Internal: Calls Fetcher Utilities to retrieve provider-specific redirect URLs
- External: Initiates the browser redirect to external Identity Providers (e.g., Google)
SSO UI Button
SSO UI Button
Reusable Components
| Component | Hook | Purpose |
|---|---|---|
| Headless UI Button | Headless Button Hook | Consistent button behavior, preventing double-clicks while loading |
| Headless UI Form | Headless Form Hook | Form state, isDirty, isSubmitting flags, handleSubmit handlers |
| Headless UI Combobox | Headless Combobox Hook | Country selection dropdown with search |
Login Component
Facilitates secure authentication with credentials and Google SSO. Mirroring the signup architecture, the Next.js page functions as a strict composition layer, delegating complex authentication state and token management to specialized Services and Headless Hooks.
Component Breakdown
Signin Service
Signin Service
- Internal: Calls Fetcher Utilities to verify credentials; interacts with the session state
- External: Indirectly communicates with the Backend Auth Service to validate credentials and retrieve session tokens
Signin UI Form
Signin UI Form
- Internal: Consumes ValidateSchema for input validation and passes specific styling/children to the generic Headless UI Form wrapper
- Displays authentication errors (e.g., “Invalid credentials” or “Account locked”)
ValidateSchema
ValidateSchema
- Internal: Used by Signin UI Form to validate inputs in real-time before the API request is formed, reducing unnecessary network traffic
SSO Service
SSO Service
- Internal: Calls Fetcher Utilities to get provider URLs
- External: Redirects the user to the Identity Provider (Google) for authentication
SSO UI Button
SSO UI Button
Reusable Components
| Component | Hook | Purpose |
|---|---|---|
| Headless UI Button | Headless Button Hook | Button behavior and loading states |
| Headless UI Form | Headless Form Hook | Form submission and validation |
Dashboard Component
Central operational hub aggregating KPIs, recent job posts, notifications, and quick actions. It orchestrates multiple data streams, simultaneously fetching KPI metrics, recent job postings, and system notifications. It utilizes a modular widget architecture, allowing distinct data cards to load independently to optimize the “First Contentful Paint” performance metrics.
Component Breakdown
Overview Card
Overview Card
- Internal: Consumes the generic Headless UI Card for layout and style consistency
- Displays data provided by the getCompanyKpisData service
getCompanyKpisData
getCompanyKpisData
- Internal: Calls Fetcher Utilities to request aggregated metrics
- External: Fetches real-time statistical data from the Backend Analytics Service
Recent Job Posts Card
Recent Job Posts Card
- Internal: Uses the Headless UI Table to display structured data (Title, Posted Date, Status)
- Consumes data from getJobPostsData
getJobPostsData
getJobPostsData
- Internal: Calls Fetcher Utilities with specific pagination or limit parameters (e.g., limit=5) for the dashboard view
Notification Section
Notification Section
- Internal: Consumes the Headless UI List to render individual notification items fetched by getNewNotification
getNewNotification
getNewNotification
- Internal: Calls Fetcher Utilities to check for unread messages
Action Sections (Premium & Draft)
Action Sections (Premium & Draft)
Reusable Components
| Component | Hook | Purpose |
|---|---|---|
| Headless UI Card | Headless Card Hook | Dashboard widget containers, loading states |
| Headless UI List | Headless List Hook | Notification and action feeds, virtualization |
| Headless UI Table | Headless Table Hook | Job posts data table with sorting |
Profile Component
Manages the Company Profile capabilities, allowing users to view and edit their public presence. The architecture splits the profile into logical sections: Header (Branding), Info (Contact Details), and Media (Gallery), orchestrated by a thin Next.js page.
Component Breakdown
Media Services
Media Services
- Internal: Calls Fetcher Utilities to handle multipart file uploads
- External: Interacts with the Backend (and potentially object storage like GCS) to persist media assets
Media Gallery
Media Gallery
- Internal: Consumes the Headless UI Card to display individual media items
- Provides UI controls for adding or removing items via Media Services
getPublicProfileSummaryInfo
getPublicProfileSummaryInfo
- Internal: Calls Fetcher Utilities with the company ID
- External: Sends a GET request to the backend profile summary endpoint
Profile Header Card
Profile Header Card
- Internal: Consumes the Headless UI Card for layout and style
- Displays data fetched by getPublicProfileSummaryInfo
getPublicProfileInfo
getPublicProfileInfo
- Internal: Calls Fetcher Utilities to populate the Profile Info Form with existing data
Profile Info Form
Profile Info Form
- Internal: Consumes ValidateSchema for input rules and passes specific fields to the generic Headless UI Form
- Binds submission events to the update logic
ValidateSchema
ValidateSchema
- Internal: Used strictly by Profile Info Form to validate state before submission
Reusable Components
| Component | Hook | Purpose |
|---|---|---|
| Headless UI Card | Headless Card Hook | Profile section containers, collapsible sections |
| Headless UI Button | Headless Button Hook | Edit/Share action buttons |
| Headless UI Form | Headless Form Hook | Profile editing form |
Subscription Component
Facilitates the monetization workflow, allowing companies to upgrade their accounts to unlock premium features such as real-time notifications and advanced headhunting tools. The architecture handles sensitive payment flows securely by isolating the transaction logic within the Payment Service.
Component Breakdown
getSubscriptionInfo
getSubscriptionInfo
- Internal: Calls Fetcher Utilities to request account data
Subscription Info Card
Subscription Info Card
- Internal: Consumes the Headless UI Card for layout consistency
- Displays data provided by getSubscriptionInfo
Payment Service
Payment Service
- Internal: Calls Fetcher Utilities to post payment requests
- External: Redirects the user to the secure payment gateway URL upon success
Reusable Components
| Component | Hook | Purpose |
|---|---|---|
| Headless UI Card | Headless Card Hook | Plan comparison cards, loading states |
| Headless UI Button | Headless Button Hook | ”Upgrade Now” with loading state to prevent double-charging |
Payment Flow
Fetch Plans
Display Options
Initiate Payment
Redirect
Job Post Management Component
Handles the core recruitment workflow: creation, editing, skill tagging, and application tracking. The architecture orchestrates three distinct functional areas—Job Information (Metadata), Skill Tagging (Taxonomy), and Application Tracking (Candidate Review)—within a unified interface.
Component Breakdown
Job Post Service
Job Post Service
- Internal: Calls Fetcher Utilities with the payload from the form
- External: Communicates with the Backend to persist job data and trigger Kafka events for applicant matching
Job Post Form
Job Post Form
- Internal: Consumes JobPostSchemaValidation for rules and passes specific field children to the generic Headless Form wrapper
JobPostSchemaValidation
JobPostSchemaValidation
- Internal: Used strictly by Job Post Form to validate state before submission
Skill Service
Skill Service
- Internal: Calls Fetcher Utilities to search or retrieve standard skill tags (e.g., “Python”, “React”)
Job Post Skill Tags
Job Post Skill Tags
Application Service
Application Service
- Internal: Calls Fetcher Utilities to get the list of applicants, their CVs, and status (Pending/Archived)
Job Post Application Table
Job Post Application Table
- Internal: Consumes the Headless Table to display data
- Provides actions to view CVs or change application status
Reusable Components
| Component | Hook | Purpose |
|---|---|---|
| Headless TagInput | Headless TagInput Hook | Skill tag management (add, remove, duplicate prevention) |
| Headless Form | Headless Form Hook | Job creation form state |
| Headless Select | Headless Select Hook | Employment type dropdown (single/multi-select) |
| Headless Table | Headless Table Hook | Application data table with sorting, pagination |
Applicant Search Component
Powers the “Headhunting” engine, enabling companies to discover talent by filtering across technical skills, location, and education. The architecture centralizes complex query logic within the Search Orchestrator Service, which aggregates criteria from various UI inputs.
Component Breakdown
Search Orchestrator Service
Search Orchestrator Service
- Internal: Calls Fetcher Utilities to perform the search
- External: Communicates with the Backend (optimized for Full-Text Search) to retrieve matching candidates
SearchBar
SearchBar
- Internal: Consumes the Headless SearchBar to handle user input and debouncing
- Passes the final query term to the Search Orchestrator Service
Filter
Filter
- Internal: Consumes the generic Headless Input for text fields
- Binds changes to the search state
Skill Service
Skill Service
- Internal: Calls Fetcher Utilities to get the list of standard skills (e.g., “React”, “Java”) to populate autocomplete suggestions
SkillsFilter
SkillsFilter
- Internal: Consumes the Headless TagInput to allow users to select multiple competencies (e.g., “Python” AND “Kafka”)
Reusable Components
| Component | Hook | Purpose |
|---|---|---|
| Headless SearchBar | Headless SearchBar Hook | Debouncing (delay API call until typing stops), history |
| Headless TagInput | Headless TagInput Hook | Multi-select skill filtering (add, remove, clear all) |
| Headless Input | Headless Input Hook | Standard text filter fields (validation, state binding) |
Search Flow
User Input
Debounce
Orchestrate
Execute
Headless UI Component Library
All feature modules share these reusable headless components from bamboo-ui:| Component | Hook | Use Cases |
|---|---|---|
| Headless UI Button | Headless Button Hook | All clickable actions |
| Headless UI Form | Headless Form Hook | All form submissions |
| Headless UI Card | Headless Card Hook | Dashboard widgets, profile sections |
| Headless UI Combobox | Headless Combobox Hook | Country selection |
| Headless Select | Headless Select Hook | Dropdown menus |
| Headless TagInput | Headless TagInput Hook | Skill tag management |
| Headless SearchBar | Headless SearchBar Hook | Search inputs with debounce |
| Headless Input | Headless Input Hook | Standard text inputs |
| Headless List | Headless List Hook | Notification feeds |
| Headless Table | Headless Table Hook | Data tables with sorting |