Spaces:
Running
Running
File size: 5,075 Bytes
308a91d 454ca1f 308a91d 454ca1f 70a1d29 308a91d 407ebaa 454ca1f 5b92cf6 16e8fe5 16bce84 e30505f 16bce84 e30505f 3b0341c 17178b7 308a91d 31666bf 308a91d 31666bf 308a91d 70a1d29 308a91d 454ca1f 3b0341c 308a91d 17178b7 308a91d 54344fa 95409fe 54344fa 454ca1f e30505f 16bce84 5b92cf6 16e8fe5 454ca1f 17178b7 16bce84 e30505f 17178b7 308a91d 17178b7 308a91d 70a1d29 308a91d | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 | import { BrowserRouter, Routes, Route, Navigate } from 'react-router-dom';
import { Toaster } from 'react-hot-toast';
import { GuestOnly, RequireAuth, RequireSuperAdmin, RequireOwner } from './utils/guards';
import AdminLayout from './layouts/AdminLayout';
import POSLayout from './layouts/POSLayout';
import Login from './pages/Login';
import Register from './pages/Register';
import LandingPage from './pages/LandingPage';
import Dashboard from './pages/Dashboard';
import POS from './pages/POS';
import Products from './pages/Products';
import Categories from './pages/Categories';
import UsersPage from './pages/Users';
import Orders from './pages/Orders';
import KasirReport from './pages/KasirReport';
import Companies from './pages/Companies';
import Branches from './pages/Branches';
import FeeReport from './pages/FeeReport';
import Members from './pages/Members';
import Wallet from './pages/Wallet';
import Vouchers from './pages/dashboard/Vouchers';
import TopupApprovals from './pages/TopupApprovals';
import AdminTenantSettings from './pages/AdminTenantSettings';
import PrivacyPolicy from './pages/PrivacyPolicy';
import TermsOfService from './pages/TermsOfService';
import ContactSupport from './pages/ContactSupport';
import useAuthStore from './store/useAuthStore';
import { getCompanySlug } from './utils/slug';
function AuthLandingRedirect() {
const user = useAuthStore((s) => s.user);
if (!user) return <Navigate to="/login" replace />;
if (user.role === 'super_admin') return <Navigate to="/admin/companies" replace />;
const slug = getCompanySlug(user.company_name);
if (user.role === 'owner') return <Navigate to={`/${slug}/dashboard`} replace />;
return <Navigate to={`/${slug}/pos`} replace />;
}
export default function App() {
return (
<BrowserRouter>
<Toaster
position="top-right"
toastOptions={{
style: {
background: '#FFFFFF',
color: '#082D43',
border: '1px solid rgba(8,45,67,0.08)',
borderRadius: '14px',
boxShadow: '0 8px 30px rgba(8,45,67,0.10)',
fontSize: '13px',
fontWeight: 500,
},
success: {
iconTheme: { primary: '#0e4a6f', secondary: '#FFFFFF' },
},
error: {
iconTheme: { primary: '#dc2626', secondary: '#FFFFFF' },
},
}}
/>
<Routes>
{/* Public */}
<Route path="/" element={<LandingPage />} />
<Route path="/login" element={<GuestOnly><Login /></GuestOnly>} />
<Route path="/register" element={<GuestOnly><Register /></GuestOnly>} />
<Route path="/privacy-policy" element={<PrivacyPolicy />} />
<Route path="/terms-of-service" element={<TermsOfService />} />
<Route path="/contact-support" element={<ContactSupport />} />
{/* POS - accessible by all authenticated */}
<Route element={<RequireAuth><POSLayout /></RequireAuth>}>
<Route path="/:companySlug/pos" element={<POS />} />
</Route>
{/* Shared Admin - accessible by all authenticated */}
<Route element={<RequireAuth><AdminLayout /></RequireAuth>}>
<Route path="/:companySlug/admin/members" element={<Members />} />
<Route path="/:companySlug/kasir/report" element={<KasirReport />} />
</Route>
<Route element={<RequireSuperAdmin><AdminLayout /></RequireSuperAdmin>}>
<Route path="/admin/companies" element={<Companies />} />
<Route path="/admin/tenant-settings" element={<AdminTenantSettings />} />
<Route path="/admin/topups" element={<TopupApprovals />} />
<Route path="/admin/fees" element={<FeeReport />} />
<Route path="/orders" element={<Orders />} />
<Route path="/reports/daily" element={<KasirReport />} />
</Route>
{/* Owner */}
<Route element={<RequireOwner><AdminLayout /></RequireOwner>}>
<Route path="/:companySlug/dashboard" element={<Dashboard />} />
<Route path="/:companySlug/admin/branches" element={<Branches />} />
<Route path="/:companySlug/admin/products" element={<Products />} />
<Route path="/:companySlug/admin/categories" element={<Categories />} />
<Route path="/:companySlug/admin/kasir" element={<UsersPage />} />
<Route path="/:companySlug/admin/orders" element={<Orders />} />
<Route path="/:companySlug/admin/wallet" element={<Wallet />} />
<Route path="/:companySlug/admin/vouchers" element={<Vouchers />} />
<Route path="/:companySlug/owner/report" element={<KasirReport />} />
</Route>
{/* Auth redirect fallbacks for legacy/naked paths */}
<Route path="/dashboard" element={<RequireAuth><AuthLandingRedirect /></RequireAuth>} />
<Route path="/pos" element={<RequireAuth><AuthLandingRedirect /></RequireAuth>} />
{/* Default redirect */}
<Route path="*" element={<Navigate to="/" replace />} />
</Routes>
</BrowserRouter>
);
}
|