diff --git a/nextjs/src/hooks/hookHydration.ts b/nextjs/src/hooks/hookHydration.ts index 1efd60d..80dab10 100644 --- a/nextjs/src/hooks/hookHydration.ts +++ b/nextjs/src/hooks/hookHydration.ts @@ -124,7 +124,11 @@ const hydrateModuleData = async ( queryClient: QueryClient ) => { await queryClient.prefetchQuery({ - queryKey: localCourseKeys.allAssignments(courseName, moduleName), + queryKey: localCourseKeys.allItemsOfType( + courseName, + moduleName, + "Assignment" + ), queryFn: () => assignments, }); await queryClient.prefetchQuery({ @@ -139,10 +143,11 @@ const hydrateModuleData = async ( assignments.map( async (assignment) => await queryClient.prefetchQuery({ - queryKey: localCourseKeys.assignment( + queryKey: localCourseKeys.itemOfType( courseName, moduleName, - assignment.name + assignment.name, + "Assignment" ), queryFn: () => assignment, }) diff --git a/nextjs/src/hooks/localCourse/assignmentHooks.ts b/nextjs/src/hooks/localCourse/assignmentHooks.ts index 4f2cbfc..1c650ce 100644 --- a/nextjs/src/hooks/localCourse/assignmentHooks.ts +++ b/nextjs/src/hooks/localCourse/assignmentHooks.ts @@ -15,7 +15,7 @@ export const getAllAssignmentsQueryConfig = ( courseName: string, moduleName: string ) => ({ - queryKey: localCourseKeys.allAssignments(courseName, moduleName), + queryKey: localCourseKeys.allItemsOfType(courseName, moduleName, "Assignment"), queryFn: async (): Promise => { const url = "/api/courses/" + @@ -39,10 +39,11 @@ export const getAssignmentQueryConfig = ( assignmentName: string ) => { return { - queryKey: localCourseKeys.assignment( + queryKey: localCourseKeys.itemOfType( courseName, moduleName, - assignmentName + assignmentName, + "Assignment" ), queryFn: async () => { const url = @@ -105,22 +106,29 @@ export const useUpdateAssignmentMutation = () => { previousModuleName !== moduleName ) { queryClient.removeQueries({ - queryKey: localCourseKeys.assignment( + queryKey: localCourseKeys.itemOfType( courseName, previousModuleName, - previousAssignmentName + previousAssignmentName, + "Assignment" ), }); queryClient.removeQueries({ - queryKey: localCourseKeys.allAssignments( + queryKey: localCourseKeys.allItemsOfType( courseName, - previousModuleName + previousModuleName, + "Assignment" ), }); } queryClient.setQueryData( - localCourseKeys.assignment(courseName, moduleName, assignmentName), + localCourseKeys.itemOfType( + courseName, + moduleName, + assignmentName, + "Assignment" + ), assignment ); const url = @@ -138,13 +146,14 @@ export const useUpdateAssignmentMutation = () => { }, onSuccess: async (_, { moduleName, assignmentName }) => { await queryClient.invalidateQueries({ - queryKey: localCourseKeys.allAssignments(courseName, moduleName), + queryKey: localCourseKeys.allItemsOfType(courseName, moduleName, "Assignment"), }); await queryClient.invalidateQueries({ - queryKey: localCourseKeys.assignment( + queryKey: localCourseKeys.itemOfType( courseName, moduleName, - assignmentName + assignmentName, + "Assignment" ), }); }, @@ -165,7 +174,12 @@ export const useCreateAssignmentMutation = () => { assignmentName: string; }) => { queryClient.setQueryData( - localCourseKeys.assignment(courseName, moduleName, assignmentName), + localCourseKeys.itemOfType( + courseName, + moduleName, + assignmentName, + "Assignment" + ), assignment ); const url = @@ -179,13 +193,14 @@ export const useCreateAssignmentMutation = () => { }, onSuccess: async (_, { moduleName, assignmentName }) => { await queryClient.invalidateQueries({ - queryKey: localCourseKeys.allAssignments(courseName, moduleName), + queryKey: localCourseKeys.allItemsOfType(courseName, moduleName, "Assignment"), }); await queryClient.invalidateQueries({ - queryKey: localCourseKeys.assignment( + queryKey: localCourseKeys.itemOfType( courseName, moduleName, - assignmentName + assignmentName, + "Assignment" ), }); }, @@ -204,14 +219,15 @@ export const useDeleteAssignmentMutation = () => { assignmentName: string; }) => { queryClient.removeQueries({ - queryKey: localCourseKeys.assignment( + queryKey: localCourseKeys.itemOfType( courseName, moduleName, - assignmentName + assignmentName, + "Assignment" ), }); queryClient.removeQueries({ - queryKey: localCourseKeys.allAssignments(courseName, moduleName), + queryKey: localCourseKeys.allItemsOfType(courseName, moduleName, "Assignment"), }); const url = "/api/courses/" + @@ -224,7 +240,7 @@ export const useDeleteAssignmentMutation = () => { }, onSuccess: async (_, { moduleName, assignmentName }) => { queryClient.invalidateQueries({ - queryKey: localCourseKeys.allAssignments(courseName, moduleName), + queryKey: localCourseKeys.allItemsOfType(courseName, moduleName, "Assignment"), }); }, }); diff --git a/nextjs/src/hooks/localCourse/localCourseKeys.ts b/nextjs/src/hooks/localCourse/localCourseKeys.ts index 1d1412c..7c05753 100644 --- a/nextjs/src/hooks/localCourse/localCourseKeys.ts +++ b/nextjs/src/hooks/localCourse/localCourseKeys.ts @@ -1,3 +1,5 @@ +import { CourseItemType, typeToFolder } from "@/models/local/courseItemTypes"; + export const localCourseKeys = { allCoursesSettings: ["all courses settings"] as const, allCoursesNames: ["all courses names"] as const, @@ -10,14 +12,32 @@ export const localCourseKeys = { "modules", { type: "names" } as const, ] as const, - allAssignments: (courseName: string, moduleName: string) => + allItemsOfType: ( + courseName: string, + moduleName: string, + type: CourseItemType + ) => [ "course details", courseName, "modules", moduleName, - "assignments", - { type: "all assignments" }, + typeToFolder[type], + { type: "all" }, + ] as const, + itemOfType: ( + courseName: string, + moduleName: string, + name: string, + type: CourseItemType + ) => + [ + "course details", + courseName, + "modules", + moduleName, + typeToFolder[type], + name, ] as const, allQuizzes: (courseName: string, moduleName: string) => [ @@ -26,7 +46,7 @@ export const localCourseKeys = { "modules", moduleName, "quizzes", - { type: "all quizzes" }, + { type: "all" }, ] as const, allPages: (courseName: string, moduleName: string) => [ @@ -35,20 +55,7 @@ export const localCourseKeys = { "modules", moduleName, "pages", - { type: "all pages" }, - ] as const, - assignment: ( - courseName: string, - moduleName: string, - assignmentName: string - ) => - [ - "course details", - courseName, - "modules", - moduleName, - "assignments", - assignmentName, + { type: "all" }, ] as const, quiz: (courseName: string, moduleName: string, quizName: string) => [ diff --git a/nextjs/src/models/local/courseItemTypes.ts b/nextjs/src/models/local/courseItemTypes.ts new file mode 100644 index 0000000..57adec2 --- /dev/null +++ b/nextjs/src/models/local/courseItemTypes.ts @@ -0,0 +1,17 @@ +import { LocalAssignment } from "./assignment/localAssignment"; +import { LocalCoursePage } from "./page/localCoursePage"; +import { LocalQuiz } from "./quiz/localQuiz"; + +export type CourseItemType = "Assignment" | "Quiz" | "Page"; +export type CourseItemReturnType = T extends "Assignment" + ? LocalAssignment + : T extends "Quiz" + ? LocalQuiz + : LocalCoursePage; + + +export const typeToFolder = { + Assignment: "assignments", + Quiz: "quizzes", + Page: "pages", +} as const; diff --git a/nextjs/src/services/fileStorage/courseItemFileStorageService.ts b/nextjs/src/services/fileStorage/courseItemFileStorageService.ts index 04a423e..53de5fa 100644 --- a/nextjs/src/services/fileStorage/courseItemFileStorageService.ts +++ b/nextjs/src/services/fileStorage/courseItemFileStorageService.ts @@ -15,14 +15,11 @@ import { } from "@/models/local/page/localCoursePage"; import { assignmentMarkdownSerializer } from "@/models/local/assignment/utils/assignmentMarkdownSerializer"; import { quizMarkdownUtils } from "@/models/local/quiz/utils/quizMarkdownUtils"; - -const typeToFolder = { - Assignment: "assignments", - Quiz: "quizzes", - Page: "pages", -} as const; - -export type CourseItemType = "Assignment" | "Quiz" | "Page"; +import { + CourseItemReturnType, + CourseItemType, + typeToFolder, +} from "@/models/local/courseItemTypes"; const getItemFileNames = async ( courseName: string, @@ -41,11 +38,6 @@ const getItemFileNames = async ( const itemFiles = await fs.readdir(filePath); return itemFiles.map((f) => f.replace(/\.md$/, "")); }; -type CourseItemReturnType = T extends "Assignment" - ? LocalAssignment - : T extends "Quiz" - ? LocalQuiz - : LocalCoursePage; const getItem = async ( courseName: string, @@ -129,7 +121,8 @@ export const courseItemFileStorageService = { const markdownDictionary: { [key in CourseItemType]: () => string; } = { - Assignment: () => assignmentMarkdownSerializer.toMarkdown(item as LocalAssignment), + Assignment: () => + assignmentMarkdownSerializer.toMarkdown(item as LocalAssignment), Quiz: () => quizMarkdownUtils.toMarkdown(item as LocalQuiz), Page: () => localPageMarkdownUtils.toMarkdown(item as LocalCoursePage), };