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

3
import {
4
  apiClient,
5
  CareAction,
6
  CareActionType,
7
  CreateCareActionPayload,
8
} from "@/lib/api";
9

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

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

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

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

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

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

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

52
export const useDeleteCareAction = () => {
53
  const queryClient = useQueryClient();
54

55
  return useMutation({
56
    mutationFn: (id: string) => apiClient.deleteCareAction(id),
57

58
    onMutate: async (id) => {
59
      await queryClient.cancelQueries({ queryKey: careActionKeys.lists() });
60
      const previous = queryClient.getQueryData(careActionKeys.list());
61

62
      queryClient.setQueryData(
63
        careActionKeys.list(),
64
        (old: { entries: CareAction[] } | undefined) =>
65
          old ? { ...old, entries: old.entries.filter((e) => e.id !== Number(id)) } : old,
66
      );
67

68
      return { previous };
69
    },
70

71
    onError: (_err, _id, context) => {
72
      if (context?.previous) {
73
        queryClient.setQueryData(careActionKeys.list(), context.previous);
74
      }
75
    },
76

77
    onSuccess: () => {
78
      queryClient.invalidateQueries({ queryKey: careActionKeys.lists() });
79
    },
80
  });
81
};