diff --git a/nextjs/src/app/CourseList.tsx b/nextjs/src/app/CourseList.tsx
index 2d52137..2e9bbf5 100644
--- a/nextjs/src/app/CourseList.tsx
+++ b/nextjs/src/app/CourseList.tsx
@@ -1,9 +1,9 @@
-"use client"
-import { useLocalCoursesQuery } from "@/hooks/localCoursesHooks";
+"use client";
+import { useLocalCourseNamesQuery } from "@/hooks/localCoursesHooks";
import Link from "next/link";
export default function CourseList() {
- const { data: courses } = useLocalCoursesQuery();
+ const { data: courses } = useLocalCourseNamesQuery();
return (
{courses.map((c) => (
diff --git a/nextjs/src/app/api/courses/[courseName]/route.ts b/nextjs/src/app/api/courses/[courseName]/route.ts
index 66d0ab6..2898b58 100644
--- a/nextjs/src/app/api/courses/[courseName]/route.ts
+++ b/nextjs/src/app/api/courses/[courseName]/route.ts
@@ -12,3 +12,12 @@ export async function PUT(
await fileStorageService.saveCourseAsync(updatedCourse, previousCourse);
return Response.json({});
}
+
+export async function GET(
+ request: Request,
+ { params: { courseName } }: { params: { courseName: string } }
+) {
+ const courses = await fileStorageService.loadSavedCourses();
+ const course = courses.find((c) => c.settings.name === courseName);
+ return Response.json(course);
+}
diff --git a/nextjs/src/app/api/courses/route.ts b/nextjs/src/app/api/courses/route.ts
index ffdcd5d..656fe54 100644
--- a/nextjs/src/app/api/courses/route.ts
+++ b/nextjs/src/app/api/courses/route.ts
@@ -1,3 +1,6 @@
+import { fileStorageService } from "@/services/fileStorage/fileStorageService";
+
export async function GET() {
- return Response.json([]);
+ const courses = await fileStorageService.loadSavedCourses();
+ return Response.json(courses);
}
diff --git a/nextjs/src/app/course/[courseName]/context/CourseContextProvider.tsx b/nextjs/src/app/course/[courseName]/context/CourseContextProvider.tsx
index c3ebe64..ba99414 100644
--- a/nextjs/src/app/course/[courseName]/context/CourseContextProvider.tsx
+++ b/nextjs/src/app/course/[courseName]/context/CourseContextProvider.tsx
@@ -22,50 +22,53 @@ export default function CourseContextProvider({
DraggableItem | undefined
>();
+ const updateQuiz = (day: Date) => {
+ if (!itemBeingDragged) return;
+
+ 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,
+ });
+ };
return (
{
- 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,
- });
+ updateQuiz(day);
}
}
setItemBeingDragged(undefined);
diff --git a/nextjs/src/hooks/localCoursesHooks.ts b/nextjs/src/hooks/localCoursesHooks.ts
index 608d1f6..1e66276 100644
--- a/nextjs/src/hooks/localCoursesHooks.ts
+++ b/nextjs/src/hooks/localCoursesHooks.ts
@@ -1,6 +1,5 @@
import { LocalCourse } from "@/models/local/localCourse";
import {
- dataTagSymbol,
useMutation,
useQueryClient,
useSuspenseQuery,
@@ -9,10 +8,10 @@ import axios from "axios";
export const localCourseKeys = {
allCourses: ["all courses"] as const,
- courseDetail: (courseName: string) => ["all courses", courseName] as const,
+ courseDetail: (courseName: string) => ["course details", courseName] as const,
};
-export const useLocalCoursesQuery = () =>
+export const useLocalCourseNamesQuery = () =>
useSuspenseQuery({
queryKey: localCourseKeys.allCourses,
queryFn: async (): Promise => {
@@ -20,20 +19,16 @@ export const useLocalCoursesQuery = () =>
const response = await axios.get(url);
return response.data;
},
+ select: (courses) => courses.map((c) => c.settings.name),
});
export const useLocalCourseDetailsQuery = (courseName: string) => {
- const { data: courses } = useLocalCoursesQuery();
return useSuspenseQuery({
queryKey: localCourseKeys.courseDetail(courseName),
- queryFn: () => {
- const course = courses.find((c) => c.settings.name === courseName);
- if (!course) {
- console.log(courses);
- console.log(courseName);
- throw Error(`Could not find course with name ${courseName}`);
- }
- return course;
+ queryFn: async (): Promise => {
+ const url = `/api/courses/${courseName}`;
+ const response = await axios.get(url);
+ return response.data;
},
});
};
@@ -49,10 +44,12 @@ export const useUpdateCourseMutation = (courseName: string) => {
await axios.put(url, body);
},
onSuccess: () => {
- queryClient.invalidateQueries({ queryKey: localCourseKeys.allCourses }); //optimize?
+ queryClient.invalidateQueries({
+ queryKey: localCourseKeys.courseDetail(courseName),
+ });
},
scope: {
- id: "update course",
+ id: "all courses",
},
});
};