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 */}
} />
);
}