summaryrefslogtreecommitdiff
path: root/src/store/timerStore.ts
blob: 79170a402f54bc93cd9d0856b1c2243c63ea13a8 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
import { invoke } from '@tauri-apps/api/core';
import { create } from 'zustand';

export type TimerPhase = 'work' | 'short_break' | 'long_break';

export interface TimerTickPayload {
  phase: TimerPhase;
  remaining_secs: number;
  total_secs: number;
  session_count: number;
  current_task_id: string | null;
}

export interface TimerStatus {
  phase: TimerPhase;
  remaining_secs: number;
  total_secs: number;
  running: boolean;
  session_count: number;
  current_task_id: string | null;
}

interface TimerState {
  phase: TimerPhase;
  remainingSecs: number;
  totalSecs: number;
  running: boolean;
  sessionCount: number;
  currentTaskId: string | null;
  syncFromBackend: () => Promise<void>;
  setTimerTick: (payload: TimerTickPayload) => void;
  setRunning: (running: boolean) => void;
  setCurrentTaskId: (currentTaskId: string | null) => void;
}

export const useTimerStore = create<TimerState>((set) => ({
  phase: 'work',
  remainingSecs: 25 * 60,
  totalSecs: 25 * 60,
  running: false,
  sessionCount: 0,
  currentTaskId: null,

  syncFromBackend: async () => {
    const status = await invoke<TimerStatus>('get_timer_status');
    set({
      phase: status.phase,
      remainingSecs: status.remaining_secs,
      totalSecs: status.total_secs,
      running: status.running,
      sessionCount: status.session_count,
      currentTaskId: status.current_task_id,
    });
  },

  setTimerTick: (payload) =>
    set({
      phase: payload.phase,
      remainingSecs: payload.remaining_secs,
      totalSecs: payload.total_secs,
      sessionCount: payload.session_count,
      currentTaskId: payload.current_task_id,
    }),

  setRunning: (running) => set({ running }),
  setCurrentTaskId: (currentTaskId) => set({ currentTaskId }),
}));