Files
canvasManagement/nextjs/src/hooks/hookHydration.ts

145 lines
4.2 KiB
TypeScript

import { QueryClient } from "@tanstack/react-query";
import { localCourseKeys } from "./localCourse/localCourseKeys";
import { fileStorageService } from "@/services/fileStorage/fileStorageService";
// https://tanstack.com/query/latest/docs/framework/react/guides/ssr
export const hydrateCourses = async (queryClient: QueryClient) => {
const courseNames = await fileStorageService.getCourseNames();
await queryClient.prefetchQuery({
queryKey: localCourseKeys.allCourses,
queryFn: () => courseNames,
});
await Promise.all(
courseNames.map(async (courseName) => {
await hydrateCourse(queryClient, courseName);
})
);
};
export const hydrateCourse = async (
queryClient: QueryClient,
courseName: string
) => {
const settings = await fileStorageService.getCourseSettings(courseName);
const moduleNames = await fileStorageService.getModuleNames(courseName);
const modulesData = await Promise.all(
moduleNames.map(async (moduleName) => {
const [assignmentNames, pageNames, quizNames] = await Promise.all([
await fileStorageService.getAssignmentNames(courseName, moduleName),
await fileStorageService.getPageNames(courseName, moduleName),
await fileStorageService.getQuizNames(courseName, moduleName),
]);
const [assignments, quizzes, pages] = await Promise.all([
await Promise.all(
assignmentNames.map(
async (assignmentName) =>
await fileStorageService.getAssignment(
courseName,
moduleName,
assignmentName
)
)
),
await Promise.all(
quizNames.map(
async (quizName) =>
await fileStorageService.getQuiz(courseName, moduleName, quizName)
)
),
await Promise.all(
pageNames.map(
async (pageName) =>
await fileStorageService.getPage(courseName, moduleName, pageName)
)
),
]);
return {
moduleName,
assignmentNames,
pageNames,
quizNames,
assignments,
quizzes,
pages,
};
})
);
await queryClient.prefetchQuery({
queryKey: localCourseKeys.settings(courseName),
queryFn: () => settings,
});
await queryClient.prefetchQuery({
queryKey: localCourseKeys.moduleNames(courseName),
queryFn: () => moduleNames,
});
await Promise.all(
modulesData.map(
async ({
moduleName,
assignmentNames,
pageNames,
quizNames,
assignments,
quizzes,
pages,
}) => {
await queryClient.prefetchQuery({
queryKey: localCourseKeys.assignmentNames(courseName, moduleName),
queryFn: () => assignmentNames,
});
await Promise.all(
assignments.map(
async (assignment) =>
await queryClient.prefetchQuery({
queryKey: localCourseKeys.assignment(
courseName,
moduleName,
assignment.name
),
queryFn: () => assignment,
})
)
);
await queryClient.prefetchQuery({
queryKey: localCourseKeys.quizNames(courseName, moduleName),
queryFn: () => quizNames,
});
await Promise.all(
quizzes.map(
async (quiz) =>
await queryClient.prefetchQuery({
queryKey: localCourseKeys.quiz(
courseName,
moduleName,
quiz.name
),
queryFn: () => quiz,
})
)
);
await queryClient.prefetchQuery({
queryKey: localCourseKeys.pageNames(courseName, moduleName),
queryFn: () => pageNames,
});
await Promise.all(
pages.map(
async (page) =>
await queryClient.prefetchQuery({
queryKey: localCourseKeys.page(
courseName,
moduleName,
page.name
),
queryFn: () => page,
})
)
);
}
)
);
};