eletrotupi / tcc/ frontend/hooks/useCareAction.queries.ts9dde95c75095e8197b8df86fb0b1c0717b105ea1
2.6 KB | 96 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

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

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

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

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

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

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

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

53
export const usePatchCareAction = () => {
54
  const queryClient = useQueryClient();
55

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

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

67
export const useDeleteCareAction = () => {
68
  const queryClient = useQueryClient();
69

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

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

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

83
      return { previous };
84
    },
85

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

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