185 lines
9.8 KiB
TypeScript
185 lines
9.8 KiB
TypeScript
|
|
// config/navigationConfig.tsx
|
|
import React from 'react';
|
|
import {
|
|
Chat as ChatIcon,
|
|
Dashboard as DashboardIcon,
|
|
Description as DescriptionIcon,
|
|
BarChart as BarChartIcon,
|
|
Settings as SettingsIcon,
|
|
Work as WorkIcon,
|
|
Person as PersonIcon,
|
|
Business as BusinessIcon,
|
|
Quiz as QuizIcon,
|
|
Analytics as AnalyticsIcon,
|
|
Search as SearchIcon,
|
|
Bookmark as BookmarkIcon,
|
|
BubbleChart,
|
|
} from '@mui/icons-material';
|
|
import SchoolIcon from '@mui/icons-material/School';
|
|
|
|
import FaceRetouchingNaturalIcon from '@mui/icons-material/FaceRetouchingNatural';
|
|
import LibraryBooksIcon from '@mui/icons-material/LibraryBooks';
|
|
import { BackstoryLogo } from 'components/ui/BackstoryLogo';
|
|
import { HomePage } from 'pages/HomePage';
|
|
import { CandidateChatPage } from 'pages/CandidateChatPage';
|
|
import { DocsPage } from 'pages/DocsPage';
|
|
import { CreateProfilePage } from 'pages/CreateProfilePage';
|
|
import { VectorVisualizerPage } from 'pages/VectorVisualizerPage';
|
|
import { BetaPage } from 'pages/BetaPage';
|
|
import { JobAnalysisPage } from 'pages/JobAnalysisPage';
|
|
import { GenerateCandidate } from 'pages/GenerateCandidate';
|
|
import { Settings } from 'pages/candidate/Settings';
|
|
import { LoginPage } from 'pages/LoginPage';
|
|
import { CandidateDashboard } from 'pages/candidate/Dashboard';
|
|
import { EmailVerificationPage } from 'components/EmailVerificationComponents';
|
|
import { Box, Typography } from '@mui/material';
|
|
import { NavigationConfig, NavigationItem } from 'types/navigation';
|
|
import { CandidateProfile } from 'pages/candidate/Profile';
|
|
import { DocumentManager } from 'components/DocumentManager';
|
|
import { VectorVisualizer } from 'components/VectorVisualizer';
|
|
import { HowItWorks } from 'pages/HowItWorks';
|
|
|
|
// Beta page components for placeholder routes
|
|
const SearchPage = () => (<BetaPage><Typography variant="h4">Search</Typography></BetaPage>);
|
|
const SavedPage = () => (<BetaPage><Typography variant="h4">Saved</Typography></BetaPage>);
|
|
const JobsPage = () => (<BetaPage><Typography variant="h4">Jobs</Typography></BetaPage>);
|
|
const CompanyPage = () => (<BetaPage><Typography variant="h4">Company</Typography></BetaPage>);
|
|
const LogoutPage = () => (<BetaPage><Typography variant="h4">Logout page...</Typography></BetaPage>);
|
|
const AnalyticsPage = () => (<BetaPage><Typography variant="h4">Analytics</Typography></BetaPage>);
|
|
const SettingsPage = () => (<BetaPage><Typography variant="h4">Settings</Typography></BetaPage>);
|
|
|
|
export const navigationConfig: NavigationConfig = {
|
|
items: [
|
|
{ id: 'home', label: <BackstoryLogo />, path: '/', component: <HomePage />, userTypes: ['guest', 'candidate', 'employer'], exact: true, },
|
|
{ id: 'how-it-works', label: 'How It Works', path: '/how-it-works', icon: <SchoolIcon />, component: <HowItWorks />, userTypes: ['guest', 'candidate', 'employer',], },
|
|
{ id: 'job-analysis', label: 'Job Analysis', path: '/job-analysis', icon: <WorkIcon />, component: <JobAnalysisPage />, userTypes: ['guest', 'candidate', 'employer',], },
|
|
{ id: 'chat', label: 'Candidate Chat', path: '/chat', icon: <ChatIcon />, component: <CandidateChatPage />, userTypes: ['guest', 'candidate', 'employer',], }, {
|
|
id: 'candidate-menu', label: 'Tools', icon: <PersonIcon />, userTypes: ['candidate'], children: [
|
|
{ id: 'candidate-dashboard', label: 'Dashboard', path: '/candidate/dashboard', icon: <DashboardIcon />, component: <CandidateDashboard />, userTypes: ['candidate'] },
|
|
{ id: 'candidate-profile', label: 'Profile', icon: <PersonIcon />, path: '/candidate/profile', component: <CandidateProfile />, userTypes: ['candidate'] },
|
|
{ id: 'candidate-docs', label: 'Documents', icon: <BubbleChart />, path: '/candidate/documents', component: <Box sx={{ display: "flex", width: "100%", flexDirection: "column" }}><VectorVisualizer /><DocumentManager /></Box>, userTypes: ['candidate'] },
|
|
{ id: 'candidate-qa-setup', label: 'Q&A Setup', icon: <QuizIcon />, path: '/candidate/qa-setup', component: <BetaPage><Box>Candidate q&a setup page</Box></BetaPage>, userTypes: ['candidate'] },
|
|
{ id: 'candidate-analytics', label: 'Analytics', icon: <AnalyticsIcon />, path: '/candidate/analytics', component: <BetaPage><Box>Candidate analytics page</Box></BetaPage>, userTypes: ['candidate'] },
|
|
{ id: 'candidate-job-analysis', label: 'Job Analysis', path: '/candidate/job-analysis', icon: <WorkIcon />, component: <JobAnalysisPage />, userTypes: ['candidate'], },
|
|
{ id: 'candidate-resumes', label: 'Resumes', icon: <DescriptionIcon />, path: '/candidate/resumes', component: <BetaPage><Box>Candidate resumes page</Box></BetaPage>, userTypes: ['candidate'] },
|
|
{ id: 'candidate-settings', label: 'Settings', path: '/candidate/settings', icon: <SettingsIcon />, component: <Settings />, userTypes: ['candidate'], },
|
|
],
|
|
},
|
|
{
|
|
id: 'employer-menu', label: 'Employer Tools', icon: <BusinessIcon />, userTypes: ['employer'], children: [
|
|
{ id: 'employer-job-analysis', label: 'Job Analysis', path: '/employer/job-analysis', icon: <WorkIcon />, component: <JobAnalysisPage />, userTypes: ['employer'], },
|
|
{ id: 'employer-knowledge-explorer', label: 'Knowledge Explorer', path: '/employer/knowledge-explorer', icon: <WorkIcon />, component: <VectorVisualizerPage />, userTypes: ['employer'], },
|
|
{ id: 'employer-search', label: 'Search', path: '/employer/search', icon: <SearchIcon />, component: <SearchPage />, userTypes: ['employer'], },
|
|
{ id: 'employer-saved', label: 'Saved', path: '/employer/saved', icon: <BookmarkIcon />, component: <SavedPage />, userTypes: ['employer'], },
|
|
{ id: 'employer-jobs', label: 'Jobs', path: '/employer/jobs', icon: <WorkIcon />, component: <JobsPage />, userTypes: ['employer'], },
|
|
{ id: 'employer-company', label: 'Company', path: '/employer/company', icon: <BusinessIcon />, component: <CompanyPage />, userTypes: ['employer'], },
|
|
{ id: 'employer-analytics', label: 'Analytics', path: '/employer/analytics', icon: <BarChartIcon />, component: <AnalyticsPage />, userTypes: ['employer'], },
|
|
{ id: 'employer-settings', label: 'Settings', path: '/employer/settings', icon: <SettingsIcon />, component: <SettingsPage />, userTypes: ['employer'], },
|
|
],
|
|
},
|
|
// { id: 'find-candidate', label: 'Find a Candidate', path: '/find-a-candidate', icon: <PersonSearchIcon />, component: <CandidateListingPage />, userTypes: ['guest', 'candidate', 'employer'], },
|
|
{
|
|
id: 'admin-menu',
|
|
label: 'Admin',
|
|
icon: <PersonIcon />,
|
|
userTypes: ['admin'],
|
|
children: [
|
|
{ id: 'generate-candidate', label: 'Generate Candidate', path: '/admin/generate-candidate', icon: <FaceRetouchingNaturalIcon />, component: <GenerateCandidate />, userTypes: ['admin'] },
|
|
{ id: 'docs', label: 'Docs', path: '/docs/*', icon: <LibraryBooksIcon />, component: <DocsPage />, userTypes: ['admin'], },
|
|
],
|
|
},
|
|
// Auth routes (special handling)
|
|
{
|
|
id: 'auth',
|
|
label: 'Auth',
|
|
userTypes: ['guest', 'candidate', 'employer'],
|
|
children: [
|
|
{
|
|
id: 'register',
|
|
label: 'Register',
|
|
path: '/register',
|
|
component: <BetaPage><CreateProfilePage /></BetaPage>,
|
|
userTypes: ['guest'],
|
|
},
|
|
{
|
|
id: 'login',
|
|
label: 'Login',
|
|
path: '/login',
|
|
component: <LoginPage />,
|
|
userTypes: ['guest', 'candidate', 'employer'],
|
|
},
|
|
{
|
|
id: 'verify-email',
|
|
label: 'Verify Email',
|
|
path: '/login/verify-email',
|
|
component: <EmailVerificationPage />,
|
|
userTypes: ['guest', 'candidate', 'employer'],
|
|
},
|
|
{
|
|
id: 'logout',
|
|
label: 'Logout',
|
|
path: '/logout',
|
|
component: <LogoutPage />,
|
|
userTypes: ['candidate', 'employer'],
|
|
},
|
|
],
|
|
},
|
|
// Catch-all route
|
|
{
|
|
id: 'catch-all',
|
|
label: 'Not Found',
|
|
path: '*',
|
|
component: <BetaPage />,
|
|
userTypes: ['guest', 'candidate', 'employer'],
|
|
},
|
|
],
|
|
};
|
|
|
|
// Utility functions for working with navigation config
|
|
export const getNavigationItemsForUser = (userType: 'guest' | 'candidate' | 'employer' | null, isAdmin: boolean = false): NavigationItem[] => {
|
|
const currentUserType = userType || 'guest';
|
|
const filterItems = (items: NavigationItem[]): NavigationItem[] => {
|
|
return items
|
|
.filter(item => !item.userTypes || item.userTypes.includes(currentUserType) || (item.userTypes.includes('admin') && isAdmin))
|
|
.map(item => ({
|
|
...item,
|
|
children: item.children ? filterItems(item.children) : undefined,
|
|
}))
|
|
.filter(item => item.path || (item.children && item.children.length > 0));
|
|
};
|
|
|
|
return filterItems(navigationConfig.items);
|
|
};
|
|
|
|
export const getAllRoutes = (userType: 'guest' | 'candidate' | 'employer' | null, isAdmin: boolean = false): NavigationItem[] => {
|
|
const currentUserType = userType || 'guest';
|
|
|
|
const extractRoutes = (items: NavigationItem[]): NavigationItem[] => {
|
|
const routes: NavigationItem[] = [];
|
|
|
|
items.forEach(item => {
|
|
if (!item.userTypes || item.userTypes.includes(currentUserType) || (item.userTypes.includes('admin') && isAdmin)) {
|
|
if (item.path && item.component) {
|
|
routes.push(item);
|
|
}
|
|
if (item.children) {
|
|
routes.push(...extractRoutes(item.children));
|
|
}
|
|
}
|
|
});
|
|
|
|
return routes;
|
|
};
|
|
|
|
return extractRoutes(navigationConfig.items);
|
|
};
|
|
|
|
export const getMainNavigationItems = (userType: 'guest' | 'candidate' | 'employer' | null, isAdmin: boolean = false): NavigationItem[] => {
|
|
return getNavigationItemsForUser(userType, isAdmin)
|
|
.filter(item =>
|
|
item.id !== 'auth' &&
|
|
item.id !== 'catch-all' &&
|
|
(item.path || (item.children && item.children.length > 0))
|
|
);
|
|
}; |