mirror of
https://github.com/alexmickelson/canvasManagement.git
synced 2026-03-27 07:58:31 -06:00
back to displaying months
This commit is contained in:
@@ -3,20 +3,21 @@ import { getDateFromStringOrThrow } from "@/models/local/timeUtils";
|
|||||||
import { useCourseContext } from "../context/courseContext";
|
import { useCourseContext } from "../context/courseContext";
|
||||||
import { getMonthsBetweenDates } from "./calendarMonthUtils";
|
import { getMonthsBetweenDates } from "./calendarMonthUtils";
|
||||||
import { CalendarMonth } from "./CalendarMonth";
|
import { CalendarMonth } from "./CalendarMonth";
|
||||||
|
import { useLocalCourseSettingsQuery } from "@/hooks/localCourse/localCoursesHooks";
|
||||||
|
|
||||||
export default function CourseCalendar() {
|
export default function CourseCalendar() {
|
||||||
// const {
|
const { courseName } = useCourseContext();
|
||||||
// localCourse: {
|
const { data: settings } = useLocalCourseSettingsQuery(courseName);
|
||||||
// settings: { startDate, endDate },
|
|
||||||
// },
|
|
||||||
// } = useCourseContext();
|
|
||||||
|
|
||||||
// const startDateTime = getDateFromStringOrThrow(
|
const startDateTime = getDateFromStringOrThrow(
|
||||||
// startDate,
|
settings.startDate,
|
||||||
// "course start date"
|
"course start date"
|
||||||
// );
|
);
|
||||||
// const endDateTime = getDateFromStringOrThrow(endDate, "course end date");
|
const endDateTime = getDateFromStringOrThrow(
|
||||||
// const months = getMonthsBetweenDates(startDateTime, endDateTime);
|
settings.endDate,
|
||||||
|
"course end date"
|
||||||
|
);
|
||||||
|
const months = getMonthsBetweenDates(startDateTime, endDateTime);
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div
|
<div
|
||||||
@@ -30,9 +31,9 @@ export default function CourseCalendar() {
|
|||||||
"
|
"
|
||||||
>
|
>
|
||||||
Month Goes Here
|
Month Goes Here
|
||||||
{/* {months.map((month) => (
|
{months.map((month) => (
|
||||||
<CalendarMonth key={month.month + "" + month.year} month={month} />
|
<CalendarMonth key={month.month + "" + month.year} month={month} />
|
||||||
))} */}
|
))}
|
||||||
</div>
|
</div>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,60 +1,19 @@
|
|||||||
"use client";
|
"use client";
|
||||||
|
|
||||||
import { getDateFromStringOrThrow } from "@/models/local/timeUtils";
|
|
||||||
import { useCourseContext } from "../context/courseContext";
|
import { useCourseContext } from "../context/courseContext";
|
||||||
|
import { useModuleNamesQuery } from "@/hooks/localCourse/localCoursesHooks";
|
||||||
|
import DayItemsInModule from "./DayItemsInModule";
|
||||||
|
|
||||||
export default function Day({ day, month }: { day: Date; month: number }) {
|
export default function Day({ day, month }: { day: Date; month: number }) {
|
||||||
const {
|
const { courseName, itemDrop } = useCourseContext();
|
||||||
localCourse: { modules },
|
const { data: moduleNames } = useModuleNamesQuery(courseName);
|
||||||
startItemDrag,
|
|
||||||
endItemDrag,
|
|
||||||
itemDrop,
|
|
||||||
} = useCourseContext();
|
|
||||||
|
|
||||||
const isInSameMonth = day.getMonth() + 1 != month;
|
const isInSameMonth = day.getMonth() + 1 != month;
|
||||||
const backgroundClass = isInSameMonth ? "" : "bg-slate-900";
|
const backgroundClass = isInSameMonth ? "" : "bg-slate-900";
|
||||||
|
|
||||||
const todaysAssignments = modules
|
|
||||||
.flatMap((m) => m.assignments)
|
|
||||||
.filter((a) => {
|
|
||||||
const dueDate = getDateFromStringOrThrow(
|
|
||||||
a.dueAt,
|
|
||||||
"due at for assignment in day"
|
|
||||||
);
|
|
||||||
return (
|
|
||||||
dueDate.getFullYear() === day.getFullYear() &&
|
|
||||||
dueDate.getMonth() === day.getMonth() &&
|
|
||||||
dueDate.getDate() === day.getDate()
|
|
||||||
);
|
|
||||||
});
|
|
||||||
const todaysQuizzes = modules
|
|
||||||
.flatMap((m) => m.quizzes)
|
|
||||||
.filter((q) => {
|
|
||||||
const dueDate = getDateFromStringOrThrow(
|
|
||||||
q.dueAt,
|
|
||||||
"due at for quiz in day"
|
|
||||||
);
|
|
||||||
return (
|
|
||||||
dueDate.getFullYear() === day.getFullYear() &&
|
|
||||||
dueDate.getMonth() === day.getMonth() &&
|
|
||||||
dueDate.getDate() === day.getDate()
|
|
||||||
);
|
|
||||||
});
|
|
||||||
const todaysPages = modules
|
|
||||||
.flatMap((m) => m.pages)
|
|
||||||
.filter((p) => {
|
|
||||||
const dueDate = getDateFromStringOrThrow(
|
|
||||||
p.dueAt,
|
|
||||||
"due at for page in day"
|
|
||||||
);
|
|
||||||
return (
|
|
||||||
dueDate.getFullYear() === day.getFullYear() &&
|
|
||||||
dueDate.getMonth() === day.getMonth() &&
|
|
||||||
dueDate.getDate() === day.getDate()
|
|
||||||
);
|
|
||||||
});
|
|
||||||
return (
|
return (
|
||||||
|
<>
|
||||||
|
{moduleNames.map((moduleName) => (
|
||||||
<div
|
<div
|
||||||
|
key={"" + day + month + moduleName}
|
||||||
className={
|
className={
|
||||||
"border border-slate-600 rounded-lg p-2 pb-4 m-1 " + backgroundClass
|
"border border-slate-600 rounded-lg p-2 pb-4 m-1 " + backgroundClass
|
||||||
}
|
}
|
||||||
@@ -62,32 +21,9 @@ export default function Day({ day, month }: { day: Date; month: number }) {
|
|||||||
onDragOver={(e) => e.preventDefault()}
|
onDragOver={(e) => e.preventDefault()}
|
||||||
>
|
>
|
||||||
{day.getDate()}
|
{day.getDate()}
|
||||||
<ul className="list-disc ms-4">
|
<DayItemsInModule day={day} moduleName={moduleName} />
|
||||||
{todaysAssignments.map((a) => (
|
|
||||||
<li key={a.name}>{a.name}</li>
|
|
||||||
))}
|
|
||||||
{todaysQuizzes.map((q) => (
|
|
||||||
<li
|
|
||||||
key={q.name}
|
|
||||||
role="button"
|
|
||||||
draggable="true"
|
|
||||||
onDragStart={() => startItemDrag({ type: "quiz", item: q })}
|
|
||||||
onDragEnd={endItemDrag}
|
|
||||||
>
|
|
||||||
{q.name}
|
|
||||||
</li>
|
|
||||||
))}
|
|
||||||
{todaysPages.map((p) => (
|
|
||||||
<li
|
|
||||||
key={p.name}
|
|
||||||
role="button"
|
|
||||||
draggable="true"
|
|
||||||
// onDragStart={() => startItemDrag({ type: "page", item: p })}
|
|
||||||
>
|
|
||||||
{p.name}
|
|
||||||
</li>
|
|
||||||
))}
|
|
||||||
</ul>
|
|
||||||
</div>
|
</div>
|
||||||
|
))}
|
||||||
|
</>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,76 @@
|
|||||||
|
import React from "react";
|
||||||
|
import { useCourseContext } from "../context/courseContext";
|
||||||
|
import { useModuleDataQuery } from "@/hooks/localCourse/localCoursesHooks";
|
||||||
|
import { getDateFromStringOrThrow } from "@/models/local/timeUtils";
|
||||||
|
|
||||||
|
export default function DayItemsInModule({
|
||||||
|
day,
|
||||||
|
moduleName,
|
||||||
|
}: {
|
||||||
|
day: Date;
|
||||||
|
moduleName: string;
|
||||||
|
}) {
|
||||||
|
const { courseName, endItemDrag, startItemDrag } = useCourseContext();
|
||||||
|
const { assignments, quizzes, pages } = useModuleDataQuery(
|
||||||
|
courseName,
|
||||||
|
moduleName
|
||||||
|
);
|
||||||
|
|
||||||
|
const todaysAssignments = assignments.filter((a) => {
|
||||||
|
const dueDate = getDateFromStringOrThrow(
|
||||||
|
a.dueAt,
|
||||||
|
"due at for assignment in day"
|
||||||
|
);
|
||||||
|
return (
|
||||||
|
dueDate.getFullYear() === day.getFullYear() &&
|
||||||
|
dueDate.getMonth() === day.getMonth() &&
|
||||||
|
dueDate.getDate() === day.getDate()
|
||||||
|
);
|
||||||
|
});
|
||||||
|
const todaysQuizzes = quizzes.filter((q) => {
|
||||||
|
const dueDate = getDateFromStringOrThrow(q.dueAt, "due at for quiz in day");
|
||||||
|
return (
|
||||||
|
dueDate.getFullYear() === day.getFullYear() &&
|
||||||
|
dueDate.getMonth() === day.getMonth() &&
|
||||||
|
dueDate.getDate() === day.getDate()
|
||||||
|
);
|
||||||
|
});
|
||||||
|
const todaysPages = pages.filter((p) => {
|
||||||
|
const dueDate = getDateFromStringOrThrow(p.dueAt, "due at for page in day");
|
||||||
|
return (
|
||||||
|
dueDate.getFullYear() === day.getFullYear() &&
|
||||||
|
dueDate.getMonth() === day.getMonth() &&
|
||||||
|
dueDate.getDate() === day.getDate()
|
||||||
|
);
|
||||||
|
});
|
||||||
|
return (
|
||||||
|
<>
|
||||||
|
<ul className="list-disc ms-4">
|
||||||
|
{todaysAssignments.map((a) => (
|
||||||
|
<li key={a.name}>{a.name}</li>
|
||||||
|
))}
|
||||||
|
{todaysQuizzes.map((q) => (
|
||||||
|
<li
|
||||||
|
key={q.name}
|
||||||
|
role="button"
|
||||||
|
draggable="true"
|
||||||
|
onDragStart={() => startItemDrag({ type: "quiz", item: q })}
|
||||||
|
onDragEnd={endItemDrag}
|
||||||
|
>
|
||||||
|
{q.name}
|
||||||
|
</li>
|
||||||
|
))}
|
||||||
|
{todaysPages.map((p) => (
|
||||||
|
<li
|
||||||
|
key={p.name}
|
||||||
|
role="button"
|
||||||
|
draggable="true"
|
||||||
|
onDragStart={() => startItemDrag({ type: "page", item: p })}
|
||||||
|
>
|
||||||
|
{p.name}
|
||||||
|
</li>
|
||||||
|
))}
|
||||||
|
</ul>
|
||||||
|
</>
|
||||||
|
);
|
||||||
|
}
|
||||||
@@ -1,20 +1,8 @@
|
|||||||
import { IModuleItem } from "@/models/local/IModuleItem";
|
import { IModuleItem } from "@/models/local/IModuleItem";
|
||||||
import { LocalModule } from "@/models/local/localModules";
|
|
||||||
import { getDateFromStringOrThrow } from "@/models/local/timeUtils";
|
import { getDateFromStringOrThrow } from "@/models/local/timeUtils";
|
||||||
import React, { useState } from "react";
|
import { useState } from "react";
|
||||||
import { useCourseContext } from "../context/courseContext";
|
import { useCourseContext } from "../context/courseContext";
|
||||||
import {
|
import { useModuleDataQuery } from "@/hooks/localCourse/localCoursesHooks";
|
||||||
useAssignmentNamesQuery,
|
|
||||||
useAssignmentsQueries,
|
|
||||||
} from "@/hooks/localCourse/assignmentHooks";
|
|
||||||
import {
|
|
||||||
useQuizNamesQuery,
|
|
||||||
useQuizzesQueries,
|
|
||||||
} from "@/hooks/localCourse/quizHooks";
|
|
||||||
import {
|
|
||||||
usePageNamesQuery,
|
|
||||||
usePagesQueries,
|
|
||||||
} from "@/hooks/localCourse/pageHooks";
|
|
||||||
|
|
||||||
export default function ExpandableModule({
|
export default function ExpandableModule({
|
||||||
moduleName,
|
moduleName,
|
||||||
@@ -22,23 +10,10 @@ export default function ExpandableModule({
|
|||||||
moduleName: string;
|
moduleName: string;
|
||||||
}) {
|
}) {
|
||||||
const { courseName } = useCourseContext();
|
const { courseName } = useCourseContext();
|
||||||
const { data: assignmentNames } = useAssignmentNamesQuery(
|
const { assignments, quizzes, pages } = useModuleDataQuery(
|
||||||
courseName,
|
courseName,
|
||||||
moduleName
|
moduleName
|
||||||
);
|
);
|
||||||
const { data: assignments } = useAssignmentsQueries(
|
|
||||||
courseName,
|
|
||||||
moduleName,
|
|
||||||
assignmentNames
|
|
||||||
);
|
|
||||||
const { data: quizNames } = useQuizNamesQuery(courseName, moduleName);
|
|
||||||
const { data: quizzes } = useQuizzesQueries(
|
|
||||||
courseName,
|
|
||||||
moduleName,
|
|
||||||
quizNames
|
|
||||||
);
|
|
||||||
const { data: pageNames } = usePageNamesQuery(courseName, moduleName);
|
|
||||||
const { data: pages } = usePagesQueries(courseName, moduleName, pageNames);
|
|
||||||
|
|
||||||
const [expanded, setExpanded] = useState(false);
|
const [expanded, setExpanded] = useState(false);
|
||||||
|
|
||||||
|
|||||||
@@ -8,7 +8,6 @@ export default function ModuleList() {
|
|||||||
const { data: moduleNames } = useModuleNamesQuery(courseName);
|
const { data: moduleNames } = useModuleNamesQuery(courseName);
|
||||||
return (
|
return (
|
||||||
<div>
|
<div>
|
||||||
modules here
|
|
||||||
{moduleNames.map((m) => (
|
{moduleNames.map((m) => (
|
||||||
<ExpandableModule key={m} moduleName={m}/>
|
<ExpandableModule key={m} moduleName={m}/>
|
||||||
))}
|
))}
|
||||||
|
|||||||
@@ -12,7 +12,7 @@ function makeQueryClient() {
|
|||||||
queries: {
|
queries: {
|
||||||
// With SSR, we usually want to set some default staleTime
|
// With SSR, we usually want to set some default staleTime
|
||||||
// above 0 to avoid refetching immediately on the client
|
// above 0 to avoid refetching immediately on the client
|
||||||
// staleTime: 1000,
|
staleTime: 1000,
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
@@ -39,6 +39,7 @@ export default function Providers({ children }: { children: ReactNode }) {
|
|||||||
// have a suspense boundary between this and the code that may
|
// have a suspense boundary between this and the code that may
|
||||||
// suspend because React will throw away the client on the initial
|
// suspend because React will throw away the client on the initial
|
||||||
// render if it suspends and there is no boundary
|
// render if it suspends and there is no boundary
|
||||||
|
|
||||||
const queryClient = getQueryClient();
|
const queryClient = getQueryClient();
|
||||||
|
|
||||||
return (
|
return (
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
import { QueryClient } from "@tanstack/react-query";
|
import { QueryClient } from "@tanstack/react-query";
|
||||||
import { localCourseKeys } from "./localCourse/localCoursesHooks";
|
import { localCourseKeys } from "./localCourse/localCourseKeys";
|
||||||
import { fileStorageService } from "@/services/fileStorage/fileStorageService";
|
import { fileStorageService } from "@/services/fileStorage/fileStorageService";
|
||||||
|
|
||||||
export const hydrateCourses = async (queryClient: QueryClient) => {
|
export const hydrateCourses = async (queryClient: QueryClient) => {
|
||||||
@@ -14,7 +14,52 @@ export const hydrateCourse = async (
|
|||||||
courseName: string
|
courseName: string
|
||||||
) => {
|
) => {
|
||||||
const settings = await fileStorageService.getCourseSettings(courseName);
|
const settings = await fileStorageService.getCourseSettings(courseName);
|
||||||
const moduleNames = await fileStorageService.getModuleNames(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({
|
await queryClient.prefetchQuery({
|
||||||
queryKey: localCourseKeys.settings(courseName),
|
queryKey: localCourseKeys.settings(courseName),
|
||||||
queryFn: () => settings,
|
queryFn: () => settings,
|
||||||
@@ -23,4 +68,70 @@ export const hydrateCourse = async (
|
|||||||
queryKey: localCourseKeys.moduleNames(courseName),
|
queryKey: localCourseKeys.moduleNames(courseName),
|
||||||
queryFn: () => moduleNames,
|
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,
|
||||||
|
})
|
||||||
|
)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
)
|
||||||
|
);
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
import axios from "axios";
|
import axios from "axios";
|
||||||
import { localCourseKeys } from "./localCoursesHooks";
|
import { localCourseKeys } from "./localCourseKeys";
|
||||||
import { LocalAssignment } from "@/models/local/assignmnet/localAssignment";
|
import { LocalAssignment } from "@/models/local/assignmnet/localAssignment";
|
||||||
import { useSuspenseQuery, useSuspenseQueries } from "@tanstack/react-query";
|
import { useSuspenseQuery, useSuspenseQueries } from "@tanstack/react-query";
|
||||||
|
|
||||||
@@ -8,7 +8,7 @@ export const useAssignmentNamesQuery = (
|
|||||||
moduleName: string
|
moduleName: string
|
||||||
) =>
|
) =>
|
||||||
useSuspenseQuery({
|
useSuspenseQuery({
|
||||||
queryKey: localCourseKeys.moduleAssignmentNames(courseName, moduleName),
|
queryKey: localCourseKeys.assignmentNames(courseName, moduleName),
|
||||||
queryFn: async (): Promise<string[]> => {
|
queryFn: async (): Promise<string[]> => {
|
||||||
const url = `/api/courses/${courseName}/modules/${moduleName}/assignments`;
|
const url = `/api/courses/${courseName}/modules/${moduleName}/assignments`;
|
||||||
const response = await axios.get(url);
|
const response = await axios.get(url);
|
||||||
|
|||||||
55
nextjs/src/hooks/localCourse/localCourseKeys.ts
Normal file
55
nextjs/src/hooks/localCourse/localCourseKeys.ts
Normal file
@@ -0,0 +1,55 @@
|
|||||||
|
export const localCourseKeys = {
|
||||||
|
allCourses: ["all courses"] as const,
|
||||||
|
settings: (courseName: string) =>
|
||||||
|
["course details", courseName, "settings"] as const,
|
||||||
|
moduleNames: (courseName: string) =>
|
||||||
|
[
|
||||||
|
"course details",
|
||||||
|
courseName,
|
||||||
|
"modules",
|
||||||
|
{ type: "names" } as const,
|
||||||
|
] as const,
|
||||||
|
assignmentNames: (courseName: string, moduleName: string) =>
|
||||||
|
[
|
||||||
|
"course details",
|
||||||
|
courseName,
|
||||||
|
"modules",
|
||||||
|
moduleName,
|
||||||
|
"assignments",
|
||||||
|
] as const,
|
||||||
|
quizNames: (courseName: string, moduleName: string) =>
|
||||||
|
["course details", courseName, "modules", moduleName, "quizzes"] as const,
|
||||||
|
pageNames: (courseName: string, moduleName: string) =>
|
||||||
|
["course details", courseName, "modules", moduleName, "pages"] as const,
|
||||||
|
assignment: (
|
||||||
|
courseName: string,
|
||||||
|
moduleName: string,
|
||||||
|
assignmentName: string
|
||||||
|
) =>
|
||||||
|
[
|
||||||
|
"course details",
|
||||||
|
courseName,
|
||||||
|
"modules",
|
||||||
|
moduleName,
|
||||||
|
"assignments",
|
||||||
|
assignmentName,
|
||||||
|
] as const,
|
||||||
|
quiz: (courseName: string, moduleName: string, quizName: string) =>
|
||||||
|
[
|
||||||
|
"course details",
|
||||||
|
courseName,
|
||||||
|
"modules",
|
||||||
|
moduleName,
|
||||||
|
"quizzes",
|
||||||
|
quizName,
|
||||||
|
] as const,
|
||||||
|
page: (courseName: string, moduleName: string, pageName: string) =>
|
||||||
|
[
|
||||||
|
"course details",
|
||||||
|
courseName,
|
||||||
|
"modules",
|
||||||
|
moduleName,
|
||||||
|
"pages",
|
||||||
|
pageName,
|
||||||
|
] as const,
|
||||||
|
};
|
||||||
@@ -1,64 +1,13 @@
|
|||||||
import { LocalCourseSettings } from "@/models/local/localCourse";
|
import { LocalCourseSettings } from "@/models/local/localCourse";
|
||||||
import {
|
import { useSuspenseQuery } from "@tanstack/react-query";
|
||||||
useSuspenseQuery,
|
|
||||||
} from "@tanstack/react-query";
|
|
||||||
import axios from "axios";
|
import axios from "axios";
|
||||||
|
import { localCourseKeys } from "./localCourseKeys";
|
||||||
export const localCourseKeys = {
|
import {
|
||||||
allCourses: ["all courses"] as const,
|
useAssignmentNamesQuery,
|
||||||
settings: (courseName: string) =>
|
useAssignmentsQueries,
|
||||||
["course details", courseName, "settings"] as const,
|
} from "./assignmentHooks";
|
||||||
moduleNames: (courseName: string) =>
|
import { usePageNamesQuery, usePagesQueries } from "./pageHooks";
|
||||||
[
|
import { useQuizNamesQuery, useQuizzesQueries } from "./quizHooks";
|
||||||
"course details",
|
|
||||||
courseName,
|
|
||||||
"modules",
|
|
||||||
{ type: "names" } as const,
|
|
||||||
] as const,
|
|
||||||
moduleAssignmentNames: (courseName: string, moduleName: string) =>
|
|
||||||
[
|
|
||||||
"course details",
|
|
||||||
courseName,
|
|
||||||
"modules",
|
|
||||||
moduleName,
|
|
||||||
"assignments",
|
|
||||||
] as const,
|
|
||||||
moduleQuizzeNames: (courseName: string, moduleName: string) =>
|
|
||||||
["course details", courseName, "modules", moduleName, "quizzes"] as const,
|
|
||||||
modulePageNames: (courseName: string, moduleName: string) =>
|
|
||||||
["course details", courseName, "modules", moduleName, "pages"] as const,
|
|
||||||
assignment: (
|
|
||||||
courseName: string,
|
|
||||||
moduleName: string,
|
|
||||||
assignmentName: string
|
|
||||||
) =>
|
|
||||||
[
|
|
||||||
"course details",
|
|
||||||
courseName,
|
|
||||||
"modules",
|
|
||||||
moduleName,
|
|
||||||
"assignments",
|
|
||||||
assignmentName,
|
|
||||||
] as const,
|
|
||||||
quiz: (courseName: string, moduleName: string, quizName: string) =>
|
|
||||||
[
|
|
||||||
"course details",
|
|
||||||
courseName,
|
|
||||||
"modules",
|
|
||||||
moduleName,
|
|
||||||
"quizzes",
|
|
||||||
quizName,
|
|
||||||
] as const,
|
|
||||||
page: (courseName: string, moduleName: string, pageName: string) =>
|
|
||||||
[
|
|
||||||
"course details",
|
|
||||||
courseName,
|
|
||||||
"modules",
|
|
||||||
moduleName,
|
|
||||||
"pages",
|
|
||||||
pageName,
|
|
||||||
] as const,
|
|
||||||
};
|
|
||||||
|
|
||||||
export const useLocalCourseNamesQuery = () =>
|
export const useLocalCourseNamesQuery = () =>
|
||||||
useSuspenseQuery({
|
useSuspenseQuery({
|
||||||
@@ -90,7 +39,33 @@ export const useModuleNamesQuery = (courseName: string) =>
|
|||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
|
export const useModuleDataQuery = (courseName: string, moduleName: string) => {
|
||||||
|
const { data: assignmentNames } = useAssignmentNamesQuery(
|
||||||
|
courseName,
|
||||||
|
moduleName
|
||||||
|
);
|
||||||
|
const { data: quizNames } = useQuizNamesQuery(courseName, moduleName);
|
||||||
|
const { data: pageNames } = usePageNamesQuery(courseName, moduleName);
|
||||||
|
|
||||||
|
const { data: assignments } = useAssignmentsQueries(
|
||||||
|
courseName,
|
||||||
|
moduleName,
|
||||||
|
assignmentNames
|
||||||
|
);
|
||||||
|
const { data: quizzes } = useQuizzesQueries(
|
||||||
|
courseName,
|
||||||
|
moduleName,
|
||||||
|
quizNames
|
||||||
|
);
|
||||||
|
const { data: pages } = usePagesQueries(courseName, moduleName, pageNames);
|
||||||
|
|
||||||
|
|
||||||
|
return {
|
||||||
|
assignments,
|
||||||
|
quizzes,
|
||||||
|
pages,
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
// export const useUpdateCourseMutation = (courseName: string) => {
|
// export const useUpdateCourseMutation = (courseName: string) => {
|
||||||
// const queryClient = useQueryClient();
|
// const queryClient = useQueryClient();
|
||||||
|
|||||||
@@ -1,11 +1,11 @@
|
|||||||
import { LocalCoursePage } from "@/models/local/page/localCoursePage";
|
import { LocalCoursePage } from "@/models/local/page/localCoursePage";
|
||||||
import { useSuspenseQueries, useSuspenseQuery } from "@tanstack/react-query";
|
import { useSuspenseQueries, useSuspenseQuery } from "@tanstack/react-query";
|
||||||
import axios from "axios";
|
import axios from "axios";
|
||||||
import { localCourseKeys } from "./localCoursesHooks";
|
import { localCourseKeys } from "./localCourseKeys";
|
||||||
|
|
||||||
export const usePageNamesQuery = (courseName: string, moduleName: string) =>
|
export const usePageNamesQuery = (courseName: string, moduleName: string) =>
|
||||||
useSuspenseQuery({
|
useSuspenseQuery({
|
||||||
queryKey: localCourseKeys.modulePageNames(courseName, moduleName),
|
queryKey: localCourseKeys.pageNames(courseName, moduleName),
|
||||||
queryFn: async (): Promise<string[]> => {
|
queryFn: async (): Promise<string[]> => {
|
||||||
const url = `/api/courses/${courseName}/modules/${moduleName}/pages`;
|
const url = `/api/courses/${courseName}/modules/${moduleName}/pages`;
|
||||||
const response = await axios.get(url);
|
const response = await axios.get(url);
|
||||||
|
|||||||
@@ -1,11 +1,11 @@
|
|||||||
import { LocalQuiz } from "@/models/local/quiz/localQuiz";
|
import { LocalQuiz } from "@/models/local/quiz/localQuiz";
|
||||||
import { useSuspenseQueries, useSuspenseQuery } from "@tanstack/react-query";
|
import { useSuspenseQueries, useSuspenseQuery } from "@tanstack/react-query";
|
||||||
import axios from "axios";
|
import axios from "axios";
|
||||||
import { localCourseKeys } from "./localCoursesHooks";
|
import { localCourseKeys } from "./localCourseKeys";
|
||||||
|
|
||||||
export const useQuizNamesQuery = (courseName: string, moduleName: string) =>
|
export const useQuizNamesQuery = (courseName: string, moduleName: string) =>
|
||||||
useSuspenseQuery({
|
useSuspenseQuery({
|
||||||
queryKey: localCourseKeys.moduleQuizzeNames(courseName, moduleName),
|
queryKey: localCourseKeys.quizNames(courseName, moduleName),
|
||||||
queryFn: async (): Promise<string[]> => {
|
queryFn: async (): Promise<string[]> => {
|
||||||
const url = `/api/courses/${courseName}/modules/${moduleName}/quizzes`;
|
const url = `/api/courses/${courseName}/modules/${moduleName}/quizzes`;
|
||||||
const response = await axios.get(url);
|
const response = await axios.get(url);
|
||||||
|
|||||||
Reference in New Issue
Block a user