feat: Release CRM V2 (Clean History)

Squashed commits for V2 release including Dark Mode, Chatbot, and Landing Page enhancements.
This commit is contained in:
Satyam
2026-02-01 03:49:20 +05:30
commit 8a749d3041
42 changed files with 12518 additions and 0 deletions
+78
View File
@@ -0,0 +1,78 @@
import React from 'react';
import { Routes, Route, Navigate, useLocation } from 'react-router-dom';
import { useAuth } from './context/AuthContext';
import Layout from './components/Layout';
import Login from './pages/Login';
import Landing from './pages/Landing';
import Dashboard from './pages/Dashboard';
import Maps from './pages/Maps';
import AdminSchedule from './pages/AdminSchedule';
import ErrorBoundary from './components/ErrorBoundary';
import { Toaster } from 'sonner';
import NotFound from './pages/NotFound';
// Protected Route Component
const ProtectedRoute = ({ children, allowedRoles }) => {
const { user, isAuthenticated } = useAuth();
const location = useLocation();
if (!isAuthenticated) {
return <Navigate to="/login" state={{ from: location }} replace />;
}
if (allowedRoles && !allowedRoles.includes(user.role)) {
// If user is employee but wrong role, go to their default dashboard
// For now, just redirect to home or show unauthorized
return <Navigate to="/" replace />;
}
return children;
};
function App() {
return (
<ErrorBoundary>
<Toaster position="top-right" richColors closeButton expand={true} />
<Routes>
<Route element={<Layout />}>
{/* Public Routes */}
<Route path="/" element={<Landing />} />
<Route path="/login" element={<Login />} />
{/* Protected Field Agent Routes */}
<Route
path="/emp/fa/dashboard"
element={
<ProtectedRoute allowedRoles={['FIELD_AGENT', 'ADMIN']}>
<Dashboard />
</ProtectedRoute>
}
/>
<Route
path="/emp/fa/maps"
element={
<ProtectedRoute allowedRoles={['FIELD_AGENT', 'ADMIN']}>
<Maps />
</ProtectedRoute>
}
/>
{/* Protected Admin Routes */}
<Route
path="/admin/schedule"
element={
<ProtectedRoute allowedRoles={['ADMIN']}>
<AdminSchedule />
</ProtectedRoute>
}
/>
</Route>
{/* Catch all */}
<Route path="*" element={<NotFound />} />
</Routes>
</ErrorBoundary>
);
}
export default App;