mirror of
https://github.com/alexmickelson/canvasManagement.git
synced 2026-03-25 23:28:33 -06:00
am updateing course
This commit is contained in:
14
nextjs/src/app/api/courses/[courseName]/route.ts
Normal file
14
nextjs/src/app/api/courses/[courseName]/route.ts
Normal file
@@ -0,0 +1,14 @@
|
|||||||
|
import { fileStorageService } from "@/services/fileStorage/fileStorageService";
|
||||||
|
|
||||||
|
export async function PUT(
|
||||||
|
request: Request,
|
||||||
|
{ params: { courseName } }: { params: { courseName: string } }
|
||||||
|
) {
|
||||||
|
const { updatedCourse, previousCourse } = await request.json();
|
||||||
|
|
||||||
|
console.log(updatedCourse);
|
||||||
|
console.log(courseName);
|
||||||
|
|
||||||
|
await fileStorageService.saveCourseAsync(updatedCourse, previousCourse);
|
||||||
|
return Response.json({});
|
||||||
|
}
|
||||||
@@ -4,12 +4,17 @@ import { getDateFromStringOrThrow } from "@/models/local/timeUtils";
|
|||||||
import { useCourseContext } from "../context/courseContext";
|
import { useCourseContext } from "../context/courseContext";
|
||||||
|
|
||||||
export default function Day({ day, month }: { day: Date; month: number }) {
|
export default function Day({ day, month }: { day: Date; month: number }) {
|
||||||
const context = useCourseContext();
|
const {
|
||||||
|
localCourse: { modules },
|
||||||
|
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 = context.localCourse.modules
|
const todaysAssignments = modules
|
||||||
.flatMap((m) => m.assignments)
|
.flatMap((m) => m.assignments)
|
||||||
.filter((a) => {
|
.filter((a) => {
|
||||||
const dueDate = getDateFromStringOrThrow(
|
const dueDate = getDateFromStringOrThrow(
|
||||||
@@ -22,7 +27,7 @@ export default function Day({ day, month }: { day: Date; month: number }) {
|
|||||||
dueDate.getDate() === day.getDate()
|
dueDate.getDate() === day.getDate()
|
||||||
);
|
);
|
||||||
});
|
});
|
||||||
const todaysQuizzes = context.localCourse.modules
|
const todaysQuizzes = modules
|
||||||
.flatMap((m) => m.quizzes)
|
.flatMap((m) => m.quizzes)
|
||||||
.filter((q) => {
|
.filter((q) => {
|
||||||
const dueDate = getDateFromStringOrThrow(
|
const dueDate = getDateFromStringOrThrow(
|
||||||
@@ -35,7 +40,7 @@ export default function Day({ day, month }: { day: Date; month: number }) {
|
|||||||
dueDate.getDate() === day.getDate()
|
dueDate.getDate() === day.getDate()
|
||||||
);
|
);
|
||||||
});
|
});
|
||||||
const todaysPages = context.localCourse.modules
|
const todaysPages = modules
|
||||||
.flatMap((m) => m.pages)
|
.flatMap((m) => m.pages)
|
||||||
.filter((p) => {
|
.filter((p) => {
|
||||||
const dueDate = getDateFromStringOrThrow(
|
const dueDate = getDateFromStringOrThrow(
|
||||||
@@ -53,17 +58,34 @@ export default function Day({ day, month }: { day: Date; month: number }) {
|
|||||||
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
|
||||||
}
|
}
|
||||||
|
onDrop={() => itemDrop(day)}
|
||||||
|
onDragOver={(e) => e.preventDefault()}
|
||||||
>
|
>
|
||||||
{day.getDate()}
|
{day.getDate()}
|
||||||
<ul className="list-disc ms-4">
|
<ul className="list-disc ms-4">
|
||||||
{todaysAssignments.map((a) => (
|
{todaysAssignments.map((a) => (
|
||||||
<li key={a.name} >{a.name}</li>
|
<li key={a.name}>{a.name}</li>
|
||||||
))}
|
))}
|
||||||
{todaysQuizzes.map((q) => (
|
{todaysQuizzes.map((q) => (
|
||||||
<li key={q.name}>{q.name}</li>
|
<li
|
||||||
|
key={q.name}
|
||||||
|
role="button"
|
||||||
|
draggable="true"
|
||||||
|
onDragStart={() => startItemDrag({ type: "quiz", item: q })}
|
||||||
|
onDragEnd={endItemDrag}
|
||||||
|
>
|
||||||
|
{q.name}
|
||||||
|
</li>
|
||||||
))}
|
))}
|
||||||
{todaysPages.map((p) => (
|
{todaysPages.map((p) => (
|
||||||
<li key={p.name}>{p.name}</li>
|
<li
|
||||||
|
key={p.name}
|
||||||
|
role="button"
|
||||||
|
draggable="true"
|
||||||
|
// onDragStart={() => startItemDrag({ type: "page", item: p })}
|
||||||
|
>
|
||||||
|
{p.name}
|
||||||
|
</li>
|
||||||
))}
|
))}
|
||||||
</ul>
|
</ul>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -1,7 +1,13 @@
|
|||||||
"use client";
|
"use client";
|
||||||
import { ReactNode, useState } from "react";
|
import { ReactNode, useState } from "react";
|
||||||
import { CourseContext, DraggableItem } from "./courseContext";
|
import { CourseContext, DraggableItem } from "./courseContext";
|
||||||
import { useLocalCourseDetailsQuery } from "@/hooks/localCoursesHooks";
|
import {
|
||||||
|
useLocalCourseDetailsQuery,
|
||||||
|
useUpdateCourseMutation,
|
||||||
|
} from "@/hooks/localCoursesHooks";
|
||||||
|
import { LocalQuiz } from "@/models/local/quiz/localQuiz";
|
||||||
|
import { LocalCourse } from "@/models/local/localCourse";
|
||||||
|
import { dateToMarkdownString } from "@/models/local/timeUtils";
|
||||||
|
|
||||||
export default function CourseContextProvider({
|
export default function CourseContextProvider({
|
||||||
localCourseName,
|
localCourseName,
|
||||||
@@ -11,15 +17,59 @@ export default function CourseContextProvider({
|
|||||||
localCourseName: string;
|
localCourseName: string;
|
||||||
}) {
|
}) {
|
||||||
const { data: course } = useLocalCourseDetailsQuery(localCourseName);
|
const { data: course } = useLocalCourseDetailsQuery(localCourseName);
|
||||||
|
const updateCourseMutation = useUpdateCourseMutation(course.settings.name);
|
||||||
const [itemBeingDragged, setItemBeingDragged] = useState<
|
const [itemBeingDragged, setItemBeingDragged] = useState<
|
||||||
DraggableItem | undefined
|
DraggableItem | undefined
|
||||||
>();
|
>();
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<CourseContext.Provider
|
<CourseContext.Provider
|
||||||
value={{
|
value={{
|
||||||
localCourse: course,
|
localCourse: course,
|
||||||
startModuleDrag: (d) => setItemBeingDragged(d),
|
startItemDrag: (d) => {
|
||||||
stopModuleDrag: (day) => setItemBeingDragged(undefined),
|
console.log("starting drag");
|
||||||
|
setItemBeingDragged(d);
|
||||||
|
},
|
||||||
|
endItemDrag: () => {
|
||||||
|
console.log("stopping drag");
|
||||||
|
setItemBeingDragged(undefined);
|
||||||
|
},
|
||||||
|
itemDrop: (day) => {
|
||||||
|
console.log("dropping");
|
||||||
|
if (itemBeingDragged && day) {
|
||||||
|
if (itemBeingDragged.type === "quiz") {
|
||||||
|
const updatedQuiz: LocalQuiz = {
|
||||||
|
...(itemBeingDragged.item as LocalQuiz),
|
||||||
|
dueAt: dateToMarkdownString(day),
|
||||||
|
};
|
||||||
|
|
||||||
|
const localModule = course.modules.find((m) =>
|
||||||
|
m.quizzes.map((q) => q.name).includes(updatedQuiz.name)
|
||||||
|
);
|
||||||
|
if (!localModule)
|
||||||
|
console.log("could not find module for quiz ", updatedQuiz);
|
||||||
|
|
||||||
|
const updatedCourse: LocalCourse = {
|
||||||
|
...course,
|
||||||
|
modules: course.modules.map((m) =>
|
||||||
|
m.name !== localModule?.name
|
||||||
|
? m
|
||||||
|
: {
|
||||||
|
...m,
|
||||||
|
quizzes: m.quizzes.map((q) =>
|
||||||
|
q.name === updatedQuiz.name ? updatedQuiz : q
|
||||||
|
),
|
||||||
|
}
|
||||||
|
),
|
||||||
|
};
|
||||||
|
updateCourseMutation.mutate({
|
||||||
|
updatedCourse,
|
||||||
|
previousCourse: course,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
setItemBeingDragged(undefined);
|
||||||
|
},
|
||||||
}}
|
}}
|
||||||
>
|
>
|
||||||
{children}
|
{children}
|
||||||
|
|||||||
@@ -10,8 +10,9 @@ export interface DraggableItem {
|
|||||||
|
|
||||||
export interface CourseContextInterface {
|
export interface CourseContextInterface {
|
||||||
localCourse: LocalCourse;
|
localCourse: LocalCourse;
|
||||||
startModuleDrag: (dragging: DraggableItem) => void;
|
startItemDrag: (dragging: DraggableItem) => void;
|
||||||
stopModuleDrag: (droppedOnDay?: Date) => void;
|
endItemDrag: () => void;
|
||||||
|
itemDrop: (droppedOnDay?: Date) => void;
|
||||||
}
|
}
|
||||||
|
|
||||||
const defaultValue: CourseContextInterface = {
|
const defaultValue: CourseContextInterface = {
|
||||||
@@ -29,10 +30,9 @@ const defaultValue: CourseContextInterface = {
|
|||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
startModuleDrag: () => { },
|
startItemDrag: () => {},
|
||||||
stopModuleDrag: function (droppedOnDay?: Date): void {
|
endItemDrag: () => {},
|
||||||
throw new Error("Function not implemented.");
|
itemDrop: () => {},
|
||||||
}
|
|
||||||
};
|
};
|
||||||
|
|
||||||
export const CourseContext =
|
export const CourseContext =
|
||||||
|
|||||||
@@ -1,5 +1,10 @@
|
|||||||
import { LocalCourse } from "@/models/local/localCourse";
|
import { LocalCourse } from "@/models/local/localCourse";
|
||||||
import { useSuspenseQuery } from "@tanstack/react-query";
|
import {
|
||||||
|
dataTagSymbol,
|
||||||
|
useMutation,
|
||||||
|
useQueryClient,
|
||||||
|
useSuspenseQuery,
|
||||||
|
} from "@tanstack/react-query";
|
||||||
import axios from "axios";
|
import axios from "axios";
|
||||||
|
|
||||||
export const localCourseKeys = {
|
export const localCourseKeys = {
|
||||||
@@ -32,3 +37,22 @@ export const useLocalCourseDetailsQuery = (courseName: string) => {
|
|||||||
},
|
},
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
|
export const useUpdateCourseMutation = (courseName: string) => {
|
||||||
|
const queryClient = useQueryClient();
|
||||||
|
return useMutation({
|
||||||
|
mutationFn: async (body: {
|
||||||
|
updatedCourse: LocalCourse;
|
||||||
|
previousCourse: LocalCourse;
|
||||||
|
}) => {
|
||||||
|
const url = `/api/courses/${courseName}`;
|
||||||
|
await axios.put(url, body);
|
||||||
|
},
|
||||||
|
onSuccess: () => {
|
||||||
|
queryClient.invalidateQueries({ queryKey: localCourseKeys.allCourses }); //optimize?
|
||||||
|
},
|
||||||
|
scope: {
|
||||||
|
id: "update course",
|
||||||
|
},
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|||||||
Reference in New Issue
Block a user