eletrotupi / tcc/ frontend/hooks/useMedicineRegimen.queries.ts2ab1b144925b43a39d19edf4dbf40bf863addc7f
3.0 KB | 102 lines Raw
1
import { useQuery, useMutation, useQueryClient } from "@tanstack/react-query";
2

3
import {
4
  apiClient,
5
  MedicineRegimen,
6
  CreateMedicineRegimenPayload,
7
  UpdateMedicineRegimenPayload,
8
} from "@/lib/api";
9

10
export const medicineRegimenKeys = {
11
  all: () => ["medicineRegimens"] as const,
12
  lists: () => [...medicineRegimenKeys.all(), "list"] as const,
13
  list: () => [...medicineRegimenKeys.lists()] as const,
14
  detail: (id: string) => [...medicineRegimenKeys.all(), "detail", id] as const,
15
};
16

17
export const useMedicineRegimens = () => {
18
  return useQuery({
19
    queryKey: medicineRegimenKeys.list(),
20
    queryFn: () => apiClient.getMedicineRegimens(),
21
  });
22
};
23

24
export const useCreateMedicineRegimen = () => {
25
  const queryClient = useQueryClient();
26

27
  return useMutation({
28
    mutationFn: (payload: CreateMedicineRegimenPayload) =>
29
      apiClient.createMedicineRegimen(payload),
30

31
    onSuccess: () => {
32
      queryClient.invalidateQueries({ queryKey: medicineRegimenKeys.lists() });
33
    },
34
  });
35
};
36

37
export const useUpdateMedicineRegimen = () => {
38
  const queryClient = useQueryClient();
39

40
  return useMutation({
41
    mutationFn: ({ id, payload }: { id: string; payload: UpdateMedicineRegimenPayload }) =>
42
      apiClient.updateMedicineRegimen(id, payload),
43

44
    onMutate: async ({ id, payload }) => {
45
      await queryClient.cancelQueries({ queryKey: medicineRegimenKeys.detail(id) });
46
      await queryClient.cancelQueries({ queryKey: medicineRegimenKeys.lists() });
47

48
      const previousDetail = queryClient.getQueryData(medicineRegimenKeys.detail(id));
49

50
      if (previousDetail) {
51
        queryClient.setQueryData(
52
          medicineRegimenKeys.detail(id),
53
          (old: MedicineRegimen) => ({ ...old, ...payload }),
54
        );
55
      }
56

57
      return { previousDetail };
58
    },
59

60
    onError: (_err, { id }, context) => {
61
      if (context?.previousDetail) {
62
        queryClient.setQueryData(medicineRegimenKeys.detail(id), context.previousDetail);
63
      }
64
    },
65

66
    onSuccess: (_data, { id }) => {
67
      queryClient.invalidateQueries({ queryKey: medicineRegimenKeys.detail(id) });
68
      queryClient.invalidateQueries({ queryKey: medicineRegimenKeys.lists() });
69
    },
70
  });
71
};
72

73
export const useDeleteMedicineRegimen = () => {
74
  const queryClient = useQueryClient();
75

76
  return useMutation({
77
    mutationFn: (id: string) => apiClient.deleteMedicineRegimen(id),
78

79
    onMutate: async (id) => {
80
      await queryClient.cancelQueries({ queryKey: medicineRegimenKeys.lists() });
81
      const previous = queryClient.getQueryData(medicineRegimenKeys.list());
82

83
      queryClient.setQueryData(
84
        medicineRegimenKeys.list(),
85
        (old: { regimens: MedicineRegimen[] } | undefined) =>
86
          old ? { ...old, regimens: old.regimens.filter((r) => r.id !== Number(id)) } : old,
87
      );
88

89
      return { previous };
90
    },
91

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

98
    onSuccess: () => {
99
      queryClient.invalidateQueries({ queryKey: medicineRegimenKeys.lists() });
100
    },
101
  });
102
};