Akash4911's picture
Production Deploy: Improved robustness and logging
66b6851
Raw
History Blame Contribute Delete
3.44 kB
import React from 'react';
import { BrowserRouter, Routes, Route, Navigate, useLocation } from 'react-router-dom';
import { ThemeProvider } from './hooks/useTheme';
import { AuthProvider, useAuth } from './hooks/useAuth.tsx';
import LandingPage from './pages/Landing/LandingPage';
import DashboardPage from './pages/Dashboard/DashboardPage';
import TextLabPage from './pages/TextLab/TextLabPage';
import AudioLabPage from './pages/AudioLab/AudioLabPage';
import ImageLabPage from './pages/ImageLab/ImageLabPage';
import VideoLabPage from './pages/VideoLab/VideoLabPage';
import AboutPage from './pages/About/AboutPage';
import ContactPage from './pages/Contact/ContactPage';
import SubscriptionPage from './pages/Subscription/SubscriptionPage';
import LoginPage from './pages/Auth/LoginPage';
import SignupPage from './pages/Auth/SignupPage';
import SettingsPage from './pages/Settings/SettingsPage';
import PrivacyPage from './pages/Legal/PrivacyPage';
import TermsPage from './pages/Legal/TermsPage';
import FAQPage from './pages/Legal/FAQPage';
import './App.css';
// Protected Route Component
const ProtectedRoute = ({ children }: { children: React.ReactNode }) => {
const { isAuthenticated, isLoading } = useAuth();
const location = useLocation();
if (isLoading) {
return (
<div className="min-h-screen flex items-center justify-center bg-[var(--page-bg)]">
<div className="w-16 h-16 border-4 border-[#00E5CC] border-t-transparent rounded-full animate-spin"></div>
</div>
);
}
if (!isAuthenticated) {
return <Navigate to="/login" state={{ from: location }} replace />;
}
return <>{children}</>;
};
// Paid Route Component
const PaidRoute = ({ children }: { children: React.ReactNode }) => {
const { user, isAuthenticated, isLoading } = useAuth();
if (isLoading) return null;
if (!isAuthenticated) return <Navigate to="/login" replace />;
if (user?.subscription_tier !== 'paid') return <Navigate to="/subscription" replace />;
return <>{children}</>;
};
function App() {
return (
<AuthProvider>
<ThemeProvider>
<BrowserRouter>
<Routes>
<Route path="/" element={<LandingPage />} />
<Route path="/dashboard" element={<ProtectedRoute><DashboardPage /></ProtectedRoute>} />
<Route path="/subscription" element={<SubscriptionPage />} />
<Route path="/text-lab" element={<ProtectedRoute><TextLabPage /></ProtectedRoute>} />
<Route path="/image-lab" element={<PaidRoute><ImageLabPage /></PaidRoute>} />
<Route path="/audio-lab" element={<PaidRoute><AudioLabPage /></PaidRoute>} />
<Route path="/video-lab" element={<PaidRoute><VideoLabPage /></PaidRoute>} />
<Route path="/about" element={<AboutPage />} />
<Route path="/contact" element={<ContactPage />} />
<Route path="/privacy" element={<PrivacyPage />} />
<Route path="/terms" element={<TermsPage />} />
<Route path="/faq" element={<FAQPage />} />
<Route path="/login" element={<LoginPage />} />
<Route path="/signup" element={<SignupPage />} />
<Route path="/settings" element={<ProtectedRoute><SettingsPage /></ProtectedRoute>} />
<Route path="*" element={<Navigate to="/" replace />} />
</Routes>
</BrowserRouter>
</ThemeProvider>
</AuthProvider>
);
}
export default App;