39 lines
2.8 KiB
Markdown
39 lines
2.8 KiB
Markdown
# Implementation Plan: Fix Sleep Timetable Timezone Issue
|
|
|
|
## Overview
|
|
The `SleepTimetable` component incorrectly attributes sleep segments spanning midnight to the wrong day because the backend calculates time-slots in UTC without awareness of the user's local timezone. This plan implements a timezone-aware API to ensure sleep sessions are correctly mapped to the user's local dates.
|
|
|
|
## Detailed Steps
|
|
|
|
### 1. Reproduction (Frontend Test)
|
|
- Create a new test file or add to `frontend/tests/unit/components/stats/SleepTimetable.test.tsx`.
|
|
- Mock `useStats` to return a timetable containing a session that spans midnight (e.g., Wed 23:00 - Thu 06:00).
|
|
- The mock data should reflect what the backend currently returns (which is incorrectly attributed to the wrong day due to timezone mismatch).
|
|
- Assert that for a user in a non-UTC timezone, the green slots for 00:00-02:00 are on the correct day (Thu).
|
|
- This test is expected to fail initially because the current implementation attributes them to Wed.
|
|
|
|
### 2. Backend Implementation (API & Logic)
|
|
- **Modify API**: Update `backend/app/routers/stats.py`:
|
|
- `get_timetable` to accept `timezone_offset: int = Query(0)`.
|
|
- `get_daily_summary` and `get_wake_sleep_times` to also accept `timezone_offset`.
|
|
- **Core Logic Change**: In `get_timetable`:
|
|
- Use `timezone_offset` to translate the requested `from_date`/`to_date` (local) into a UTC range for database queries.
|
|
- When generating slots, calculate the `slot_start_time` and `slot_end_time` in UTC for comparison with session times.
|
|
- When creating the response object, convert those UTC times to Local Time and attach the correct Local Date.
|
|
- This ensures that a session spanning midnight is correctly mapped to its local date segments.
|
|
|
|
### 3. Frontend Implementation (Integration)
|
|
- **Update Hook**: Modify `frontend/src/hooks/useStats.ts` to accept `timezoneOffset` and pass it to the API calls (`fetchTimetable`, etc.).
|
|
- **Update Client**: Modify `frontend/src/api/client.ts` to include the offset in request parameters.
|
|
- **Update Component**: In `frontend/src/components/stats/SleepTimetable.tsx`, ensure the component retrieves the offset via `new Date().getTimezoneOffset()` and passes it to `useStats`.
|
|
- **Cleanup**: Remove the manual `adjustForTimezone` calls in `SleepTimetable.tsx` since the backend will now provide correctly adjusted local times.
|
|
|
|
### 4. Verification
|
|
- Run the frontend unit tests.
|
|
- Verify the fix against the reported issue using a manual test or e2e test if possible.
|
|
|
|
---
|
|
|
|
**Note to Developer:**
|
|
To maintain a high-quality context window and avoid hallucinations, you **MUST** delegate complex tasks to sub-agents. Break down each phase above into smaller, atomic objectives for sub-agents (e.g., one agent for backend API changes, another for frontend hook updates). Do not attempt to execute the entire plan in a single thread.
|