eletrotupi / tcc/ frontend/hooks/useCareAction.queries.tsa2ea1352da034bd3377e2a3cbfa4c53a75eba523
2.9 KB | 100 lines Raw
1
import { useQuery, useMutation, useQueryClient } from "@tanstack/react-query";
2

3
import {
4
  apiClient,
5
  CareAction,
6
  CareActionType,
7
  CreateCareActionPayload,
8
  PatchCareActionPayload,
9
} from "@/lib/api";
10
import { medicineTodayKeys } from "@/hooks/useMedicineToday.queries";
11
import { medicineRegimenKeys } from "@/hooks/useMedicineRegimen.queries";
12

13
interface CareActionFilters {
14
  type?: CareActionType;
15
  from?: string;
16
  to?: string;
17
  limit?: number;
18
}
19

20
export const careActionKeys = {
21
  all: () => ["careActions"] as const,
22
  lists: () => [...careActionKeys.all(), "list"] as const,
23
  list: (filters?: CareActionFilters) => [...careActionKeys.lists(), filters] as const,
24
  detail: (id: string) => [...careActionKeys.all(), "detail", id] as const,
25
};
26

27
export const useCareActions = (filters?: CareActionFilters) => {
28
  return useQuery({
29
    queryKey: careActionKeys.list(filters),
30
    queryFn: () => apiClient.getCareActions(filters),
31
  });
32
};
33

34
export const useCareAction = (id: string) => {
35
  return useQuery({
36
    queryKey: careActionKeys.detail(id),
37
    queryFn: () => apiClient.getCareAction(id),
38
    enabled: !!id,
39
  });
40
};
41

42
export const useCreateCareAction = () => {
43
  const queryClient = useQueryClient();
44

45
  return useMutation({
46
    mutationFn: (payload: CreateCareActionPayload) =>
47
      apiClient.createCareAction(payload),
48

49
    onSuccess: () => {
50
      queryClient.invalidateQueries({ queryKey: careActionKeys.lists() });
51
      queryClient.invalidateQueries({ queryKey: medicineTodayKeys.list() });
52
      queryClient.invalidateQueries({ queryKey: medicineRegimenKeys.lists() });
53
    },
54
  });
55
};
56

57
export const usePatchCareAction = () => {
58
  const queryClient = useQueryClient();
59

60
  return useMutation({
61
    mutationFn: ({ id, data }: { id: string; data: PatchCareActionPayload }) =>
62
      apiClient.patchCareAction(id, data),
63

64
    onSuccess: (_result, { id }) => {
65
      queryClient.invalidateQueries({ queryKey: careActionKeys.detail(id) });
66
      queryClient.invalidateQueries({ queryKey: careActionKeys.lists() });
67
    },
68
  });
69
};
70

71
export const useDeleteCareAction = () => {
72
  const queryClient = useQueryClient();
73

74
  return useMutation({
75
    mutationFn: (id: string) => apiClient.deleteCareAction(id),
76

77
    onMutate: async (id) => {
78
      await queryClient.cancelQueries({ queryKey: careActionKeys.lists() });
79
      const previous = queryClient.getQueryData(careActionKeys.list());
80

81
      queryClient.setQueryData(
82
        careActionKeys.list(),
83
        (old: { entries: CareAction[] } | undefined) =>
84
          old ? { ...old, entries: old.entries.filter((e) => e.id !== Number(id)) } : old,
85
      );
86

87
      return { previous };
88
    },
89

90
    onError: (_err, _id, context) => {
91
      if (context?.previous) {
92
        queryClient.setQueryData(careActionKeys.list(), context.previous);
93
      }
94
    },
95

96
    onSuccess: () => {
97
      queryClient.invalidateQueries({ queryKey: careActionKeys.lists() });
98
    },
99
  });
100
};