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