consolodating types

This commit is contained in:
2024-09-27 11:13:05 -06:00
parent f990619e05
commit 6539acec76
5 changed files with 92 additions and 54 deletions

View File

@@ -124,7 +124,11 @@ const hydrateModuleData = async (
queryClient: QueryClient queryClient: QueryClient
) => { ) => {
await queryClient.prefetchQuery({ await queryClient.prefetchQuery({
queryKey: localCourseKeys.allAssignments(courseName, moduleName), queryKey: localCourseKeys.allItemsOfType(
courseName,
moduleName,
"Assignment"
),
queryFn: () => assignments, queryFn: () => assignments,
}); });
await queryClient.prefetchQuery({ await queryClient.prefetchQuery({
@@ -139,10 +143,11 @@ const hydrateModuleData = async (
assignments.map( assignments.map(
async (assignment) => async (assignment) =>
await queryClient.prefetchQuery({ await queryClient.prefetchQuery({
queryKey: localCourseKeys.assignment( queryKey: localCourseKeys.itemOfType(
courseName, courseName,
moduleName, moduleName,
assignment.name assignment.name,
"Assignment"
), ),
queryFn: () => assignment, queryFn: () => assignment,
}) })

View File

@@ -15,7 +15,7 @@ export const getAllAssignmentsQueryConfig = (
courseName: string, courseName: string,
moduleName: string moduleName: string
) => ({ ) => ({
queryKey: localCourseKeys.allAssignments(courseName, moduleName), queryKey: localCourseKeys.allItemsOfType(courseName, moduleName, "Assignment"),
queryFn: async (): Promise<LocalAssignment[]> => { queryFn: async (): Promise<LocalAssignment[]> => {
const url = const url =
"/api/courses/" + "/api/courses/" +
@@ -39,10 +39,11 @@ export const getAssignmentQueryConfig = (
assignmentName: string assignmentName: string
) => { ) => {
return { return {
queryKey: localCourseKeys.assignment( queryKey: localCourseKeys.itemOfType(
courseName, courseName,
moduleName, moduleName,
assignmentName assignmentName,
"Assignment"
), ),
queryFn: async () => { queryFn: async () => {
const url = const url =
@@ -105,22 +106,29 @@ export const useUpdateAssignmentMutation = () => {
previousModuleName !== moduleName previousModuleName !== moduleName
) { ) {
queryClient.removeQueries({ queryClient.removeQueries({
queryKey: localCourseKeys.assignment( queryKey: localCourseKeys.itemOfType(
courseName, courseName,
previousModuleName, previousModuleName,
previousAssignmentName previousAssignmentName,
"Assignment"
), ),
}); });
queryClient.removeQueries({ queryClient.removeQueries({
queryKey: localCourseKeys.allAssignments( queryKey: localCourseKeys.allItemsOfType(
courseName, courseName,
previousModuleName previousModuleName,
"Assignment"
), ),
}); });
} }
queryClient.setQueryData( queryClient.setQueryData(
localCourseKeys.assignment(courseName, moduleName, assignmentName), localCourseKeys.itemOfType(
courseName,
moduleName,
assignmentName,
"Assignment"
),
assignment assignment
); );
const url = const url =
@@ -138,13 +146,14 @@ export const useUpdateAssignmentMutation = () => {
}, },
onSuccess: async (_, { moduleName, assignmentName }) => { onSuccess: async (_, { moduleName, assignmentName }) => {
await queryClient.invalidateQueries({ await queryClient.invalidateQueries({
queryKey: localCourseKeys.allAssignments(courseName, moduleName), queryKey: localCourseKeys.allItemsOfType(courseName, moduleName, "Assignment"),
}); });
await queryClient.invalidateQueries({ await queryClient.invalidateQueries({
queryKey: localCourseKeys.assignment( queryKey: localCourseKeys.itemOfType(
courseName, courseName,
moduleName, moduleName,
assignmentName assignmentName,
"Assignment"
), ),
}); });
}, },
@@ -165,7 +174,12 @@ export const useCreateAssignmentMutation = () => {
assignmentName: string; assignmentName: string;
}) => { }) => {
queryClient.setQueryData( queryClient.setQueryData(
localCourseKeys.assignment(courseName, moduleName, assignmentName), localCourseKeys.itemOfType(
courseName,
moduleName,
assignmentName,
"Assignment"
),
assignment assignment
); );
const url = const url =
@@ -179,13 +193,14 @@ export const useCreateAssignmentMutation = () => {
}, },
onSuccess: async (_, { moduleName, assignmentName }) => { onSuccess: async (_, { moduleName, assignmentName }) => {
await queryClient.invalidateQueries({ await queryClient.invalidateQueries({
queryKey: localCourseKeys.allAssignments(courseName, moduleName), queryKey: localCourseKeys.allItemsOfType(courseName, moduleName, "Assignment"),
}); });
await queryClient.invalidateQueries({ await queryClient.invalidateQueries({
queryKey: localCourseKeys.assignment( queryKey: localCourseKeys.itemOfType(
courseName, courseName,
moduleName, moduleName,
assignmentName assignmentName,
"Assignment"
), ),
}); });
}, },
@@ -204,14 +219,15 @@ export const useDeleteAssignmentMutation = () => {
assignmentName: string; assignmentName: string;
}) => { }) => {
queryClient.removeQueries({ queryClient.removeQueries({
queryKey: localCourseKeys.assignment( queryKey: localCourseKeys.itemOfType(
courseName, courseName,
moduleName, moduleName,
assignmentName assignmentName,
"Assignment"
), ),
}); });
queryClient.removeQueries({ queryClient.removeQueries({
queryKey: localCourseKeys.allAssignments(courseName, moduleName), queryKey: localCourseKeys.allItemsOfType(courseName, moduleName, "Assignment"),
}); });
const url = const url =
"/api/courses/" + "/api/courses/" +
@@ -224,7 +240,7 @@ export const useDeleteAssignmentMutation = () => {
}, },
onSuccess: async (_, { moduleName, assignmentName }) => { onSuccess: async (_, { moduleName, assignmentName }) => {
queryClient.invalidateQueries({ queryClient.invalidateQueries({
queryKey: localCourseKeys.allAssignments(courseName, moduleName), queryKey: localCourseKeys.allItemsOfType(courseName, moduleName, "Assignment"),
}); });
}, },
}); });

View File

@@ -1,3 +1,5 @@
import { CourseItemType, typeToFolder } from "@/models/local/courseItemTypes";
export const localCourseKeys = { export const localCourseKeys = {
allCoursesSettings: ["all courses settings"] as const, allCoursesSettings: ["all courses settings"] as const,
allCoursesNames: ["all courses names"] as const, allCoursesNames: ["all courses names"] as const,
@@ -10,14 +12,32 @@ export const localCourseKeys = {
"modules", "modules",
{ type: "names" } as const, { type: "names" } as const,
] as const, ] as const,
allAssignments: (courseName: string, moduleName: string) => allItemsOfType: (
courseName: string,
moduleName: string,
type: CourseItemType
) =>
[ [
"course details", "course details",
courseName, courseName,
"modules", "modules",
moduleName, moduleName,
"assignments", typeToFolder[type],
{ type: "all assignments" }, { type: "all" },
] as const,
itemOfType: (
courseName: string,
moduleName: string,
name: string,
type: CourseItemType
) =>
[
"course details",
courseName,
"modules",
moduleName,
typeToFolder[type],
name,
] as const, ] as const,
allQuizzes: (courseName: string, moduleName: string) => allQuizzes: (courseName: string, moduleName: string) =>
[ [
@@ -26,7 +46,7 @@ export const localCourseKeys = {
"modules", "modules",
moduleName, moduleName,
"quizzes", "quizzes",
{ type: "all quizzes" }, { type: "all" },
] as const, ] as const,
allPages: (courseName: string, moduleName: string) => allPages: (courseName: string, moduleName: string) =>
[ [
@@ -35,20 +55,7 @@ export const localCourseKeys = {
"modules", "modules",
moduleName, moduleName,
"pages", "pages",
{ type: "all pages" }, { type: "all" },
] as const,
assignment: (
courseName: string,
moduleName: string,
assignmentName: string
) =>
[
"course details",
courseName,
"modules",
moduleName,
"assignments",
assignmentName,
] as const, ] as const,
quiz: (courseName: string, moduleName: string, quizName: string) => quiz: (courseName: string, moduleName: string, quizName: string) =>
[ [

View File

@@ -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 CourseItemType> = T extends "Assignment"
? LocalAssignment
: T extends "Quiz"
? LocalQuiz
: LocalCoursePage;
export const typeToFolder = {
Assignment: "assignments",
Quiz: "quizzes",
Page: "pages",
} as const;

View File

@@ -15,14 +15,11 @@ import {
} from "@/models/local/page/localCoursePage"; } from "@/models/local/page/localCoursePage";
import { assignmentMarkdownSerializer } from "@/models/local/assignment/utils/assignmentMarkdownSerializer"; import { assignmentMarkdownSerializer } from "@/models/local/assignment/utils/assignmentMarkdownSerializer";
import { quizMarkdownUtils } from "@/models/local/quiz/utils/quizMarkdownUtils"; import { quizMarkdownUtils } from "@/models/local/quiz/utils/quizMarkdownUtils";
import {
const typeToFolder = { CourseItemReturnType,
Assignment: "assignments", CourseItemType,
Quiz: "quizzes", typeToFolder,
Page: "pages", } from "@/models/local/courseItemTypes";
} as const;
export type CourseItemType = "Assignment" | "Quiz" | "Page";
const getItemFileNames = async ( const getItemFileNames = async (
courseName: string, courseName: string,
@@ -41,11 +38,6 @@ const getItemFileNames = async (
const itemFiles = await fs.readdir(filePath); const itemFiles = await fs.readdir(filePath);
return itemFiles.map((f) => f.replace(/\.md$/, "")); return itemFiles.map((f) => f.replace(/\.md$/, ""));
}; };
type CourseItemReturnType<T extends CourseItemType> = T extends "Assignment"
? LocalAssignment
: T extends "Quiz"
? LocalQuiz
: LocalCoursePage;
const getItem = async <T extends CourseItemType>( const getItem = async <T extends CourseItemType>(
courseName: string, courseName: string,
@@ -129,7 +121,8 @@ export const courseItemFileStorageService = {
const markdownDictionary: { const markdownDictionary: {
[key in CourseItemType]: () => string; [key in CourseItemType]: () => string;
} = { } = {
Assignment: () => assignmentMarkdownSerializer.toMarkdown(item as LocalAssignment), Assignment: () =>
assignmentMarkdownSerializer.toMarkdown(item as LocalAssignment),
Quiz: () => quizMarkdownUtils.toMarkdown(item as LocalQuiz), Quiz: () => quizMarkdownUtils.toMarkdown(item as LocalQuiz),
Page: () => localPageMarkdownUtils.toMarkdown(item as LocalCoursePage), Page: () => localPageMarkdownUtils.toMarkdown(item as LocalCoursePage),
}; };