Ich habe soweit automatisiert the Emails sortieren aber ich muss noch schauen was es fur bugs es gibt wenn die app online ist deswegen wurde ich mit diesen Commit die website veroffentlichen obwohjl es sein konnte das es noch nicht fertig ist und verkaufs bereit
143 lines
3.6 KiB
TypeScript
143 lines
3.6 KiB
TypeScript
import { BrowserRouter, Routes, Route, Navigate } from 'react-router-dom'
|
|
import { AuthProvider, useAuth } from '@/context/AuthContext'
|
|
import { usePageTracking } from '@/hooks/useAnalytics'
|
|
import { initAnalytics } from '@/lib/analytics'
|
|
import { Home } from '@/pages/Home'
|
|
import { Login } from '@/pages/Login'
|
|
import { Register } from '@/pages/Register'
|
|
import { Dashboard } from '@/pages/Dashboard'
|
|
import { Setup } from '@/pages/Setup'
|
|
import { Settings } from '@/pages/Settings'
|
|
import { ForgotPassword } from '@/pages/ForgotPassword'
|
|
import { ResetPassword } from '@/pages/ResetPassword'
|
|
import { VerifyEmail } from '@/pages/VerifyEmail'
|
|
import { Privacy } from '@/pages/Privacy'
|
|
import { Imprint } from '@/pages/Imprint'
|
|
|
|
// Initialize analytics on app startup
|
|
initAnalytics()
|
|
|
|
// Loading spinner component
|
|
function LoadingSpinner() {
|
|
return (
|
|
<div className="min-h-screen flex items-center justify-center bg-slate-50">
|
|
<div className="flex flex-col items-center gap-4">
|
|
<div className="w-10 h-10 border-4 border-primary-200 border-t-primary-600 rounded-full animate-spin" />
|
|
<p className="text-slate-500 text-sm">Loading...</p>
|
|
</div>
|
|
</div>
|
|
)
|
|
}
|
|
|
|
// Protected route wrapper - requires authentication
|
|
function ProtectedRoute({ children }: { children: React.ReactNode }) {
|
|
const { user, loading } = useAuth()
|
|
|
|
if (loading) {
|
|
return <LoadingSpinner />
|
|
}
|
|
|
|
if (!user) {
|
|
return <Navigate to="/login" replace />
|
|
}
|
|
|
|
return <>{children}</>
|
|
}
|
|
|
|
// Public route that redirects to dashboard if logged in
|
|
function PublicRoute({ children }: { children: React.ReactNode }) {
|
|
const { user, loading } = useAuth()
|
|
|
|
if (loading) {
|
|
return <LoadingSpinner />
|
|
}
|
|
|
|
if (user) {
|
|
return <Navigate to="/dashboard" replace />
|
|
}
|
|
|
|
return <>{children}</>
|
|
}
|
|
|
|
function AppRoutes() {
|
|
// Track page views on route changes
|
|
usePageTracking()
|
|
|
|
return (
|
|
<Routes>
|
|
{/* Public pages */}
|
|
<Route path="/" element={<Home />} />
|
|
|
|
{/* Auth pages - redirect to dashboard if logged in */}
|
|
<Route
|
|
path="/login"
|
|
element={
|
|
<PublicRoute>
|
|
<Login />
|
|
</PublicRoute>
|
|
}
|
|
/>
|
|
<Route
|
|
path="/register"
|
|
element={
|
|
<PublicRoute>
|
|
<Register />
|
|
</PublicRoute>
|
|
}
|
|
/>
|
|
|
|
{/* Password recovery - always accessible */}
|
|
<Route path="/forgot-password" element={<ForgotPassword />} />
|
|
<Route path="/reset-password" element={<ResetPassword />} />
|
|
|
|
{/* Email verification - always accessible */}
|
|
<Route path="/verify" element={<VerifyEmail />} />
|
|
|
|
{/* Legal pages - always accessible */}
|
|
<Route path="/privacy" element={<Privacy />} />
|
|
<Route path="/imprint" element={<Imprint />} />
|
|
|
|
{/* Protected pages - require authentication */}
|
|
<Route
|
|
path="/dashboard"
|
|
element={
|
|
<ProtectedRoute>
|
|
<Dashboard />
|
|
</ProtectedRoute>
|
|
}
|
|
/>
|
|
<Route
|
|
path="/setup"
|
|
element={
|
|
<ProtectedRoute>
|
|
<Setup />
|
|
</ProtectedRoute>
|
|
}
|
|
/>
|
|
<Route
|
|
path="/settings"
|
|
element={
|
|
<ProtectedRoute>
|
|
<Settings />
|
|
</ProtectedRoute>
|
|
}
|
|
/>
|
|
|
|
{/* Catch all - redirect to home */}
|
|
<Route path="*" element={<Navigate to="/" replace />} />
|
|
</Routes>
|
|
)
|
|
}
|
|
|
|
function App() {
|
|
return (
|
|
<BrowserRouter>
|
|
<AuthProvider>
|
|
<AppRoutes />
|
|
</AuthProvider>
|
|
</BrowserRouter>
|
|
)
|
|
}
|
|
|
|
export default App
|