summaryrefslogtreecommitdiff
path: root/src/hooks/useTimerEvents.ts
diff options
context:
space:
mode:
authorSolstice <solstice@local>2026-06-09 01:10:46 -0700
committerSolstice <solstice@local>2026-06-09 01:10:46 -0700
commit887c0bc6f968f80ac90220f24bb578438e05708a (patch)
tree563925e9bc82ae0eee582dc9128ea753d0082ab0 /src/hooks/useTimerEvents.ts
parent4e2d978eb5fc9457d5b913bc10faf1266e6dcda4 (diff)
fix: resolve final release blockers
Diffstat (limited to 'src/hooks/useTimerEvents.ts')
-rw-r--r--src/hooks/useTimerEvents.ts44
1 files changed, 13 insertions, 31 deletions
diff --git a/src/hooks/useTimerEvents.ts b/src/hooks/useTimerEvents.ts
index aebc780..a0d5154 100644
--- a/src/hooks/useTimerEvents.ts
+++ b/src/hooks/useTimerEvents.ts
@@ -1,6 +1,5 @@
import { useEffect, useRef } from 'react';
import { listen } from '@tauri-apps/api/event';
-import { invoke } from '@tauri-apps/api/core';
import { useTimerStore, TimerTickPayload } from '../store/timerStore';
import { useTaskStore } from '../store/taskStore';
@@ -9,15 +8,6 @@ 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;
}
@@ -25,7 +15,7 @@ interface CompletedPayload {
export function useTimerEvents(
onCompleted: (taskId: string | null) => void,
) {
- const setTimerTick = useTimerStore((s) => s.setTimerTick);
+ const syncFromBackend = useTimerStore((s) => s.syncFromBackend);
const setRunning = useTimerStore((s) => s.setRunning);
const fetchTasks = useTaskStore((s) => s.fetchTasks);
@@ -41,16 +31,8 @@ export function useTimerEvents(
async function setup() {
// Bootstrap initial state from backend
try {
- const status = await invoke<TimerStatus>('get_timer_status');
+ await syncFromBackend();
if (cancelled) return;
- 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,
- });
- setRunning(status.running);
} catch (e) {
console.error('Failed to get timer status:', e);
}
@@ -61,24 +43,24 @@ export function useTimerEvents(
try {
const [unlistenTick, unlistenCompleted, unlistenPhaseChanged] = await Promise.all([
listen<TimerTickPayload>('timer-tick', (event) => {
- setTimerTick(event.payload);
- setRunning(true);
+ useTimerStore.setState({
+ phase: event.payload.phase,
+ remainingSecs: event.payload.remaining_secs,
+ totalSecs: event.payload.total_secs,
+ running: true,
+ sessionCount: event.payload.session_count,
+ currentTaskId: event.payload.current_task_id,
+ });
}),
listen<CompletedPayload>('timer-completed', async (event) => {
setRunning(false);
onCompletedRef.current(event.payload.task_id ?? null);
await fetchTasks();
+ await syncFromBackend();
}),
listen<PhaseChangedPayload>('timer-phase-changed', async (_event) => {
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,
- });
+ await syncFromBackend();
} catch (e) {
console.error('Failed to re-sync timer status:', e);
}
@@ -104,5 +86,5 @@ export function useTimerEvents(
cancelled = true;
unlisteners.forEach((fn) => fn());
};
- }, [setTimerTick, setRunning, fetchTasks]); // onCompleted excluded — updated via ref
+ }, [syncFromBackend, setRunning, fetchTasks]); // onCompleted excluded — updated via ref
}