eletrotupi / tcc/ frontend/hooks/useCareAction.queries.ts95b0a7d7b379540440909110b748904954048374
2.7 KB | 98 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

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

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

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

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

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

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

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

55
export const usePatchCareAction = () => {
56
  const queryClient = useQueryClient();
57

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

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

69
export const useDeleteCareAction = () => {
70
  const queryClient = useQueryClient();
71

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

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

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

85
      return { previous };
86
    },
87

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

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