File size: 2,016 Bytes
e310cf5
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
import { useQuery, useMutation, useQueryClient } from "@tanstack/react-query";
import {
  getRooms,
  getInstructors,
  getStudents,
  getClasses,
  createClass,
  updateClass,
  deleteClass,
} from "./client";
import type { ClassFormData } from "@/types";

export const queryKeys = {
  rooms: ["rooms"] as const,
  instructors: ["instructors"] as const,
  students: ["students"] as const,
  classes: (date: string) => ["classes", date] as const,
};

export function useRooms() {
  return useQuery({
    queryKey: queryKeys.rooms,
    queryFn: getRooms,
    staleTime: 1000 * 60 * 5,
  });
}

export function useInstructors() {
  return useQuery({
    queryKey: queryKeys.instructors,
    queryFn: getInstructors,
    staleTime: 1000 * 60 * 5,
  });
}

export function useStudents() {
  return useQuery({
    queryKey: queryKeys.students,
    queryFn: getStudents,
    staleTime: 1000 * 60 * 5,
  });
}

export function useClasses(date: string) {
  return useQuery({
    queryKey: queryKeys.classes(date),
    queryFn: () => getClasses(date),
  });
}

export function useCreateClass() {
  const queryClient = useQueryClient();

  return useMutation({
    mutationFn: (data: ClassFormData) => createClass(data),
    onSuccess: (_, variables) => {
      queryClient.invalidateQueries({
        queryKey: queryKeys.classes(variables.date),
      });
    },
  });
}

export function useUpdateClass() {
  const queryClient = useQueryClient();

  return useMutation({
    mutationFn: ({ id, data }: { id: number; data: ClassFormData }) =>
      updateClass(id, data),
    onSuccess: (_, variables) => {
      queryClient.invalidateQueries({
        queryKey: queryKeys.classes(variables.data.date),
      });
    },
  });
}

export function useDeleteClass() {
  const queryClient = useQueryClient();

  return useMutation({
    mutationFn: (id: number) => deleteClass(id),
    onSuccess: () => {
      queryClient.invalidateQueries({
        predicate: (query) => query.queryKey[0] === "classes",
      });
    },
  });
}