warungpos-ui / src /App.jsx
Mhamdans17
Update orders UI with discount info, add voucher modals to POS, and tenant setting UI
e30505f
Raw
History Blame Contribute Delete
5.08 kB
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>
);
}