more centralization

This commit is contained in:
2024-09-27 11:06:54 -06:00
parent ae8bd1297e
commit f990619e05
13 changed files with 205 additions and 225 deletions

View File

@@ -73,16 +73,16 @@ export const hydrateCanvasCourse = async (
};
const loadAllModuleData = async (courseName: string, moduleName: string) => {
const [assignmentNames, pageNames, quizNames] = await Promise.all([
const [assignmentNames, pages, quizzes] = await Promise.all([
await fileStorageService.assignments.getAssignmentNames(
courseName,
moduleName
),
await fileStorageService.pages.getPageNames(courseName, moduleName),
await fileStorageService.quizzes.getQuizNames(courseName, moduleName),
await fileStorageService.pages.getPages(courseName, moduleName),
await fileStorageService.quizzes.getQuizzes(courseName, moduleName),
]);
const [assignments, quizzes, pages] = await Promise.all([
const [assignments] = await Promise.all([
await Promise.all(
assignmentNames.map(async (assignmentName) => {
try {
@@ -97,33 +97,11 @@ const loadAllModuleData = async (courseName: string, moduleName: string) => {
}
})
),
await Promise.all(
quizNames.map(
async (quizName) =>
await fileStorageService.quizzes.getQuiz(
courseName,
moduleName,
quizName
)
)
),
await Promise.all(
pageNames.map(
async (pageName) =>
await fileStorageService.pages.getPage(
courseName,
moduleName,
pageName
)
)
),
]);
const assignmentsLoaded = assignments.filter(a => a !== null);
const assignmentsLoaded = assignments.filter((a) => a !== null);
return {
moduleName,
pageNames,
quizNames,
assignments: assignmentsLoaded,
quizzes,
pages,
@@ -133,15 +111,11 @@ const loadAllModuleData = async (courseName: string, moduleName: string) => {
const hydrateModuleData = async (
{
moduleName,
pageNames,
quizNames,
assignments,
quizzes,
pages,
}: {
moduleName: string;
pageNames: string[];
quizNames: string[];
assignments: LocalAssignment[];
quizzes: LocalQuiz[];
pages: LocalCoursePage[];
@@ -153,6 +127,14 @@ const hydrateModuleData = async (
queryKey: localCourseKeys.allAssignments(courseName, moduleName),
queryFn: () => assignments,
});
await queryClient.prefetchQuery({
queryKey: localCourseKeys.allQuizzes(courseName, moduleName),
queryFn: () => quizzes,
});
await queryClient.prefetchQuery({
queryKey: localCourseKeys.allPages(courseName, moduleName),
queryFn: () => pages,
});
await Promise.all(
assignments.map(
async (assignment) =>
@@ -166,10 +148,6 @@ const hydrateModuleData = async (
})
)
);
await queryClient.prefetchQuery({
queryKey: localCourseKeys.quizNames(courseName, moduleName),
queryFn: () => quizNames,
});
await Promise.all(
quizzes.map(
async (quiz) =>
@@ -179,10 +157,6 @@ const hydrateModuleData = async (
})
)
);
await queryClient.prefetchQuery({
queryKey: localCourseKeys.pageNames(courseName, moduleName),
queryFn: () => pageNames,
});
await Promise.all(
pages.map(
async (page) =>

View File

@@ -28,7 +28,7 @@ export const getAllAssignmentsQueryConfig = (
},
});
export const useAllAssignmentNamesQuery = (moduleName: string) => {
const useAllAssignmentsQuery = (moduleName: string) => {
const { courseName } = useCourseContext();
return useSuspenseQuery(getAllAssignmentsQueryConfig(courseName, moduleName));
};
@@ -70,7 +70,7 @@ export const useAssignmentQuery = (
};
export const useAssignmentsQueries = (moduleName: string) => {
const { data: allAssignments } = useAllAssignmentNamesQuery(moduleName);
const { data: allAssignments } = useAllAssignmentsQuery(moduleName);
const { courseName } = useCourseContext();
return useSuspenseQueries({
queries: allAssignments.map((assignment) =>

View File

@@ -19,23 +19,23 @@ export const localCourseKeys = {
"assignments",
{ type: "all assignments" },
] as const,
quizNames: (courseName: string, moduleName: string) =>
allQuizzes: (courseName: string, moduleName: string) =>
[
"course details",
courseName,
"modules",
moduleName,
"quizzes",
{ type: "names" },
{ type: "all quizzes" },
] as const,
pageNames: (courseName: string, moduleName: string) =>
allPages: (courseName: string, moduleName: string) =>
[
"course details",
courseName,
"modules",
moduleName,
"pages",
{ type: "names" },
{ type: "all pages" },
] as const,
assignment: (
courseName: string,

View File

@@ -11,8 +11,8 @@ import {
getAllAssignmentsQueryConfig,
getAssignmentQueryConfig,
} from "./assignmentHooks";
import { getPageNamesQueryConfig, getPageQueryConfig } from "./pageHooks";
import { getQuizNamesQueryConfig, getQuizQueryConfig } from "./quizHooks";
import { getAllPagesQueryConfig, getPageQueryConfig } from "./pageHooks";
import { getAllQuizzesQueryConfig, getQuizQueryConfig } from "./quizHooks";
export const useModuleNamesQuery = () => {
const { courseName } = useCourseContext();
@@ -92,57 +92,15 @@ export const useAllCourseDataQuery = () => {
}),
});
// const { data: assignmentsAndModules } = useSuspenseQueries({
// queries: assignmentsAndModules.map(
// ({ moduleName, assignment }, i) =>
// getAssignmentQueryConfig(courseName, moduleName, assignment)
// ),
// combine: (results) => ({
// data: results.flatMap((r, i) => ({
// moduleName: assignmentsAndModules[i].moduleName,
// assignment: r.data,
// })),
// pending: results.some((r) => r.isPending),
// }),
// });
const { data: quizNamesAndModules } = useSuspenseQueries({
queries: moduleNames.map((moduleName) =>
getQuizNamesQueryConfig(courseName, moduleName)
),
combine: (results) => ({
data: results.flatMap((r, i) =>
r.data.map((quizName) => ({
moduleName: moduleNames[i],
quizName: quizName,
}))
),
pending: results.some((r) => r.isPending),
}),
});
const { data: quizzesAndModules } = useSuspenseQueries({
queries: quizNamesAndModules.map(({ moduleName, quizName }, i) =>
getQuizQueryConfig(courseName, moduleName, quizName)
),
combine: (results) => ({
data: results.flatMap((r, i) => ({
moduleName: quizNamesAndModules[i].moduleName,
quiz: r.data,
})),
pending: results.some((r) => r.isPending),
}),
});
const { data: pageNamesAndModules } = useSuspenseQueries({
queries: moduleNames.map((moduleName) =>
getPageNamesQueryConfig(courseName, moduleName)
getAllQuizzesQueryConfig(courseName, moduleName)
),
combine: (results) => ({
data: results.flatMap((r, i) =>
r.data.map((pageName) => ({
r.data.map((quiz) => ({
moduleName: moduleNames[i],
pageName,
quiz,
}))
),
pending: results.some((r) => r.isPending),
@@ -150,14 +108,16 @@ export const useAllCourseDataQuery = () => {
});
const { data: pagesAndModules } = useSuspenseQueries({
queries: pageNamesAndModules.map(({ moduleName, pageName }, i) =>
getPageQueryConfig(courseName, moduleName, pageName)
queries: moduleNames.map((moduleName) =>
getAllPagesQueryConfig(courseName, moduleName)
),
combine: (results) => ({
data: results.flatMap((r, i) => ({
moduleName: pageNamesAndModules[i].moduleName,
page: r.data,
})),
data: results.flatMap((r, i) =>
r.data.map((page) => ({
moduleName: moduleNames[i],
page,
}))
),
pending: results.some((r) => r.isPending),
}),
});

View File

@@ -10,13 +10,10 @@ import { localCourseKeys } from "./localCourseKeys";
import { useCourseContext } from "@/app/course/[courseName]/context/courseContext";
import { axiosClient } from "@/services/axiosUtils";
export function getPageNamesQueryConfig(
courseName: string,
moduleName: string
) {
export function getAllPagesQueryConfig(courseName: string, moduleName: string) {
return {
queryKey: localCourseKeys.pageNames(courseName, moduleName),
queryFn: async (): Promise<string[]> => {
queryKey: localCourseKeys.allPages(courseName, moduleName),
queryFn: async (): Promise<LocalCoursePage[]> => {
const url =
"/api/courses/" +
encodeURIComponent(courseName) +
@@ -29,29 +26,6 @@ export function getPageNamesQueryConfig(
};
}
export const usePageNamesQuery = (moduleName: string) => {
const { courseName } = useCourseContext();
return useSuspenseQuery(getPageNamesQueryConfig(courseName, moduleName));
};
export const usePageQuery = (moduleName: string, pageName: string) => {
const { courseName } = useCourseContext();
return useSuspenseQuery(getPageQueryConfig(courseName, moduleName, pageName));
};
export const usePagesQueries = (moduleName: string, pageNames: string[]) => {
const { courseName } = useCourseContext();
return useSuspenseQueries({
queries: pageNames.map((name) =>
getPageQueryConfig(courseName, moduleName, name)
),
combine: (results) => ({
data: results.map((r) => r.data),
pending: results.some((r) => r.isPending),
}),
});
};
export function getPageQueryConfig(
courseName: string,
moduleName: string,
@@ -72,13 +46,37 @@ export function getPageQueryConfig(
return response.data;
} catch (e) {
console.log("error getting page", e, url);
debugger;
throw e;
}
},
};
}
export const usePageQuery = (moduleName: string, pageName: string) => {
const { courseName } = useCourseContext();
return useSuspenseQuery(getPageQueryConfig(courseName, moduleName, pageName));
};
const useAllPagesQuery = (moduleName: string) => {
const { courseName } = useCourseContext();
return useSuspenseQuery(getAllPagesQueryConfig(courseName, moduleName));
};
export const usePagesQueries = (moduleName: string) => {
const { courseName } = useCourseContext();
const { data: allPages } = useAllPagesQuery(moduleName);
return useSuspenseQueries({
queries: allPages.map((page) => ({
...getPageQueryConfig(courseName, moduleName, page.name),
queryFn: () => page,
})),
combine: (results) => ({
data: results.map((r) => r.data),
pending: results.some((r) => r.isPending),
}),
});
};
export const useUpdatePageMutation = () => {
const { courseName } = useCourseContext();
const queryClient = useQueryClient();
@@ -109,7 +107,7 @@ export const useUpdatePageMutation = () => {
),
});
queryClient.removeQueries({
queryKey: localCourseKeys.pageNames(courseName, moduleName),
queryKey: localCourseKeys.allPages(courseName, moduleName),
});
}
queryClient.setQueryData(
@@ -131,7 +129,7 @@ export const useUpdatePageMutation = () => {
},
onSuccess: async (_, { moduleName, pageName }) => {
await queryClient.invalidateQueries({
queryKey: localCourseKeys.pageNames(courseName, moduleName),
queryKey: localCourseKeys.allPages(courseName, moduleName),
});
await queryClient.invalidateQueries({
queryKey: localCourseKeys.page(courseName, moduleName, pageName),
@@ -171,7 +169,7 @@ export const useCreatePageMutation = () => {
queryKey: localCourseKeys.page(courseName, moduleName, pageName),
});
queryClient.invalidateQueries({
queryKey: localCourseKeys.pageNames(courseName, moduleName),
queryKey: localCourseKeys.allPages(courseName, moduleName),
});
},
});
@@ -192,7 +190,7 @@ export const useDeletePageMutation = () => {
queryKey: localCourseKeys.page(courseName, moduleName, pageName),
});
queryClient.removeQueries({
queryKey: localCourseKeys.pageNames(courseName, moduleName),
queryKey: localCourseKeys.allPages(courseName, moduleName),
});
const url =
"/api/courses/" +
@@ -202,11 +200,10 @@ export const useDeletePageMutation = () => {
"/pages/" +
encodeURIComponent(pageName);
await axiosClient.delete(url);
},
onSuccess: async (_, { moduleName, pageName }) => {
await queryClient.invalidateQueries({
queryKey: localCourseKeys.pageNames(courseName, moduleName),
queryKey: localCourseKeys.allPages(courseName, moduleName),
});
await queryClient.invalidateQueries({
queryKey: localCourseKeys.page(courseName, moduleName, pageName),

View File

@@ -10,13 +10,13 @@ import { localCourseKeys } from "./localCourseKeys";
import { useCourseContext } from "@/app/course/[courseName]/context/courseContext";
import { axiosClient } from "@/services/axiosUtils";
export function getQuizNamesQueryConfig(
export function getAllQuizzesQueryConfig(
courseName: string,
moduleName: string
) {
return {
queryKey: localCourseKeys.quizNames(courseName, moduleName),
queryFn: async (): Promise<string[]> => {
queryKey: localCourseKeys.allQuizzes(courseName, moduleName),
queryFn: async (): Promise<LocalQuiz[]> => {
const url =
"/api/courses/" +
encodeURIComponent(courseName) +
@@ -28,22 +28,24 @@ export function getQuizNamesQueryConfig(
},
};
}
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 useAllQuizzesQuery = (moduleName: string) => {
const { courseName } = useCourseContext();
return useSuspenseQuery(getAllQuizzesQueryConfig(courseName, moduleName));
};
export const useQuizzesQueries = (moduleName: string) => {
const { courseName } = useCourseContext();
const { data: allQuizzes } = useAllQuizzesQuery(moduleName);
return useSuspenseQueries({
queries: quizNames.map((name) =>
getQuizQueryConfig(courseName, moduleName, name)
),
queries: allQuizzes.map((quiz) => ({
...getQuizQueryConfig(courseName, moduleName, quiz.name),
queryFn: () => quiz,
})),
combine: (results) => ({
data: results.map((r) => r.data),
pending: results.some((r) => r.isPending),
@@ -102,7 +104,7 @@ export const useUpdateQuizMutation = () => {
),
});
queryClient.removeQueries({
queryKey: localCourseKeys.quizNames(courseName, previousModuleName),
queryKey: localCourseKeys.allQuizzes(courseName, previousModuleName),
});
}
queryClient.setQueryData(
@@ -128,7 +130,7 @@ export const useUpdateQuizMutation = () => {
},
onSuccess: async (_, { moduleName, quizName }) => {
await queryClient.invalidateQueries({
queryKey: localCourseKeys.quizNames(courseName, moduleName),
queryKey: localCourseKeys.allQuizzes(courseName, moduleName),
});
await queryClient.invalidateQueries({
queryKey: localCourseKeys.quiz(courseName, moduleName, quizName),
@@ -165,7 +167,7 @@ export const useCreateQuizMutation = () => {
},
onSuccess: async (_, { moduleName, quizName }) => {
await queryClient.invalidateQueries({
queryKey: localCourseKeys.quizNames(courseName, moduleName),
queryKey: localCourseKeys.allQuizzes(courseName, moduleName),
});
await queryClient.invalidateQueries({
queryKey: localCourseKeys.quiz(courseName, moduleName, quizName),
@@ -194,12 +196,12 @@ export const useDeleteQuizMutation = () => {
encodeURIComponent(quizName);
await axiosClient.delete(url);
queryClient.removeQueries({
queryKey: localCourseKeys.quizNames(courseName, moduleName),
queryKey: localCourseKeys.allQuizzes(courseName, moduleName),
});
},
onSuccess: async (_, { moduleName, quizName }) => {
await queryClient.invalidateQueries({
queryKey: localCourseKeys.quizNames(courseName, moduleName),
queryKey: localCourseKeys.allQuizzes(courseName, moduleName),
});
await queryClient.invalidateQueries({
queryKey: localCourseKeys.quiz(courseName, moduleName, quizName),