Skip to content

App Structure and Routing

  • Directorysrc/
    • App.tsx Root component — provider composition and routes
    • main.tsx Entry point
    • Directorycomponents/
      • Directorylayout/ DashboardLayout, Header, Sidebar
      • Directoryui/ shadcn/ui primitives (button, card, dialog, etc.)
    • Directorycontexts/
      • AuthContext.tsx JWT storage and role helpers
      • ThemeContext.tsx Dark/light mode
    • Directorypages/ Full page components for each route
    • Directoryrouter/
      • route.ts PrivateRoute component
    • Directoryhooks/ Custom React hooks
    • Directorylib/
      • s3-upload.ts Signed URL upload helper
      • s3-config.ts S3 client config

Providers wrap the app in this order (outermost first):

QueryClientProvider
ThemeProvider
AuthProvider
TooltipProvider
BrowserRouter
KeyboardShortcutsProvider
Suspense
Routes
RouteAccessPurpose
/loginPublicLogin page
/dashboardAdminMain dashboard overview
/articlesAdminArticle list
/articles/addAdminCreate new article
/articles/edit/:idAdminEdit existing article
/articles/preview/:idAdminPreview article before publishing
/sitesAdminManage hosted child sites
/sites/addAdminAdd new site
/sites/edit/:idAdminEdit site
/usersAdminUser management
/tagsAdminTag management
/geoAdminGeographic data
/settingsAdminPlatform settings
/publishersAdminPublisher list and moderation
/publishers/createAdminCreate publisher account
/publishers/:idAdminPublisher detail and actions
/publishers/reportsAdminMonthly article reports
/publisher/dashboardPublisherPublisher’s personal dashboard
/publisher/feedPublisherRSS feed configuration

All routes except /login are wrapped in PrivateRoute. Visiting any protected route without a valid token redirects to /login.