feat(worker): server-authoritative Stopwatch screen with active-session recovery

This commit is contained in:
Bas van Rossem
2026-06-17 16:24:56 +02:00
parent 1ecad6bbb4
commit 5af5a9c2bb
5 changed files with 625 additions and 0 deletions

View File

@@ -0,0 +1,46 @@
import { useMutation, useQuery, useQueryClient } from '@tanstack/react-query';
import type { StartSessionInput, WorkSession } from '@solelog/shared';
import { apiFetch } from '../lib/api';
export function useActiveSessions() {
return useQuery({
queryKey: ['sessions', 'active'],
queryFn: () => apiFetch<WorkSession[]>('/api/sessions/active'),
});
}
export function useStartSession() {
const queryClient = useQueryClient();
return useMutation({
mutationFn: (input: StartSessionInput) =>
apiFetch<WorkSession>('/api/sessions/start', {
method: 'POST',
body: JSON.stringify(input),
}),
onSuccess: () => {
queryClient.invalidateQueries({ queryKey: ['sessions'] });
},
});
}
export function useStopSession() {
const queryClient = useQueryClient();
return useMutation({
mutationFn: (id: number) =>
apiFetch<WorkSession>(`/api/sessions/${id}/stop`, { method: 'POST' }),
onSuccess: () => {
queryClient.invalidateQueries({ queryKey: ['sessions'] });
},
});
}
export function useDiscardSession() {
const queryClient = useQueryClient();
return useMutation({
mutationFn: (id: number) =>
apiFetch<WorkSession>(`/api/sessions/${id}/discard`, { method: 'POST' }),
onSuccess: () => {
queryClient.invalidateQueries({ queryKey: ['sessions'] });
},
});
}