8dae7f5d3b
Groups orders by phone into a client list with expandable rows showing per-order history, summary cards for total clients and closed revenue, and a Clients nav item in the sidebar. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
66 lines
2.7 KiB
React
66 lines
2.7 KiB
React
import React from 'react';
|
|
import { BrowserRouter, Routes, Route, Navigate } from 'react-router-dom';
|
|
import Navbar from './components/Navbar';
|
|
import Hero from './components/Hero';
|
|
import PhysicsOfSafety from './components/PhysicsOfSafety';
|
|
import UseCases from './components/UseCases';
|
|
import Estimator from './components/Estimator';
|
|
import TrustBar from './components/TrustBar';
|
|
import Comparison from './components/Comparison';
|
|
import LeadForm from './components/LeadForm';
|
|
import Footer from './components/Footer';
|
|
|
|
const LoginPage = React.lazy(() => import('./admin/auth/LoginPage'));
|
|
const ProtectedRoute = React.lazy(() => import('./admin/auth/ProtectedRoute'));
|
|
const AdminLayout = React.lazy(() => import('./admin/layout/AdminLayout'));
|
|
const KanbanBoard = React.lazy(() => import('./admin/orders/KanbanBoard'));
|
|
const AnalyticsDashboard = React.lazy(() => import('./admin/analytics/AnalyticsDashboard'));
|
|
const CompletedOrdersTable = React.lazy(() => import('./admin/analytics/CompletedOrdersTable'));
|
|
const UserManagementPage = React.lazy(() => import('./admin/users/UserManagementPage'));
|
|
const SettingsPage = React.lazy(() => import('./admin/settings/SettingsPage'));
|
|
const ClientsPage = React.lazy(() => import('./admin/clients/ClientsPage'));
|
|
|
|
function PublicSite() {
|
|
return (
|
|
<div style={{ minHeight: '100vh', display: 'flex', flexDirection: 'column' }}>
|
|
<Navbar />
|
|
<main style={{ flex: '1' }}>
|
|
<Hero />
|
|
<PhysicsOfSafety />
|
|
<UseCases />
|
|
<TrustBar />
|
|
<Comparison />
|
|
<Estimator />
|
|
<LeadForm />
|
|
</main>
|
|
<Footer />
|
|
</div>
|
|
);
|
|
}
|
|
|
|
function App() {
|
|
return (
|
|
<BrowserRouter>
|
|
<React.Suspense fallback={<div style={{ display: 'flex', justifyContent: 'center', alignItems: 'center', height: '100vh', fontFamily: 'sans-serif', color: '#475569' }}>Загрузка...</div>}>
|
|
<Routes>
|
|
<Route path="/" element={<PublicSite />} />
|
|
<Route path="/admin/login" element={<LoginPage />} />
|
|
<Route path="/admin" element={<Navigate to="/admin/kanban" replace />} />
|
|
<Route path="/admin/*" element={<ProtectedRoute />}>
|
|
<Route element={<AdminLayout />}>
|
|
<Route path="kanban" element={<KanbanBoard />} />
|
|
<Route path="analytics" element={<AnalyticsDashboard />} />
|
|
<Route path="completed" element={<CompletedOrdersTable />} />
|
|
<Route path="users" element={<UserManagementPage />} />
|
|
<Route path="settings" element={<SettingsPage />} />
|
|
<Route path="clients" element={<ClientsPage />} />
|
|
</Route>
|
|
</Route>
|
|
</Routes>
|
|
</React.Suspense>
|
|
</BrowserRouter>
|
|
);
|
|
}
|
|
|
|
export default App;
|