Implementation of "Overview" (Real Data Integration) (app/me/page.tsx)
Objective
Finalize the main dashboard by completely removing all dummy data dependencies and wiring the existing layout directly to the live user/session object. This is not a cosmetic change — it is the critical step that transforms the dashboard from a prototype into a production-ready surface. The end result should be a dashboard that loads seamlessly, reflects the user's real activity instantly, and maintains perfect visual stability from the moment the page is requested to the moment data is fully rendered. Every prop, every chart, and every stat card must be driven by real, live session data with no fallbacks to static files.
UI Description
Aesthetics & Design Cohesion
The overview page is the first authenticated surface most users will see after logging in — it sets the tone for the entire application experience. Every design decision must reflect absolute cohesion with the Boundless brand: typography, spacing, color usage, component sizing, and motion must all feel native to the design system, not bolted on. There should be no visual inconsistencies between this page and the rest of the app/me/* family. If something looks slightly off, it is not acceptable.
Performance & Loading Strategy
The most important UX constraint on this page is zero content shift and zero data pop-in. Users should never see a flash of empty content, a skeleton replaced abruptly by real data, or a layout that jumps as data loads in. Achieving this requires a coordinated, layered approach:
- Wrap the dashboard in
AuthGuard to ensure the user session is validated before any content is rendered — unauthenticated users should never reach the dashboard skeleton
- Implement a full-page Skeleton UI that precisely mirrors the dimensions, spacing, and structure of the real dashboard layout — skeletons should not be generic placeholders but accurate outlines of the content they represent
- The transition from skeleton to real content should feel like a fade or dissolve, not a hard swap — use Framer Motion's layout animations or opacity transitions to make the handoff imperceptible
- Coordinate all data-dependent sections so they resolve together where possible, avoiding a cascade of individual sections popping in at different times
Activity Chart Interactions
- The activity chart must support subtle hover tooltips on each data point
- On hover, a styled popover should appear revealing detailed information for that point: the exact date, the activity count, and any other contextually relevant fields available in the session data
- The popover must be styled consistently with the Boundless design system — not a browser default tooltip or an unstyled div, but a polished, on-brand component
- The popover should appear and disappear with a smooth fade transition and must be positioned intelligently to avoid overflowing the viewport at edge data points
- Ensure the tooltip interaction is accessible — keyboard users navigating the chart should also be able to trigger and read tooltip content
Technical Details
Refactoring & Data Mapping
Remove data.json
- Completely remove all imports and references to
data.json from MeDashboard and any child components it uses
- There must be no static fallback data remaining anywhere in the dashboard component tree after this refactor
Session Data Mapping
- Map all props currently sourced from
data.json to their corresponding fields on the user.profile object from the session
- The mapping should be explicit and type-safe — define or extend the necessary TypeScript interfaces in
lib/api/types.ts to cover every field being consumed
- Strictly no
any types anywhere in the mapping layer
Hydration on Mount
- Trigger a
refreshUser() call on component mount to ensure the local user state is perfectly synchronized with the latest backend session before the dashboard renders its data
- The
refreshUser() call should be coordinated with the loading state — the skeleton UI should remain visible until both the session hydration and the refreshUser() resolution are complete
- Handle the case where
refreshUser() fails gracefully: surface an appropriate error state rather than rendering stale or empty data silently
⚠️ Caution
This is a production environment — not a sandbox.
- Code must be performant, accessible, and clean
- No dummy data —
data.json must be fully removed; all props must map to the live user.profile session object
- AI-generated code will be scrutinized; poorly structured or "hallucinated" code will result in immediate issue closure
- Follow the existing design system: shadcn/ui, Tailwind, Framer Motion
Testing & Verification
Automated Tests
npm run lint # Ensure code quality
npm run build # Verify no breaking changes in routing or types
Manual Verification
Implementation of "Overview" (Real Data Integration) (
app/me/page.tsx)Objective
Finalize the main dashboard by completely removing all dummy data dependencies and wiring the existing layout directly to the live
user/sessionobject. This is not a cosmetic change — it is the critical step that transforms the dashboard from a prototype into a production-ready surface. The end result should be a dashboard that loads seamlessly, reflects the user's real activity instantly, and maintains perfect visual stability from the moment the page is requested to the moment data is fully rendered. Every prop, every chart, and every stat card must be driven by real, live session data with no fallbacks to static files.UI Description
Aesthetics & Design Cohesion
The overview page is the first authenticated surface most users will see after logging in — it sets the tone for the entire application experience. Every design decision must reflect absolute cohesion with the Boundless brand: typography, spacing, color usage, component sizing, and motion must all feel native to the design system, not bolted on. There should be no visual inconsistencies between this page and the rest of the
app/me/*family. If something looks slightly off, it is not acceptable.Performance & Loading Strategy
The most important UX constraint on this page is zero content shift and zero data pop-in. Users should never see a flash of empty content, a skeleton replaced abruptly by real data, or a layout that jumps as data loads in. Achieving this requires a coordinated, layered approach:
AuthGuardto ensure the user session is validated before any content is rendered — unauthenticated users should never reach the dashboard skeletonActivity Chart Interactions
Technical Details
Refactoring & Data Mapping
Remove
data.jsondata.jsonfromMeDashboardand any child components it usesSession Data Mapping
data.jsonto their corresponding fields on theuser.profileobject from the sessionlib/api/types.tsto cover every field being consumedanytypes anywhere in the mapping layerHydration on Mount
refreshUser()call on component mount to ensure the local user state is perfectly synchronized with the latest backend session before the dashboard renders its datarefreshUser()call should be coordinated with the loading state — the skeleton UI should remain visible until both the session hydration and therefreshUser()resolution are completerefreshUser()fails gracefully: surface an appropriate error state rather than rendering stale or empty data silentlydata.jsonmust be fully removed; all props must map to the liveuser.profilesession objectTesting & Verification
Automated Tests
Manual Verification
data.jsonis fully removed — no imports, references, or fallbacks remain anywhere in theMeDashboardcomponent treeuser.profilefields and display accurate live datarefreshUser()is called on mount and that the skeleton remains visible until hydration is completerefreshUser()failure handling — confirm an appropriate error state is shown rather than a silent empty or stale renderAuthGuardcorrectly prevents unauthenticated access and does not flash any dashboard content before validation completesanytypes are present in the data mapping layer