/
dupleymi-amp
/
sql-trainer
Обзор
Документация
Войти
/
dupleymi-amp
/
sql-trainer
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
Аналитика
Безопасность
main
src/lib/store/timer-slice.ts
103 строки
2 KB
Maxim Dupley
refactor: extract MS_PER_DAY constant, fix store duplication, improve a11y
17 июл 2026, 13:31
17 июл 2026, 13:31
7ca17ed
Код
Авторство
О чём код?
import { StateCreator } from 'zustand'; import type { TimerSlice } from './timer-slice-types'; export type { TimerSlice }; const DEFAULT_TIMER_DURATION = 15 * 60; // 15 minutes in seconds const WARNING_THRESHOLD = 60; // 1 minute in seconds export const createTimerSlice: StateCreator<TimerSlice, [], [], TimerSlice> = (set, get) => ({ timer: { isActive: false, timeRemaining: DEFAULT_TIMER_DURATION, totalDuration: DEFAULT_TIMER_DURATION, isPaused: false, }, timerSettings: { defaultDuration: DEFAULT_TIMER_DURATION, warningThreshold: WARNING_THRESHOLD, }, startTimer: (durationInSeconds?: number) => { const duration = durationInSeconds || get().timerSettings.defaultDuration; set({ timer: { isActive: true, timeRemaining: duration, totalDuration: duration, isPaused: false, }, }); }, pauseTimer: () => { set((state) => ({ timer: { ...state.timer, isPaused: true, }, })); }, resumeTimer: () => { set((state) => ({ timer: { ...state.timer, isPaused: false, }, })); }, stopTimer: () => { set({ timer: { isActive: false, timeRemaining: get().timerSettings.defaultDuration, totalDuration: get().timerSettings.defaultDuration, isPaused: false, }, }); }, tickTimer: () => { const { timer } = get(); if (!timer.isActive || timer.isPaused || timer.timeRemaining <= 0) return; set({ timer: { ...timer, timeRemaining: Math.max(0, timer.timeRemaining - 1), }, }); }, setTimeRemaining: (timeRemaining: number) => { set((state) => ({ timer: { ...state.timer, timeRemaining: Math.max(0, Math.min(timeRemaining, state.timerSettings.defaultDuration)), }, })); }, setTimerSettings: (settings: Partial<TimerSlice['timerSettings']>) => { set((state) => ({ timerSettings: { ...state.timerSettings, ...settings, }, })); }, getFormattedTime: () => { const { timeRemaining } = get().timer; const minutes = Math.floor(timeRemaining / 60); const seconds = timeRemaining % 60; return `${minutes.toString().padStart(2, '0')}:${seconds.toString().padStart(2, '0')}`; }, isTimeWarning: () => { const { timeRemaining } = get().timer; return timeRemaining <= get().timerSettings.warningThreshold; }, });