mirror of
https://github.com/pacnpal/thrilltrack-explorer.git
synced 2025-12-23 21:31:14 -05:00
feat: Add error boundaries
This commit is contained in:
278
src/App.tsx
278
src/App.tsx
@@ -12,6 +12,9 @@ import { LocationAutoDetectProvider } from "@/components/providers/LocationAutoD
|
||||
import { AnalyticsWrapper } from "@/components/analytics/AnalyticsWrapper";
|
||||
import { Footer } from "@/components/layout/Footer";
|
||||
import { PageLoader } from "@/components/loading/PageSkeletons";
|
||||
import { RouteErrorBoundary } from "@/components/error/RouteErrorBoundary";
|
||||
import { AdminErrorBoundary } from "@/components/error/AdminErrorBoundary";
|
||||
import { EntityErrorBoundary } from "@/components/error/EntityErrorBoundary";
|
||||
|
||||
// Core routes (eager-loaded for best UX)
|
||||
import Index from "./pages/Index";
|
||||
@@ -89,62 +92,225 @@ function AppContent(): React.JSX.Element {
|
||||
<div className="min-h-screen flex flex-col">
|
||||
<div className="flex-1">
|
||||
<Suspense fallback={<PageLoader />}>
|
||||
<Routes>
|
||||
{/* Core routes - eager loaded */}
|
||||
<Route path="/" element={<Index />} />
|
||||
<Route path="/parks" element={<Parks />} />
|
||||
<Route path="/rides" element={<Rides />} />
|
||||
<Route path="/search" element={<Search />} />
|
||||
<Route path="/auth" element={<Auth />} />
|
||||
|
||||
{/* Detail routes - lazy loaded */}
|
||||
<Route path="/parks/:slug" element={<ParkDetail />} />
|
||||
<Route path="/parks/:parkSlug/rides" element={<ParkRides />} />
|
||||
<Route path="/parks/:parkSlug/rides/:rideSlug" element={<RideDetail />} />
|
||||
<Route path="/manufacturers" element={<Manufacturers />} />
|
||||
<Route path="/manufacturers/:slug" element={<ManufacturerDetail />} />
|
||||
<Route path="/manufacturers/:manufacturerSlug/rides" element={<ManufacturerRides />} />
|
||||
<Route path="/manufacturers/:manufacturerSlug/models" element={<ManufacturerModels />} />
|
||||
<Route path="/manufacturers/:manufacturerSlug/models/:modelSlug" element={<RideModelDetail />} />
|
||||
<Route path="/manufacturers/:manufacturerSlug/models/:modelSlug/rides" element={<RideModelRides />} />
|
||||
<Route path="/designers" element={<Designers />} />
|
||||
<Route path="/designers/:slug" element={<DesignerDetail />} />
|
||||
<Route path="/designers/:designerSlug/rides" element={<DesignerRides />} />
|
||||
<Route path="/owners" element={<ParkOwners />} />
|
||||
<Route path="/owners/:slug" element={<PropertyOwnerDetail />} />
|
||||
<Route path="/owners/:ownerSlug/parks" element={<OwnerParks />} />
|
||||
<Route path="/operators" element={<Operators />} />
|
||||
<Route path="/operators/:slug" element={<OperatorDetail />} />
|
||||
<Route path="/operators/:operatorSlug/parks" element={<OperatorParks />} />
|
||||
<Route path="/blog" element={<BlogIndex />} />
|
||||
<Route path="/blog/:slug" element={<BlogPost />} />
|
||||
<Route path="/terms" element={<Terms />} />
|
||||
<Route path="/privacy" element={<Privacy />} />
|
||||
<Route path="/submission-guidelines" element={<SubmissionGuidelines />} />
|
||||
<Route path="/contact" element={<Contact />} />
|
||||
|
||||
{/* User routes - lazy loaded */}
|
||||
<Route path="/auth/callback" element={<AuthCallback />} />
|
||||
<Route path="/profile" element={<Profile />} />
|
||||
<Route path="/profile/:username" element={<Profile />} />
|
||||
<Route path="/settings" element={<UserSettings />} />
|
||||
|
||||
{/* Admin routes - lazy loaded */}
|
||||
<Route path="/admin" element={<AdminDashboard />} />
|
||||
<Route path="/admin/moderation" element={<AdminModeration />} />
|
||||
<Route path="/admin/reports" element={<AdminReports />} />
|
||||
<Route path="/admin/system-log" element={<AdminSystemLog />} />
|
||||
<Route path="/admin/users" element={<AdminUsers />} />
|
||||
<Route path="/admin/blog" element={<AdminBlog />} />
|
||||
<Route path="/admin/settings" element={<AdminSettings />} />
|
||||
<Route path="/admin/contact" element={<AdminContact />} />
|
||||
<Route path="/admin/email-settings" element={<AdminEmailSettings />} />
|
||||
|
||||
{/* Utility routes - lazy loaded */}
|
||||
<Route path="/force-logout" element={<ForceLogout />} />
|
||||
{/* ADD ALL CUSTOM ROUTES ABOVE THE CATCH-ALL "*" ROUTE */}
|
||||
<Route path="*" element={<NotFound />} />
|
||||
</Routes>
|
||||
<RouteErrorBoundary>
|
||||
<Routes>
|
||||
{/* Core routes - eager loaded */}
|
||||
<Route path="/" element={<Index />} />
|
||||
<Route path="/parks" element={<Parks />} />
|
||||
<Route path="/rides" element={<Rides />} />
|
||||
<Route path="/search" element={<Search />} />
|
||||
<Route path="/auth" element={<Auth />} />
|
||||
|
||||
{/* Detail routes with entity error boundaries */}
|
||||
<Route
|
||||
path="/parks/:slug"
|
||||
element={
|
||||
<EntityErrorBoundary entityType="park">
|
||||
<ParkDetail />
|
||||
</EntityErrorBoundary>
|
||||
}
|
||||
/>
|
||||
<Route
|
||||
path="/parks/:parkSlug/rides"
|
||||
element={
|
||||
<EntityErrorBoundary entityType="park">
|
||||
<ParkRides />
|
||||
</EntityErrorBoundary>
|
||||
}
|
||||
/>
|
||||
<Route
|
||||
path="/parks/:parkSlug/rides/:rideSlug"
|
||||
element={
|
||||
<EntityErrorBoundary entityType="ride">
|
||||
<RideDetail />
|
||||
</EntityErrorBoundary>
|
||||
}
|
||||
/>
|
||||
<Route path="/manufacturers" element={<Manufacturers />} />
|
||||
<Route
|
||||
path="/manufacturers/:slug"
|
||||
element={
|
||||
<EntityErrorBoundary entityType="manufacturer">
|
||||
<ManufacturerDetail />
|
||||
</EntityErrorBoundary>
|
||||
}
|
||||
/>
|
||||
<Route
|
||||
path="/manufacturers/:manufacturerSlug/rides"
|
||||
element={
|
||||
<EntityErrorBoundary entityType="manufacturer">
|
||||
<ManufacturerRides />
|
||||
</EntityErrorBoundary>
|
||||
}
|
||||
/>
|
||||
<Route
|
||||
path="/manufacturers/:manufacturerSlug/models"
|
||||
element={
|
||||
<EntityErrorBoundary entityType="manufacturer">
|
||||
<ManufacturerModels />
|
||||
</EntityErrorBoundary>
|
||||
}
|
||||
/>
|
||||
<Route
|
||||
path="/manufacturers/:manufacturerSlug/models/:modelSlug"
|
||||
element={
|
||||
<EntityErrorBoundary entityType="manufacturer">
|
||||
<RideModelDetail />
|
||||
</EntityErrorBoundary>
|
||||
}
|
||||
/>
|
||||
<Route
|
||||
path="/manufacturers/:manufacturerSlug/models/:modelSlug/rides"
|
||||
element={
|
||||
<EntityErrorBoundary entityType="manufacturer">
|
||||
<RideModelRides />
|
||||
</EntityErrorBoundary>
|
||||
}
|
||||
/>
|
||||
<Route path="/designers" element={<Designers />} />
|
||||
<Route
|
||||
path="/designers/:slug"
|
||||
element={
|
||||
<EntityErrorBoundary entityType="designer">
|
||||
<DesignerDetail />
|
||||
</EntityErrorBoundary>
|
||||
}
|
||||
/>
|
||||
<Route
|
||||
path="/designers/:designerSlug/rides"
|
||||
element={
|
||||
<EntityErrorBoundary entityType="designer">
|
||||
<DesignerRides />
|
||||
</EntityErrorBoundary>
|
||||
}
|
||||
/>
|
||||
<Route path="/owners" element={<ParkOwners />} />
|
||||
<Route
|
||||
path="/owners/:slug"
|
||||
element={
|
||||
<EntityErrorBoundary entityType="owner">
|
||||
<PropertyOwnerDetail />
|
||||
</EntityErrorBoundary>
|
||||
}
|
||||
/>
|
||||
<Route
|
||||
path="/owners/:ownerSlug/parks"
|
||||
element={
|
||||
<EntityErrorBoundary entityType="owner">
|
||||
<OwnerParks />
|
||||
</EntityErrorBoundary>
|
||||
}
|
||||
/>
|
||||
<Route path="/operators" element={<Operators />} />
|
||||
<Route
|
||||
path="/operators/:slug"
|
||||
element={
|
||||
<EntityErrorBoundary entityType="operator">
|
||||
<OperatorDetail />
|
||||
</EntityErrorBoundary>
|
||||
}
|
||||
/>
|
||||
<Route
|
||||
path="/operators/:operatorSlug/parks"
|
||||
element={
|
||||
<EntityErrorBoundary entityType="operator">
|
||||
<OperatorParks />
|
||||
</EntityErrorBoundary>
|
||||
}
|
||||
/>
|
||||
<Route path="/blog" element={<BlogIndex />} />
|
||||
<Route path="/blog/:slug" element={<BlogPost />} />
|
||||
<Route path="/terms" element={<Terms />} />
|
||||
<Route path="/privacy" element={<Privacy />} />
|
||||
<Route path="/submission-guidelines" element={<SubmissionGuidelines />} />
|
||||
<Route path="/contact" element={<Contact />} />
|
||||
|
||||
{/* User routes - lazy loaded */}
|
||||
<Route path="/auth/callback" element={<AuthCallback />} />
|
||||
<Route path="/profile" element={<Profile />} />
|
||||
<Route path="/profile/:username" element={<Profile />} />
|
||||
<Route path="/settings" element={<UserSettings />} />
|
||||
|
||||
{/* Admin routes with admin error boundaries */}
|
||||
<Route
|
||||
path="/admin"
|
||||
element={
|
||||
<AdminErrorBoundary section="Dashboard">
|
||||
<AdminDashboard />
|
||||
</AdminErrorBoundary>
|
||||
}
|
||||
/>
|
||||
<Route
|
||||
path="/admin/moderation"
|
||||
element={
|
||||
<AdminErrorBoundary section="Moderation Queue">
|
||||
<AdminModeration />
|
||||
</AdminErrorBoundary>
|
||||
}
|
||||
/>
|
||||
<Route
|
||||
path="/admin/reports"
|
||||
element={
|
||||
<AdminErrorBoundary section="Reports">
|
||||
<AdminReports />
|
||||
</AdminErrorBoundary>
|
||||
}
|
||||
/>
|
||||
<Route
|
||||
path="/admin/system-log"
|
||||
element={
|
||||
<AdminErrorBoundary section="System Log">
|
||||
<AdminSystemLog />
|
||||
</AdminErrorBoundary>
|
||||
}
|
||||
/>
|
||||
<Route
|
||||
path="/admin/users"
|
||||
element={
|
||||
<AdminErrorBoundary section="User Management">
|
||||
<AdminUsers />
|
||||
</AdminErrorBoundary>
|
||||
}
|
||||
/>
|
||||
<Route
|
||||
path="/admin/blog"
|
||||
element={
|
||||
<AdminErrorBoundary section="Blog Management">
|
||||
<AdminBlog />
|
||||
</AdminErrorBoundary>
|
||||
}
|
||||
/>
|
||||
<Route
|
||||
path="/admin/settings"
|
||||
element={
|
||||
<AdminErrorBoundary section="Settings">
|
||||
<AdminSettings />
|
||||
</AdminErrorBoundary>
|
||||
}
|
||||
/>
|
||||
<Route
|
||||
path="/admin/contact"
|
||||
element={
|
||||
<AdminErrorBoundary section="Contact Management">
|
||||
<AdminContact />
|
||||
</AdminErrorBoundary>
|
||||
}
|
||||
/>
|
||||
<Route
|
||||
path="/admin/email-settings"
|
||||
element={
|
||||
<AdminErrorBoundary section="Email Settings">
|
||||
<AdminEmailSettings />
|
||||
</AdminErrorBoundary>
|
||||
}
|
||||
/>
|
||||
|
||||
{/* Utility routes - lazy loaded */}
|
||||
<Route path="/force-logout" element={<ForceLogout />} />
|
||||
{/* ADD ALL CUSTOM ROUTES ABOVE THE CATCH-ALL "*" ROUTE */}
|
||||
<Route path="*" element={<NotFound />} />
|
||||
</Routes>
|
||||
</RouteErrorBoundary>
|
||||
</Suspense>
|
||||
</div>
|
||||
<Footer />
|
||||
|
||||
Reference in New Issue
Block a user