# Frontend Architecture ## Purpose Explain the frontend structure, routing, state management, providers, and module organization in the React/Vite app. ## Code Locations (exact paths) - Entry: `frontend/src/main.tsx` - Root app/routing: `frontend/src/App.tsx` - State (Zustand stores): `frontend/src/store/*` (authStore, siteStore, billingStore, settingsStore, onboardingStore, columnVisibilityStore, pageSizeStore) - API layer: `frontend/src/api/*` and `frontend/src/services/api.ts` - Layout and components: `frontend/src/layout/*`, `frontend/src/components/*` - Pages: `frontend/src/pages/*` (modules and settings) - Config: `frontend/src/config/*` - Styles: `frontend/src/index.css`, `frontend/src/styles/igny8-colors.css` ## High-Level Responsibilities - Provide SPA routing with protected routes and module guards. - Maintain global state for auth, site context, billing, settings, UI preferences via Zustand. - Lazy-load module pages to optimize initial load. - Wrap the app with providers for theming, toasts, header metrics, error boundary, and router. ## Detailed Behavior - Entry (`main.tsx`): - Imports global styles and vendor CSS (Swiper, Flatpickr). - Wraps the app with `ErrorBoundary`, `ThemeProvider`, `HeaderMetricsProvider`, `ToastProvider`, `BrowserRouter`, then renders `` via React 18 `createRoot`. - Routing (`App.tsx`): - Uses `BrowserRouter` (in main) with ``/`` inside App. - Public routes: `/signin`, `/signup`. - Protected routes wrapped by `ProtectedRoute` → `AppLayout`; `ModuleGuard` used per-module. - Default dashboard `/` loads `Dashboard/Home`. - Planner routes redirect `/planner` → `/planner/keywords`; writer routes redirect `/writer` → `/writer/tasks`. - Extensive lazy-loaded pages for Planner, Writer, Automation, Linker, Optimizer, Thinker (system), Billing, Admin, Settings, Sites, Help, Reference, Components, UI elements, etc. - `GlobalErrorDisplay` and `LoadingStateMonitor` mounted globally; `ScrollToTop` for navigation changes. - Auth refresh: on mount, if authenticated with token, calls `refreshUser`; on failure with missing credentials message, ignores; otherwise logs out. - State (Zustand examples): - `authStore`: persists user/token/refreshToken; `login`/`register` hit `/api/v1/auth/...`; enforces account and active plan presence; `refreshUser` fetches user from `/api/v1/auth/users/me/`; `refreshToken` hits `/api/v1/auth/refresh/`; logout clears all auth fields. - `siteStore`: stores current site/sector and list; used for context across modules. - `billingStore`, `settingsStore`, `onboardingStore`, `columnVisibilityStore`, `pageSizeStore`: manage billing data, settings flags, onboarding steps, table visibility, pagination sizes. - API layer: - `services/api.ts` provides `fetchAPI` helper for authenticated calls (uses token from auth store, handles JSON, throws on non-OK). - `api/*` modules define typed client calls per domain (auth, planner, writer, etc.). - Layout/components: - `AppLayout` wraps sidebar/header/content; `ModuleGuard` enforces module access flags; `ProtectedRoute` enforces auth. - UI utilities: toasts, error boundary, global loading monitor, scroll-to-top, etc. ## Data Structures / Models Involved (no code) - Frontend state shapes defined in Zustand stores (auth user, site context, billing info, settings). ## Execution Flow - App bootstrap → providers → App routes → ProtectedRoute checks auth → ModuleGuard checks module access → lazy-loaded pages fetch data via `api/*` using tokens from authStore → state updates via stores. ## Cross-Module Interactions - Auth store tokens used by fetchAPI for all modules. - Site store context influences planner/writer/automation calls. - Billing store interacts with billing endpoints; settings store influences UI/features; onboarding/table stores affect page rendering. ## State Transitions - Auth: login/register → set user/token; refresh → update tokens/user; logout clears. - Site context changes update current site/sector for downstream calls. - Billing/settings/onboarding/table state mutate via respective store actions. ## Error Handling - `GlobalErrorDisplay` shows errors; `LoadingStateMonitor` tracks loading; `ProtectedRoute` logs out on failed refresh. - `fetchAPI` throws on non-OK; authStore catches and surfaces messages; ModuleGuard/ProtectedRoute handle unauthorized access. ## Tenancy Rules - Enforced via tokens and site context; ModuleGuard and ProtectedRoute rely on backend responses (account/plan) and module flags. ## Billing Rules - Auth store enforces active plan on login; billing store/pages call billing endpoints for balances/transactions/purchases. ## Background Tasks / Schedulers - None on frontend; relies on backend/Celery for async work; uses Suspense for lazy loading. ## Key Design Considerations - Lazy-loaded routes minimize initial bundle. - Zustand persistence keeps auth/session across reloads. - Providers wrap app for theming, toasts, error boundary to improve UX stability. ## How Developers Should Work With This Module - Add routes inside `App.tsx` under ProtectedRoute for authenticated pages; use ModuleGuard for module-gated pages. - Create new stores in `src/store` for shared state; use `fetchAPI` for authenticated requests. - Keep lazy loading for heavy pages and maintain Suspense fallbacks where needed.