eletrotupi / tcc/ frontend/hooks/useSleepRecord.queries.ts86679dd1e585488c3744a5531456068a708f0eb1
1.8 KB | 65 lines Raw
1
import { useQuery, useMutation, useQueryClient } from "@tanstack/react-query";
2

3
import { apiClient, SleepRecord, SleepRecordPayload } from "@/lib/api";
4

5
export const sleepRecordKeys = {
6
  all: () => ["sleep-records"] as const,
7
  lists: () => [...sleepRecordKeys.all(), "list"] as const,
8
  list: (filters?: SleepRecordFilters) =>
9
    [...sleepRecordKeys.lists(), filters] as const,
10
  detail: (id: string) => [...sleepRecordKeys.all(), "detail", id] as const,
11
};
12

13
interface SleepRecordFilters {
14
  from?: string; // ISO date
15
  to?: string; // ISO date
16
  limit?: number;
17
}
18

19
export const useSleepRecords = (filters?: SleepRecordFilters) => {
20
  return useQuery({
21
    queryKey: sleepRecordKeys.list(filters),
22
    queryFn: () => apiClient.getSleepRecords(filters),
23
  });
24
};
25

26
export const useCreateSleepRecord = () => {
27
  const queryClient = useQueryClient();
28

29
  return useMutation({
30
    mutationFn: (payload: SleepRecordPayload) =>
31
      apiClient.createSleepRecord(payload),
32

33
    onMutate: async (payload) => {
34
      await queryClient.cancelQueries({ queryKey: sleepRecordKeys.lists() });
35

36
      const previous = queryClient.getQueryData(sleepRecordKeys.list());
37

38
      // TODO: might as well create a shared attrs that we're keeping it
39
      queryClient.setQueryData(
40
        sleepRecordKeys.list(),
41
        (old: SleepRecord[] = []) => [
42
          {
43
            ...payload,
44
            id: `temp-${Date.now()}`,
45
            createdAt: new Date().toISOString(),
46
            _optimistic: true,
47
          },
48
          ...old,
49
        ],
50
      );
51

52
      return { previous };
53
    },
54

55
    onError: (_err, _payload, context) => {
56
      if (context?.previous) {
57
        queryClient.setQueryData(sleepRecordKeys.list(), context.previous);
58
      }
59
    },
60

61
    onSuccess: () => {
62
      queryClient.invalidateQueries({ queryKey: sleepRecordKeys.lists() });
63
    },
64
  });
65
};