From 10afc745a9fb83839989e67a597acf8bd70b95b1 Mon Sep 17 00:00:00 2001 From: Alex Mickelson Date: Wed, 28 Aug 2024 14:22:56 -0600 Subject: [PATCH] updates --- nextjs/src/app/CourseList.tsx | 6 +- .../src/app/api/courses/[courseName]/route.ts | 9 +++ nextjs/src/app/api/courses/route.ts | 5 +- .../context/CourseContextProvider.tsx | 63 ++++++++++--------- nextjs/src/hooks/localCoursesHooks.ts | 25 ++++---- 5 files changed, 60 insertions(+), 48 deletions(-) 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", }, }); };