84 lines
2.5 KiB
TypeScript
84 lines
2.5 KiB
TypeScript
import { useMutation, useQuery, useQueryClient } from '@tanstack/react-query';
|
|
import type {
|
|
AdminUpdateSessionInput,
|
|
CreateManualSessionInput,
|
|
WorkSession,
|
|
} from '@solelog/shared';
|
|
import { apiFetch } from '../lib/api';
|
|
|
|
// Active work sessions across all workers (admin cross-user view).
|
|
// Polls every 5s so the Live view reflects who is working without a manual refresh.
|
|
export function useActiveSessions() {
|
|
return useQuery({
|
|
queryKey: ['admin', 'sessions', 'active'],
|
|
queryFn: () => apiFetch<WorkSession[]>('/api/admin/sessions/active'),
|
|
refetchInterval: 5000,
|
|
});
|
|
}
|
|
|
|
// Every session (newest first) for the Sessies management screen.
|
|
export function useAllSessions() {
|
|
return useQuery({
|
|
queryKey: ['admin', 'sessions', 'all'],
|
|
queryFn: () => apiFetch<WorkSession[]>('/api/admin/sessions'),
|
|
});
|
|
}
|
|
|
|
// Roster for the create-form worker picker.
|
|
export function useAdminUsers() {
|
|
return useQuery({
|
|
queryKey: ['admin', 'users'],
|
|
queryFn: () => apiFetch<{ id: string; name: string; email: string }[]>('/api/admin/users'),
|
|
});
|
|
}
|
|
|
|
export function useCreateManualSession() {
|
|
const queryClient = useQueryClient();
|
|
return useMutation({
|
|
mutationFn: (input: CreateManualSessionInput) =>
|
|
apiFetch<WorkSession>('/api/admin/sessions', {
|
|
method: 'POST',
|
|
body: JSON.stringify(input),
|
|
}),
|
|
onSuccess: () => {
|
|
queryClient.invalidateQueries({ queryKey: ['admin', 'sessions'] });
|
|
},
|
|
});
|
|
}
|
|
|
|
export function useUpdateSession() {
|
|
const queryClient = useQueryClient();
|
|
return useMutation({
|
|
mutationFn: ({ id, input }: { id: number; input: AdminUpdateSessionInput }) =>
|
|
apiFetch<WorkSession>(`/api/admin/sessions/${id}`, {
|
|
method: 'PUT',
|
|
body: JSON.stringify(input),
|
|
}),
|
|
onSuccess: () => {
|
|
queryClient.invalidateQueries({ queryKey: ['admin', 'sessions'] });
|
|
},
|
|
});
|
|
}
|
|
|
|
export function useAdminStopSession() {
|
|
const queryClient = useQueryClient();
|
|
return useMutation({
|
|
mutationFn: (id: number) =>
|
|
apiFetch<WorkSession>(`/api/admin/sessions/${id}/stop`, { method: 'POST' }),
|
|
onSuccess: () => {
|
|
queryClient.invalidateQueries({ queryKey: ['admin', 'sessions'] });
|
|
},
|
|
});
|
|
}
|
|
|
|
export function useAdminDiscardSession() {
|
|
const queryClient = useQueryClient();
|
|
return useMutation({
|
|
mutationFn: (id: number) =>
|
|
apiFetch<WorkSession>(`/api/admin/sessions/${id}/discard`, { method: 'POST' }),
|
|
onSuccess: () => {
|
|
queryClient.invalidateQueries({ queryKey: ['admin', 'sessions'] });
|
|
},
|
|
});
|
|
}
|