This commit is contained in:
2024-09-19 14:22:45 -06:00
parent 40251062ed
commit 2ef7ec31b1
2 changed files with 101 additions and 34 deletions

View File

@@ -14,6 +14,12 @@ import { getLectureUrl, getModuleItemUrl } from "@/services/urlUtils";
import { LocalAssignment } from "@/models/local/assignment/localAssignment"; import { LocalAssignment } from "@/models/local/assignment/localAssignment";
import { LocalQuiz } from "@/models/local/quiz/localQuiz"; import { LocalQuiz } from "@/models/local/quiz/localQuiz";
import { LocalCoursePage } from "@/models/local/page/localCoursePage"; import { LocalCoursePage } from "@/models/local/page/localCoursePage";
import { useCanvasAssignmentsQuery } from "@/hooks/canvas/canvasAssignmentHooks";
import { CanvasAssignment } from "@/models/canvas/assignments/canvasAssignment";
import { useCanvasQuizzesQuery } from "@/hooks/canvas/canvasQuizHooks";
import { useCanvasPagesQuery } from "@/hooks/canvas/canvasPageHooks";
import { CanvasQuiz } from "@/models/canvas/quizzes/canvasQuizModel";
import { CanvasPage } from "@/models/canvas/pages/canvasPageModel";
export default function Day({ day, month }: { day: string; month: number }) { export default function Day({ day, month }: { day: string; month: number }) {
const dayAsDate = getDateFromStringOrThrow( const dayAsDate = getDateFromStringOrThrow(
@@ -22,14 +28,21 @@ export default function Day({ day, month }: { day: string; month: number }) {
); );
const { data: settings } = useLocalCourseSettingsQuery(); const { data: settings } = useLocalCourseSettingsQuery();
const { data: canvasAssignments } = useCanvasAssignmentsQuery();
const { data: canvasQuizzes } = useCanvasQuizzesQuery();
const { data: canvasPages } = useCanvasPagesQuery();
const itemsContext = useCalendarItemsContext(); const itemsContext = useCalendarItemsContext();
const { itemDrop } = useDraggingContext(); const { itemDrop } = useDraggingContext();
const dateKey = getDateOnlyMarkdownString(dayAsDate); const dateKey = getDateOnlyMarkdownString(dayAsDate);
const todaysModules = itemsContext[dateKey]; const todaysModules = itemsContext[dateKey];
const { todaysAssignments, todaysQuizzes, todaysPages } = const { todaysAssignments, todaysQuizzes, todaysPages } = getTodaysItems(
getTodaysItems(todaysModules); todaysModules,
canvasAssignments,
canvasQuizzes,
canvasPages
);
const isInSameMonth = dayAsDate.getMonth() + 1 == month; const isInSameMonth = dayAsDate.getMonth() + 1 == month;
@@ -46,28 +59,31 @@ export default function Day({ day, month }: { day: string; month: number }) {
> >
<DayTitle day={day} dayAsDate={dayAsDate} /> <DayTitle day={day} dayAsDate={dayAsDate} />
<div> <div>
{todaysAssignments.map(({ assignment, moduleName }) => ( {todaysAssignments.map(({ assignment, moduleName, status }) => (
<DraggableListItem <DraggableListItem
key={assignment.name} key={assignment.name}
type={"assignment"} type={"assignment"}
moduleName={moduleName} moduleName={moduleName}
item={assignment} item={assignment}
status={status}
/> />
))} ))}
{todaysQuizzes.map(({ quiz, moduleName }) => ( {todaysQuizzes.map(({ quiz, moduleName, status }) => (
<DraggableListItem <DraggableListItem
key={quiz.name} key={quiz.name}
type={"quiz"} type={"quiz"}
moduleName={moduleName} moduleName={moduleName}
item={quiz} item={quiz}
status={status}
/> />
))} ))}
{todaysPages.map(({ page, moduleName }) => ( {todaysPages.map(({ page, moduleName, status }) => (
<DraggableListItem <DraggableListItem
key={page.name} key={page.name}
type={"page"} type={"page"}
moduleName={moduleName} moduleName={moduleName}
item={page} item={page}
status={status}
/> />
))} ))}
</div> </div>
@@ -84,37 +100,80 @@ function DayTitle({ day, dayAsDate }: { day: string; dayAsDate: Date }) {
); );
} }
function getTodaysItems(todaysModules: { function getTodaysItems(
[moduleName: string]: { todaysModules: {
assignments: LocalAssignment[]; [moduleName: string]: {
quizzes: LocalQuiz[]; assignments: LocalAssignment[];
pages: LocalCoursePage[]; quizzes: LocalQuiz[];
}; pages: LocalCoursePage[];
}) { };
const todaysAssignments = todaysModules },
canvasAssignments: CanvasAssignment[],
canvasQuizzes: CanvasQuiz[],
canvasPages: CanvasPage[]
) {
const todaysAssignments: {
moduleName: string;
assignment: LocalAssignment;
status: "localOnly" | "unPublished" | "published";
}[] = todaysModules
? Object.keys(todaysModules).flatMap((moduleName) => ? Object.keys(todaysModules).flatMap((moduleName) =>
todaysModules[moduleName].assignments.map((assignment) => ({ todaysModules[moduleName].assignments.map((assignment) => {
moduleName, const canvasAssignment = canvasAssignments.find(
assignment, (c) => c.name === assignment.name
})) );
return {
moduleName,
assignment,
status: canvasAssignment
? canvasAssignment.published
? "published"
: "unPublished"
: "localOnly",
};
})
) )
: []; : [];
const todaysQuizzes = todaysModules const todaysQuizzes: {
moduleName: string;
quiz: LocalQuiz;
status: "localOnly" | "unPublished" | "published";
}[] = todaysModules
? Object.keys(todaysModules).flatMap((moduleName) => ? Object.keys(todaysModules).flatMap((moduleName) =>
todaysModules[moduleName].quizzes.map((quiz) => ({ todaysModules[moduleName].quizzes.map((quiz) => {
moduleName, const canvasQuiz = canvasQuizzes.find((q) => q.title === quiz.name);
quiz, return {
})) moduleName,
quiz,
status: canvasQuiz
? canvasQuiz.published
? "published"
: "unPublished"
: "localOnly",
};
})
) )
: []; : [];
const todaysPages = todaysModules const todaysPages: {
moduleName: string;
page: LocalCoursePage;
status: "localOnly" | "unPublished" | "published";
}[] = todaysModules
? Object.keys(todaysModules).flatMap((moduleName) => ? Object.keys(todaysModules).flatMap((moduleName) =>
todaysModules[moduleName].pages.map((page) => ({ todaysModules[moduleName].pages.map((page) => {
moduleName, const canvasPage = canvasPages.find((p) => p.title === page.name);
page, return {
})) moduleName,
page,
status: canvasPage
? canvasPage.published
? "published"
: "unPublished"
: "localOnly",
};
})
) )
: []; : [];
return { todaysAssignments, todaysQuizzes, todaysPages }; return { todaysAssignments, todaysQuizzes, todaysPages };
@@ -123,9 +182,11 @@ function getTodaysItems(todaysModules: {
function DraggableListItem({ function DraggableListItem({
type, type,
moduleName, moduleName,
status,
item, item,
}: { }: {
type: "assignment" | "page" | "quiz"; type: "assignment" | "page" | "quiz";
status: "localOnly" | "unPublished" | "published";
moduleName: string; moduleName: string;
item: IModuleItem; item: IModuleItem;
}) { }) {
@@ -136,8 +197,11 @@ function DraggableListItem({
shallow={true} shallow={true}
className={ className={
" border rounded-sm px-1 mx-1 break-all mb-1 " + " border rounded-sm px-1 mx-1 break-all mb-1 " +
" border-slate-600 bg-slate-800 " + " bg-slate-800 " +
" block " " block " +
(status === "localOnly" && " text-slate-500 border-slate-600 ") +
(status === "unPublished" && " border-rose-900 ") +
(status === "published" && " border-green-800 ")
} }
role="button" role="button"
draggable="true" draggable="true"

View File

@@ -1,6 +1,7 @@
import { LocalCoursePage } from "@/models/local/page/localCoursePage"; import { LocalCoursePage } from "@/models/local/page/localCoursePage";
import { canvasPageService } from "@/services/canvas/canvasPageService"; import { canvasPageService } from "@/services/canvas/canvasPageService";
import { useMutation, useQuery, useQueryClient } from "@tanstack/react-query"; import { useMutation, useQuery, useQueryClient, useSuspenseQuery } from "@tanstack/react-query";
import { useLocalCourseSettingsQuery } from "../localCourse/localCoursesHooks";
export const canvasPageKeys = { export const canvasPageKeys = {
pagesInCourse: (canvasCourseId: number) => [ pagesInCourse: (canvasCourseId: number) => [
@@ -10,11 +11,13 @@ export const canvasPageKeys = {
], ],
}; };
export const useCanvasPagesQuery = (canvasCourseId: number) => export const useCanvasPagesQuery = () => {
useQuery({ const { data: settings } = useLocalCourseSettingsQuery();
queryKey: canvasPageKeys.pagesInCourse(canvasCourseId), return useSuspenseQuery({
queryFn: async () => await canvasPageService.getAll(canvasCourseId), queryKey: canvasPageKeys.pagesInCourse(settings.canvasId),
queryFn: async () => await canvasPageService.getAll(settings.canvasId),
}); });
};
export const useCreateCanvasPageMutation = (canvasCourseId: number) => { export const useCreateCanvasPageMutation = (canvasCourseId: number) => {
const queryClient = useQueryClient(); const queryClient = useQueryClient();