import { useQuery, useMutation, useQueryClient } from "@tanstack/react-query"; import { apiClient, SleepRecord, SleepRecordPayload } from "@/lib/api"; export const sleepRecordKeys = { all: () => ["sleep-records"] as const, lists: () => [...sleepRecordKeys.all(), "list"] as const, list: (filters?: SleepRecordFilters) => [...sleepRecordKeys.lists(), filters] as const, detail: (id: string) => [...sleepRecordKeys.all(), "detail", id] as const, }; interface SleepRecordFilters { from?: string; // ISO date to?: string; // ISO date limit?: number; } export const useSleepRecords = (filters?: SleepRecordFilters) => { return useQuery({ queryKey: sleepRecordKeys.list(filters), queryFn: () => apiClient.getSleepRecords(filters), }); }; export const useCreateSleepRecord = () => { const queryClient = useQueryClient(); return useMutation({ mutationFn: (payload: SleepRecordPayload) => apiClient.createSleepRecord(payload), onMutate: async (payload) => { await queryClient.cancelQueries({ queryKey: sleepRecordKeys.lists() }); const previous = queryClient.getQueryData(sleepRecordKeys.list()); // TODO: might as well create a shared attrs that we're keeping it queryClient.setQueryData( sleepRecordKeys.list(), (old: SleepRecord[] = []) => [ { ...payload, id: `temp-${Date.now()}`, createdAt: new Date().toISOString(), _optimistic: true, }, ...old, ], ); return { previous }; }, onError: (_err, _payload, context) => { if (context?.previous) { queryClient.setQueryData(sleepRecordKeys.list(), context.previous); } }, onSuccess: () => { queryClient.invalidateQueries({ queryKey: sleepRecordKeys.lists() }); }, }); };