- Use module-level signal for clientReady to persist across re-renders
- Use Show component for reactive rendering instead of manual null returns
- createEffect handles redirect when client is ready but no token
- onMount sets clientReady after hydration completes
- Dashboard now shows correct TUTOR role sidebar with Leads/My Responses
- Playwright test verifies TUTOR dashboard renders with correct sidebar items
- RequireAuth: use setTimeout to defer clientReady=true until after hydration completes, preventing SSR/client mismatch
- dashboard.tsx: add SSR guard to return empty div on server
- playwright tests for dashboard role verification
The loading spinner in RequireAuth caused a hydration error: on SSR the session was available so children rendered, but during client hydration session.loading was true so the spinner rendered instead, causing DOM mismatch (null nextSibling).
Also includes role resolution priority fixes from previous session:
- prefer preferredRole when backendRole is JOB_SEEKER but preferredRole is not
- pass role via URL param to dashboard
- urlRoleLocked signal prevents auth effects from overriding URL role
- login.tsx: pass role via URL param to dashboard instead of relying on localStorage
- dashboard.tsx: add urlRoleLocked signal to prevent auth effects from overriding URL-passed role
- auth.tsx: trust passed-in role over re-reading from localStorage in saveUser
All job seeker pages are already connected to real APIs:
- Jobs: /api/jobseeker/jobs (real company job postings)
- Applications: /api/jobseeker/applications (my applied jobs)
- Saved Jobs: Custom data storage for bookmarked jobs
- Apply: POST /api/jobseeker/jobs/{id}/apply
Dashboard shows real data from backend, not mock preview.
- Updated Help Center with dark hero and light content sections
- Added ArticleContent component for rendering structured content blocks
- Updated seed data with detailed articles matching admin KB categories
- Fixed article alignment and spacing issues
- Uses ContentBlock[] instead of HTML strings for type-safe content
- Add AuthProvider context and RequireAuth route guard
- Create API client with all endpoint helpers
- Add forgot-password route wired to backend reset endpoints
- Remove dummy login button from login page
- Wire dashboard to auth context for user data
- Enhance profile save to send all fields
- Wire profile submit-for-verification to backend API
- help-center.ts: replace static HELP_ARTICLES array with async fetch* functions (fetchHelpCenterArticles, fetchHelpCenterCategories, fetchArticleBySlug); legacy sync shims kept for safety
- support/index.tsx: switched from createMemo(static) to createResource(async API) with loading states
- help-center/article/[slug].tsx: now fetches article from API via createResource; renders paragraphs split by double-newline; proper loading and not-found states
- New server-side API routes: /api/kb/articles, /api/kb/categories, /api/kb/articles/[slug] (proxy to Rust gateway, no auth required)
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- DashboardLayout.tsx: fully runtime-config driven sidebar nav using
MODULE_NAV_MAP, role switcher, guided tour spotlight overlay, responsive
mobile drawer
- auth.ts: hardened JWT access token handling, httpOnly cookie refresh flow
- guided-tour-content.ts: expanded per-role tour steps for all modules
- gateway.ts: improved proxy with Set-Cookie forwarding for refresh token
- onboarding/complete.ts + schema.ts: refined onboarding completion flow
- login.ts + register.ts: cleaner error handling and response forwarding
- dashboard/index.tsx: role-based KPI cards from runtime-config
- jobs/index.tsx: status filters, post job action gated by requiresJobApproval
- marketplace/index.tsx + [id].tsx: leads browsing with tracecoin hold display
- requirements/index.tsx + [id].tsx: post requirement with profession-specific
conditional fields, budget/timeline/mode, resubmit support
- portfolio/index.tsx: CRUD for photographer portfolio projects
- services/index.tsx: service management for marketplace professionals
- applications/index.tsx: jobseeker applied jobs list
- notifications.tsx: all/unread tabs, mark read, deep link routing
- settings.tsx: change password form
- wallet/index.tsx + ledger.tsx: tracecoin balance and transaction history
- onboarding.tsx: multi-step onboarding form with profession branching
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>