Taiga integration

This commit is contained in:
2026-06-09 12:47:13 +03:00
parent c8599b3d13
commit 1f83dcb574
30 changed files with 1543 additions and 115 deletions
+54
View File
@@ -0,0 +1,54 @@
import {
createContext,
ReactNode,
useCallback,
useContext,
useEffect,
useState,
} from "react";
import { api, PomodoroStatus } from "../api/client";
interface PomodoroContextValue {
status: PomodoroStatus | null;
error: string | null;
refresh: () => Promise<void>;
}
const PomodoroContext = createContext<PomodoroContextValue | null>(null);
export function PomodoroProvider({ children }: { children: ReactNode }) {
const [status, setStatus] = useState<PomodoroStatus | null>(null);
const [error, setError] = useState<string | null>(null);
const refresh = useCallback(async () => {
try {
const data = await api.pomodoroStatus();
setStatus(data);
setError(null);
} catch (err) {
setError(err instanceof Error ? err.message : "Ошибка загрузки таймера");
}
}, []);
useEffect(() => {
refresh().catch(console.error);
const timer = setInterval(() => {
refresh().catch(console.error);
}, 1000);
return () => clearInterval(timer);
}, [refresh]);
return (
<PomodoroContext.Provider value={{ status, error, refresh }}>
{children}
</PomodoroContext.Provider>
);
}
export function usePomodoro() {
const ctx = useContext(PomodoroContext);
if (!ctx) {
throw new Error("usePomodoro must be used within PomodoroProvider");
}
return ctx;
}