"use client"; import { LocalQuiz } from "@/models/local/quiz/localQuiz"; import { useMutation, useQueryClient, useSuspenseQueries, useSuspenseQuery, } from "@tanstack/react-query"; import { localCourseKeys } from "./localCourseKeys"; import { useCourseContext } from "@/app/course/[courseName]/context/courseContext"; import { axiosClient } from "@/services/axiosUtils"; export function getQuizNamesQueryConfig(courseName: string, moduleName: string) { return { queryKey: localCourseKeys.quizNames(courseName, moduleName), queryFn: async (): Promise => { const url = "/api/courses/" + encodeURIComponent(courseName) + "/modules/" + encodeURIComponent(moduleName) + "/quizzes"; const response = await axiosClient.get(url); return response.data; }, }; } export const useQuizNamesQuery = (moduleName: string) => { const { courseName } = useCourseContext(); return useSuspenseQuery(getQuizNamesQueryConfig(courseName, moduleName)); }; export const useQuizQuery = (moduleName: string, quizName: string) => { const { courseName } = useCourseContext(); return useSuspenseQuery(getQuizQueryConfig(courseName, moduleName, quizName)); }; export const useQuizzesQueries = (moduleName: string, quizNames: string[]) => { const { courseName } = useCourseContext(); return useSuspenseQueries({ queries: quizNames.map((name) => getQuizQueryConfig(courseName, moduleName, name) ), combine: (results) => ({ data: results.map((r) => r.data), pending: results.some((r) => r.isPending), }), }); }; export function getQuizQueryConfig( courseName: string, moduleName: string, quizName: string ) { return { queryKey: localCourseKeys.quiz(courseName, moduleName, quizName), queryFn: async (): Promise => { const url = "/api/courses/" + encodeURIComponent(courseName) + "/modules/" + encodeURIComponent(moduleName) + "/quizzes/" + encodeURIComponent(quizName); const response = await axiosClient.get(url); return response.data; }, }; } export const useUpdateQuizMutation = () => { const { courseName } = useCourseContext(); const queryClient = useQueryClient(); return useMutation({ mutationFn: async ({ quiz, moduleName, quizName, }: { quiz: LocalQuiz; moduleName: string; quizName: string; }) => { queryClient.setQueryData( localCourseKeys.quiz(courseName, moduleName, quizName), quiz ); const url = "/api/courses/" + encodeURIComponent(courseName) + "/modules/" + encodeURIComponent(moduleName) + "/quizzes/" + encodeURIComponent(quizName); await axiosClient.put(url, quiz); }, onSuccess: (_, { moduleName, quizName }) => { queryClient.invalidateQueries({ queryKey: localCourseKeys.quiz(courseName, moduleName, quizName), }); queryClient.invalidateQueries({ queryKey: localCourseKeys.quizNames(courseName, moduleName), }); }, }); }; export const useCreateQuizMutation = () => { const { courseName } = useCourseContext(); const queryClient = useQueryClient(); return useMutation({ mutationFn: async ({ quiz, moduleName, quizName, }: { quiz: LocalQuiz; moduleName: string; quizName: string; }) => { queryClient.setQueryData( localCourseKeys.quiz(courseName, moduleName, quizName), quiz ); const url = "/api/courses/" + encodeURIComponent(courseName) + "/modules/" + encodeURIComponent(moduleName) + "/quizzes/" + encodeURIComponent(quizName); await axiosClient.post(url, quiz); }, onSuccess: (_, { moduleName, quizName }) => { queryClient.invalidateQueries({ queryKey: localCourseKeys.quiz(courseName, moduleName, quizName), }); queryClient.invalidateQueries({ queryKey: localCourseKeys.quizNames(courseName, moduleName), }); }, }); };