import { useState, useEffect } from 'react'; import { useDispatch, useSelector } from 'react-redux'; import { RootState } from './store'; import { setCredentials, logout as logoutAction, initializeAuth } from './store/slices/authSlice'; import { RoleGuard } from './components/auth/RoleGuard'; import { Routes, Route, Navigate, useLocation, useNavigate, Outlet } from 'react-router-dom'; import { ApplicationFormPage } from './components/public/ApplicationFormPage'; import PublicQuestionnairePage from './pages/public/PublicQuestionnairePage'; import { LoginPage } from './components/auth/LoginPage'; import { ProspectiveLoginPage } from './components/auth/ProspectiveLoginPage'; import { Sidebar } from './components/layout/Sidebar'; import { Header } from './components/layout/Header'; import { Dashboard } from './components/dashboard/Dashboard'; import { FinanceDashboard } from './components/dashboard/FinanceDashboard'; import { DealerDashboard } from './components/dashboard/DealerDashboard'; import { ProspectiveDashboardPage } from './components/dashboard/ProspectiveDashboardPage'; import { ApplicationsPage } from './components/applications/ApplicationsPage'; import { AllApplicationsPage } from './components/applications/AllApplicationsPage'; import { OpportunityRequestsPage } from './components/applications/OpportunityRequestsPage'; import { UnopportunityRequestsPage } from './components/applications/UnopportunityRequestsPage'; import { ApplicationDetails } from './components/applications/ApplicationDetails'; import { ResignationPage } from './components/applications/ResignationPage'; import { TerminationPage } from './components/applications/TerminationPage'; import { FnFPage } from './components/applications/FnFPage'; import { ResignationDetails } from './components/applications/ResignationDetails'; import { TerminationDetails } from './components/applications/TerminationDetails'; import { FnFDetails } from './components/applications/FnFDetails'; import { FinanceOnboardingPage } from './components/applications/FinanceOnboardingPage'; import { FinanceFnFPage } from './components/applications/FinanceFnFPage'; import { FinancePaymentDetailsPage } from './components/applications/FinancePaymentDetailsPage'; import { FinanceFnFDetailsPage } from './components/applications/FinanceFnFDetailsPage'; import { MasterPage } from './components/applications/MasterPage'; import { UserManagementPage } from './components/admin/UserManagementPage'; import { ConstitutionalChangePage } from './components/applications/ConstitutionalChangePage'; import { ConstitutionalChangeDetails } from './components/applications/ConstitutionalChangeDetails'; import { RelocationRequestPage } from './components/applications/RelocationRequestPage'; import { RelocationRequestDetails } from './components/applications/RelocationRequestDetails'; import { WorknotePage } from './components/applications/WorknotePage'; import { DealerResignationPage } from './components/dealer/DealerResignationPage'; import { DealerConstitutionalChangePage } from './components/dealer/DealerConstitutionalChangePage'; import { DealerRelocationPage } from './components/dealer/DealerRelocationPage'; import QuestionnaireBuilder from './components/admin/QuestionnaireBuilder'; import QuestionnaireList from './components/admin/QuestionnaireList'; import { Toaster } from './components/ui/sonner'; import { User } from './lib/mock-data'; import { toast } from 'sonner'; import { API } from './api/API'; // Layout Component const AppLayout = ({ onLogout, title }: { onLogout: () => void, title: string }) => { return (
window.location.reload()} />
); }; export default function App() { const dispatch = useDispatch(); const { user: currentUser, isAuthenticated, loading } = useSelector((state: RootState) => state.auth); const [showAdminLogin, setShowAdminLogin] = useState(false); const navigate = useNavigate(); const location = useLocation(); useEffect(() => { dispatch(initializeAuth()); }, [dispatch]); const handleLogin = async (email: string, password: string) => { try { const response = await API.login({ email, password }); if (response.ok && response.data) { const { token, user } = response.data as any; localStorage.setItem('token', token); const simplifiedUser: User = { id: user.id, name: user.fullName || email.split('@')[0], email: user.email, password: password, // Note: storing password in state is not ideal, but keeping existing structure role: typeof user.role === 'string' ? user.role : (user.roleCode || 'User') }; dispatch(setCredentials({ user: simplifiedUser, token })); toast.success(`Welcome back, ${simplifiedUser.name}!`); setShowAdminLogin(false); } else { const errorMsg = (response.data as any)?.message || 'Invalid credentials'; toast.error(errorMsg); } } catch (error) { console.error('Login error:', error); toast.error('Something went wrong. Please try again.'); } }; const handleLogout = () => { dispatch(logoutAction()); setShowAdminLogin(false); toast.info('Logged out successfully'); navigate('/'); }; // Listen for 401 logout events from API client useEffect(() => { const onLogout = () => { handleLogout(); toast.error('Session expired. Please login again.'); }; window.addEventListener('auth:logout', onLogout); return () => window.removeEventListener('auth:logout', onLogout); }, [dispatch, navigate]); // Helper to determine page title based on path const getPageTitle = (pathname: string) => { if (pathname.startsWith('/applications/') && pathname.length > 14) return 'Application Details'; if (pathname.includes('/resignation/') && pathname.length > 13) return 'Resignation Details'; // ... Add more dynamic title logic as needed const titles: Record = { '/dashboard': 'Dashboard', '/applications': 'Dealership Requests', '/all-applications': 'All Applications', '/opportunity-requests': 'Opportunity Requests', '/unopportunity-requests': 'Unopportunity Requests', '/tasks': 'My Tasks', '/reports': 'Reports & Analytics', '/settings': 'Settings', '/users': 'User Management', '/resignation': 'Resignation Management', '/termination': 'Termination Management', '/fnf': 'Full & Final Settlement', '/finance-onboarding': 'Payment Verification', '/finance-fnf': 'F&F Financial Settlement', '/master': 'Master Configuration', '/constitutional-change': 'Constitutional Change', '/relocation-requests': 'Relocation Requests', '/dealer-resignation': 'Dealer Resignation Management', '/dealer-constitutional': 'Dealer Constitutional Change', '/dealer-relocation': 'Dealer Relocation Requests', '/questionnaire-builder': 'Questionnaire Builder', }; return titles[pathname] || 'Dashboard'; }; if (loading) { return (
); } // Public Routes if (!isAuthenticated) { return ( <> } /> } /> } /> : setShowAdminLogin(true)} />} /> ) } // Protected Routes return ( {/* Prospective Dealer Route - STRICTLY ISOLATED */} } /> {/* Internal & Dealer Routes - EXCLUDES Prospective Dealers */} }> } /> {/* Dashboards */} navigate(`/${path}`)} onViewPaymentDetails={(id) => navigate(`/finance-onboarding/${id}`)} onViewFnFDetails={(id) => navigate(`/finance-fnf/${id}`)} /> : currentUser?.role === 'Dealer' ? navigate(`/${path}`)} /> : navigate(`/${path}`)} /> } /> {/* Applications */} navigate(`/applications/${id}`)} initialFilter="all" />} /> navigate('/applications')} />} /> navigate(`/applications/${id}`)} initialFilter="all" /> : } /> {/* Admin/Lead Routes */} navigate(`/applications/${id}`)} />} /> navigate(`/applications/${id}`)} />} /> {/* Other Modules */} } /> } /> } /> } /> } /> } /> {/* HR/Finance Modules (Simplified for brevity, following pattern) */} navigate(`/resignation/${id}`)} />} /> navigate('/resignation')} currentUser={currentUser} />} /> navigate(`/termination/${id}`)} />} /> navigate('/termination')} currentUser={currentUser} />} /> navigate(`/fnf/${id}`)} />} /> navigate('/fnf')} currentUser={currentUser} />} /> navigate(`/finance-onboarding/${id}`)} />} /> navigate('/finance-onboarding')} />} /> navigate(`/finance-fnf/${id}`)} />} /> navigate('/finance-fnf')} />} /> navigate(`/constitutional-change/${id}`)} />} /> navigate('/constitutional-change')} currentUser={currentUser} onOpenWorknote={() => { }} />} /> navigate(`/relocation-requests/${id}`)} />} /> navigate('/relocation-requests')} currentUser={currentUser} onOpenWorknote={() => { }} />} /> {/* Dealer Routes */} navigate(`/resignation/${id}`)} />} /> navigate(`/constitutional-change/${id}`)} />} /> navigate(`/relocation-requests/${id}`)} />} /> {/* Placeholder Routes */}

My Tasks

Task management interface would be displayed here

Shows applications assigned to the current user

} />

Reports & Analytics

Advanced reporting and analytics dashboard

Charts, export capabilities, and custom filters

} />

Settings

Profile Settings

Update your profile information and preferences

Notification Preferences

Configure email and system notifications

Security

Change password and manage security settings

} /> {/* Fallback */} } />
); }