Files
canvasManagement/src/hooks/canvas/canvasQuizHooks.ts
2024-12-17 09:19:21 -07:00

92 lines
2.5 KiB
TypeScript

import {
useMutation,
useQuery,
useQueryClient,
} from "@tanstack/react-query";
import { useLocalCourseSettingsQuery } from "../localCourse/localCoursesHooks";
import { canvasQuizService } from "@/services/canvas/canvasQuizService";
import { LocalQuiz } from "@/models/local/quiz/localQuiz";
import {
useAddCanvasModuleMutation,
useCanvasModulesQuery,
} from "./canvasModuleHooks";
import { canvasModuleService } from "@/services/canvas/canvasModuleService";
export const canvasQuizKeys = {
quizzes: (canvasCourseId: number) =>
["canvas", canvasCourseId, "quizzes"] as const,
};
export const useCanvasQuizzesQuery = () => {
const [settings] = useLocalCourseSettingsQuery();
return useQuery({
queryKey: canvasQuizKeys.quizzes(settings.canvasId),
queryFn: async () => canvasQuizService.getAll(settings.canvasId),
});
};
export const useAddQuizToCanvasMutation = () => {
const [settings] = useLocalCourseSettingsQuery();
const queryClient = useQueryClient();
const { data: canvasModules } = useCanvasModulesQuery();
const addModule = useAddCanvasModuleMutation();
return useMutation({
mutationFn: async ({
quiz,
moduleName,
}: {
quiz: LocalQuiz;
moduleName: string;
}) => {
if (!canvasModules) {
console.log("cannot add quiz until modules loaded");
return;
}
const assignmentGroup = settings.assignmentGroups.find(
(g) => g.name === quiz.localAssignmentGroupName
);
const canvasQuizId = await canvasQuizService.create(
settings.canvasId,
quiz,
settings,
assignmentGroup?.canvasId
);
const canvasModule = canvasModules.find((c) => c.name === moduleName);
const moduleId = canvasModule
? canvasModule.id
: await addModule.mutateAsync(moduleName);
await canvasModuleService.createModuleItem(
settings.canvasId,
moduleId,
quiz.name,
"Quiz",
canvasQuizId
);
},
onSuccess: () => {
queryClient.invalidateQueries({
queryKey: canvasQuizKeys.quizzes(settings.canvasId),
});
},
});
};
export const useDeleteQuizFromCanvasMutation = () => {
const [settings] = useLocalCourseSettingsQuery();
const queryClient = useQueryClient();
return useMutation({
mutationFn: async (canvasQuizId: number) => {
await canvasQuizService.delete(settings.canvasId, canvasQuizId);
},
onSuccess: () => {
queryClient.invalidateQueries({
queryKey: canvasQuizKeys.quizzes(settings.canvasId),
});
},
});
};