App.jsx 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354
  1. import { BrowserRouter, Routes, Route, Navigate } from 'react-router-dom'
  2. import { Toaster } from 'react-hot-toast'
  3. import { AuthProvider, useAuth } from './context/AuthContext'
  4. import Layout from './components/Layout'
  5. import Login from './pages/Login'
  6. import OAuthCallback from './pages/OAuthCallback'
  7. import Dashboard from './pages/Dashboard'
  8. import Properties from './pages/Properties'
  9. import Tenants from './pages/Tenants'
  10. import Owners from './pages/Owners'
  11. import Leases from './pages/Leases'
  12. import LeaseDetail from './pages/LeaseDetail'
  13. import Payments from './pages/Payments'
  14. import Charges from './pages/Charges'
  15. import InvoiceScanner from './pages/InvoiceScanner'
  16. import Profile from './pages/Profile'
  17. function PrivateRoute({ children }) {
  18. const { user, loading } = useAuth()
  19. if (loading) return <div className="min-h-screen flex items-center justify-center"><div className="animate-spin rounded-full h-10 w-10 border-b-2 border-blue-600"></div></div>
  20. return user ? children : <Navigate to="/login" replace />
  21. }
  22. function PublicRoute({ children }) {
  23. const { user, loading } = useAuth()
  24. if (loading) return null
  25. return user ? <Navigate to="/" replace /> : children
  26. }
  27. export default function App() {
  28. return (
  29. <AuthProvider>
  30. <BrowserRouter>
  31. <Toaster position="top-right" />
  32. <Routes>
  33. <Route path="/login" element={<PublicRoute><Login /></PublicRoute>} />
  34. <Route path="/auth/callback" element={<OAuthCallback />} />
  35. <Route path="/" element={<PrivateRoute><Layout /></PrivateRoute>}>
  36. <Route index element={<Dashboard />} />
  37. <Route path="properties" element={<Properties />} />
  38. <Route path="tenants" element={<Tenants />} />
  39. <Route path="owners" element={<Owners />} />
  40. <Route path="leases" element={<Leases />} />
  41. <Route path="leases/:id" element={<LeaseDetail />} />
  42. <Route path="payments" element={<Payments />} />
  43. <Route path="charges" element={<Charges />} />
  44. <Route path="scanner" element={<InvoiceScanner />} />
  45. <Route path="profile" element={<Profile />} />
  46. </Route>
  47. </Routes>
  48. </BrowserRouter>
  49. </AuthProvider>
  50. )
  51. }