Files
solelog/apps/admin/src/api/admin-sessions.ts

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'] });
},
});
}