diff options
| -rw-r--r-- | src/hooks/useTimerEvents.ts | 37 |
1 files changed, 29 insertions, 8 deletions
diff --git a/src/hooks/useTimerEvents.ts b/src/hooks/useTimerEvents.ts index 2bc502d..c1f289a 100644 --- a/src/hooks/useTimerEvents.ts +++ b/src/hooks/useTimerEvents.ts @@ -9,6 +9,15 @@ interface PhaseChangedPayload { session_count: number; } +interface TimerStatus { + phase: 'work' | 'short_break' | 'long_break'; + remaining_secs: number; + total_secs: number; + running: boolean; + session_count: number; + current_task_id: string | null; +} + interface CompletedPayload { task_id: string | null; } @@ -58,15 +67,27 @@ export function useTimerEvents( fetchTasks(); }).then((fn) => { unlistenCompleted = fn; }); - listen<PhaseChangedPayload>('timer-phase-changed', (event) => { + listen<PhaseChangedPayload>('timer-phase-changed', async (event) => { setRunning(false); - setTimerTick({ - phase: event.payload.phase, - remaining_secs: useTimerStore.getState().remainingSecs, - total_secs: useTimerStore.getState().totalSecs, - session_count: event.payload.session_count, - current_task_id: useTimerStore.getState().currentTaskId, - }); + try { + const status = await invoke<TimerStatus>('get_timer_status'); + setTimerTick({ + phase: status.phase, + remaining_secs: status.remaining_secs, + total_secs: status.total_secs, + session_count: status.session_count, + current_task_id: status.current_task_id, + }); + } catch (e) { + // Fallback: at least update the phase from the event payload + setTimerTick({ + phase: event.payload.phase, + remaining_secs: useTimerStore.getState().remainingSecs, + total_secs: useTimerStore.getState().totalSecs, + session_count: event.payload.session_count, + current_task_id: useTimerStore.getState().currentTaskId, + }); + } }).then((fn) => { unlistenPhaseChanged = fn; }); return () => { |
