eletrotupi / tcc/ frontend/hooks/useMedicineRegimen.queries.tsc901c35af9c84b6a29e5185545ced1129f33b8f4
3.8 KB | 126 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
import { medicineTodayKeys } from "@/hooks/useMedicineToday.queries";
10

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

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

25
export const useMedicineRegimen = (id: string) => {
26
  return useQuery({
27
    queryKey: medicineRegimenKeys.detail(id),
28
    queryFn: () => apiClient.getMedicineRegimen(id),
29
    enabled: !!id,
30
  });
31
};
32

33
export const useCreateMedicineRegimen = () => {
34
  const queryClient = useQueryClient();
35

36
  return useMutation({
37
    mutationFn: (payload: CreateMedicineRegimenPayload) =>
38
      apiClient.createMedicineRegimen(payload),
39

40
    onSuccess: () => {
41
      queryClient.invalidateQueries({ queryKey: medicineRegimenKeys.lists() });
42
    },
43
  });
44
};
45

46
export const useUpdateMedicineRegimen = () => {
47
  const queryClient = useQueryClient();
48

49
  return useMutation({
50
    mutationFn: ({ id, payload }: { id: string; payload: UpdateMedicineRegimenPayload }) =>
51
      apiClient.updateMedicineRegimen(id, payload),
52

53
    onMutate: async ({ id, payload }) => {
54
      await queryClient.cancelQueries({ queryKey: medicineRegimenKeys.detail(id) });
55
      await queryClient.cancelQueries({ queryKey: medicineRegimenKeys.lists() });
56

57
      const previousDetail = queryClient.getQueryData(medicineRegimenKeys.detail(id));
58

59
      if (previousDetail) {
60
        queryClient.setQueryData(
61
          medicineRegimenKeys.detail(id),
62
          (old: MedicineRegimen) => ({ ...old, ...payload }),
63
        );
64
      }
65

66
      return { previousDetail };
67
    },
68

69
    onError: (_err, { id }, context) => {
70
      if (context?.previousDetail) {
71
        queryClient.setQueryData(medicineRegimenKeys.detail(id), context.previousDetail);
72
      }
73
    },
74

75
    onSuccess: (_data, { id }) => {
76
      queryClient.invalidateQueries({ queryKey: medicineRegimenKeys.detail(id) });
77
      queryClient.invalidateQueries({ queryKey: medicineRegimenKeys.lists() });
78
      queryClient.invalidateQueries({ queryKey: medicineTodayKeys.list() });
79
    },
80
  });
81
};
82

83
export const useToggleMedicineRegimen = () => {
84
  const queryClient = useQueryClient();
85

86
  return useMutation({
87
    mutationFn: ({ id, active }: { id: string; active: boolean }) =>
88
      apiClient.toggleMedicineRegimen(id, active),
89

90
    onSuccess: () => {
91
      queryClient.invalidateQueries({ queryKey: medicineRegimenKeys.lists() });
92
      queryClient.invalidateQueries({ queryKey: medicineTodayKeys.list() });
93
    },
94
  });
95
};
96

97
export const useDeleteMedicineRegimen = () => {
98
  const queryClient = useQueryClient();
99

100
  return useMutation({
101
    mutationFn: (id: string) => apiClient.deleteMedicineRegimen(id),
102

103
    onMutate: async (id) => {
104
      await queryClient.cancelQueries({ queryKey: medicineRegimenKeys.lists() });
105
      const previous = queryClient.getQueryData(medicineRegimenKeys.list());
106

107
      queryClient.setQueryData(
108
        medicineRegimenKeys.list(),
109
        (old: { regimens: MedicineRegimen[] } | undefined) =>
110
          old ? { ...old, regimens: old.regimens.filter((r) => r.id !== Number(id)) } : old,
111
      );
112

113
      return { previous };
114
    },
115

116
    onError: (_err, _id, context) => {
117
      if (context?.previous) {
118
        queryClient.setQueryData(medicineRegimenKeys.list(), context.previous);
119
      }
120
    },
121

122
    onSuccess: () => {
123
      queryClient.invalidateQueries({ queryKey: medicineRegimenKeys.lists() });
124
    },
125
  });
126
};