"use client"; import { usePagesQueries } from "@/features/local/pages/pageHooks"; import { IModuleItem } from "@/features/local/modules/IModuleItem"; import { getDateFromString, getDateFromStringOrThrow, getDateOnlyMarkdownString, } from "@/features/local/utils/timeUtils"; import { Fragment } from "react"; import Modal, { useModal } from "../../../../components/Modal"; import NewItemForm from "./NewItemForm"; import { ModuleCanvasStatus } from "./ModuleCanvasStatus"; import ClientOnly from "@/components/ClientOnly"; import ExpandIcon from "../../../../components/icons/ExpandIcon"; import { DraggableItem, useDraggingContext, } from "../context/drag/draggingContext"; import Link from "next/link"; import { getModuleItemUrl } from "@/services/urlUtils"; import { useCourseContext } from "../context/courseContext"; import { Expandable } from "../../../../components/Expandable"; import { useDragStyleContext } from "../context/drag/dragStyleContext"; import { useQuizzesQueries } from "@/features/local/quizzes/quizHooks"; import { useTRPC } from "@/services/serverFunctions/trpcClient"; import { useSuspenseQueries } from "@tanstack/react-query"; import { useAssignmentNamesQuery } from "@/features/local/assignments/assignmentHooks"; import { useReorderCanvasModuleItemsMutation } from "@/features/canvas/hooks/canvasModuleHooks"; import { useCanvasModulesQuery } from "@/features/canvas/hooks/canvasModuleHooks"; import { Spinner } from "@/components/Spinner"; export default function ExpandableModule({ moduleName, }: { moduleName: string; }) { const trpc = useTRPC(); const { itemDropOnModule } = useDraggingContext(); const { courseName } = useCourseContext(); const { data: assignmentNames } = useAssignmentNamesQuery(moduleName); const assignmentsQueries = useSuspenseQueries({ queries: assignmentNames.map((assignmentName) => trpc.assignment.getAssignment.queryOptions({ courseName, moduleName, assignmentName, }) ), }); const assignments = assignmentsQueries.map((result) => result.data); const { data: quizzes } = useQuizzesQueries(moduleName); const { data: pages } = usePagesQueries(moduleName); const modal = useModal(); const reorderMutation = useReorderCanvasModuleItemsMutation(); const { data: canvasModules } = useCanvasModulesQuery(); const moduleItems: { type: "assignment" | "quiz" | "page"; item: IModuleItem; }[] = (assignments ?? []) .map( ( a ): { type: "assignment" | "quiz" | "page"; item: IModuleItem; } => ({ type: "assignment", item: a, }) ) .concat(quizzes.map((q) => ({ type: "quiz", item: q }))) .concat(pages.map((p) => ({ type: "page", item: p }))) .sort( (a, b) => getDateFromStringOrThrow( a.item.dueAt, "item due date in expandable module" ).getTime() - getDateFromStringOrThrow( b.item.dueAt, "item due date in expandable module" ).getTime() ); return (
itemDropOnModule(e, moduleName)} onDragOver={(e) => e.preventDefault()} >
(
setIsExpanded((e) => !e)} >
{moduleName}
)} > <> {!reorderMutation.isPending && ( )} {reorderMutation.isPending && } {({ closeModal }) => (

)}
{moduleItems.map(({ type, item }) => ( ))}
); } function ExpandableModuleItem({ type, item, moduleName, }: { type: "assignment" | "quiz" | "page"; item: IModuleItem; moduleName: string; }) { const { courseName } = useCourseContext(); const date = getDateFromString(item.dueAt); const { setIsDragging } = useDragStyleContext(); return (
{date && getDateOnlyMarkdownString(date)}
{ const draggableItem: DraggableItem = { type, item, sourceModuleName: moduleName, }; e.dataTransfer.setData( "draggableItem", JSON.stringify(draggableItem) ); setIsDragging(true); }} > {item.name}
); }