diff --git a/frontend/src/queries/classes.ts b/frontend/src/queries/classes.ts index 00eb3bf9..6aca5e7f 100644 --- a/frontend/src/queries/classes.ts +++ b/frontend/src/queries/classes.ts @@ -1,6 +1,7 @@ import { ClassController, type ClassesResponse, type ClassResponse } from "@/controllers/classes"; import type { StudentsResponse } from "@/controllers/students"; -import { useQuery, type UseQueryReturnType } from "@tanstack/vue-query"; +import type { ClassDTO } from "@dwengo-1/common/interfaces/class"; +import { QueryClient, useMutation, useQuery, useQueryClient, type UseMutationReturnType, type UseQueryReturnType } from "@tanstack/vue-query"; import { computed, toValue, type MaybeRefOrGetter } from "vue"; const classController = new ClassController(); @@ -24,6 +25,15 @@ function classAssignmentsKey(classid: string) { return ["class-assignments", classid]; } +async function invalidateAll(classid: string, queryClient: QueryClient): Promise { + await queryClient.invalidateQueries({ queryKey: ["classes"] }); + await queryClient.invalidateQueries({ queryKey: classQueryKey(classid) }); + await queryClient.invalidateQueries({ queryKey: classStudentsKey(classid) }); + await queryClient.invalidateQueries({ queryKey: classTeachersKey(classid) }); + await queryClient.invalidateQueries({ queryKey: classAssignmentsKey(classid) }); + await queryClient.invalidateQueries({ queryKey: classTeacherInvitationsKey(classid) }); +} + export function useClassesQuery(full: MaybeRefOrGetter = true): UseQueryReturnType { return useQuery({ queryKey: computed(() => (classesQueryKey())), @@ -41,6 +51,39 @@ export function useClassQuery( }); } +export function useCreateClassMutation(): UseMutationReturnType { + const queryClient = useQueryClient(); + + return useMutation({ + mutationFn: async (data) => classController.createClass(data), + onSuccess: async () => { + await queryClient.invalidateQueries({ queryKey: ["classes"] }); + }, + }); +} + +export function useDeleteClassMutation(): UseMutationReturnType { + const queryClient = useQueryClient(); + + return useMutation({ + mutationFn: async (id) => classController.deleteClass(id), + onSuccess: async (data) => { + await invalidateAll(data.class.id, queryClient); + }, + }); +} + +export function useUpdateClassMutation(): UseMutationReturnType { + const queryClient = useQueryClient(); + + return useMutation({ + mutationFn: async (data) => classController.updateClass(data.id, data), + onSuccess: async (data) => { + await invalidateAll(data.class.id, queryClient); + }, + }); +} + export function useClassStudentsQuery( id: MaybeRefOrGetter, full: MaybeRefOrGetter = true