diff --git a/nextjs/src/app/api/courses/[courseName]/modules/[moduleName]/pages/[pageName]/route.ts b/nextjs/src/app/api/courses/[courseName]/modules/[moduleName]/pages/[pageName]/route.ts index 5f5eb3a..9544ee3 100644 --- a/nextjs/src/app/api/courses/[courseName]/modules/[moduleName]/pages/[pageName]/route.ts +++ b/nextjs/src/app/api/courses/[courseName]/modules/[moduleName]/pages/[pageName]/route.ts @@ -16,27 +16,48 @@ export const GET = async ( return Response.json(settings); }); - export const PUT = async ( - request: Request, - { - params: { courseName, moduleName, pageName }, - }: { params: { courseName: string; moduleName: string; pageName: string } } - ) => - await withErrorHandling(async () => { - const page = await request.json(); - await fileStorageService.pages.updatePage(courseName, moduleName, pageName, page); - return Response.json({}); - }); +export const PUT = async ( + request: Request, + { + params: { courseName, moduleName, pageName }, + }: { params: { courseName: string; moduleName: string; pageName: string } } +) => + await withErrorHandling(async () => { + const { page, previousModuleName, previousPageName } = await request.json(); + await fileStorageService.pages.updatePage( + courseName, + moduleName, + pageName, + page + ); - export const POST = async ( - request: Request, - { - params: { courseName, moduleName, pageName }, - }: { params: { courseName: string; moduleName: string; pageName: string } } - ) => - await withErrorHandling(async () => { - const page = await request.json(); - await fileStorageService.pages.updatePage(courseName, moduleName, pageName, page); - return Response.json({}); + if ( + previousModuleName && + previousPageName && + (page.name !== previousPageName || moduleName !== previousModuleName) + ) { + fileStorageService.pages.delete({ + courseName, + moduleName: previousModuleName, + pageName: previousPageName, }); - \ No newline at end of file + } + return Response.json({}); + }); + +export const POST = async ( + request: Request, + { + params: { courseName, moduleName, pageName }, + }: { params: { courseName: string; moduleName: string; pageName: string } } +) => + await withErrorHandling(async () => { + const page = await request.json(); + await fileStorageService.pages.updatePage( + courseName, + moduleName, + pageName, + page + ); + return Response.json({}); + }); diff --git a/nextjs/src/app/course/[courseName]/modules/ExpandableModule.tsx b/nextjs/src/app/course/[courseName]/modules/ExpandableModule.tsx index a24d02a..f6ea7df 100644 --- a/nextjs/src/app/course/[courseName]/modules/ExpandableModule.tsx +++ b/nextjs/src/app/course/[courseName]/modules/ExpandableModule.tsx @@ -122,6 +122,7 @@ export default function ExpandableModule({
{moduleItems.map(({ type, item }) => ( { + if (updatedPage.name !== pageName) + router.push( + getModuleItemUrl( + courseName, + moduleName, + "page", + updatedPage.name + ) + ); + }); } setError(""); } catch (e: any) { @@ -70,10 +89,7 @@ export default function EditPage({
{settings.canvasId && ( - + )} diff --git a/nextjs/src/app/course/[courseName]/modules/[moduleName]/quiz/[quizName]/EditQuiz.tsx b/nextjs/src/app/course/[courseName]/modules/[moduleName]/quiz/[quizName]/EditQuiz.tsx index f95932a..34b92ab 100644 --- a/nextjs/src/app/course/[courseName]/modules/[moduleName]/quiz/[quizName]/EditQuiz.tsx +++ b/nextjs/src/app/course/[courseName]/modules/[moduleName]/quiz/[quizName]/EditQuiz.tsx @@ -10,6 +10,9 @@ import QuizPreview from "./QuizPreview"; import { QuizButtons } from "./QuizButton"; import ClientOnly from "@/components/ClientOnly"; import { SuspenseAndErrorHandling } from "@/components/SuspenseAndErrorHandling"; +import { useRouter } from "next/navigation"; +import { getModuleItemUrl } from "@/services/urlUtils"; +import { useCourseContext } from "@/app/course/[courseName]/context/courseContext"; const helpString = `QUESTION REFERENCE --- @@ -59,6 +62,8 @@ export default function EditQuiz({ quizName: string; moduleName: string; }) { + const router = useRouter(); + const { courseName } = useCourseContext(); const { data: quiz } = useQuizQuery(moduleName, quizName); const updateQuizMutation = useUpdateQuizMutation(); const [quizText, setQuizText] = useState(quizMarkdownUtils.toMarkdown(quiz)); @@ -67,7 +72,7 @@ export default function EditQuiz({ useEffect(() => { const delay = 1000; - const handler = setTimeout(() => { + const handler = setTimeout(async () => { try { console.log("checking if the same..."); if ( @@ -77,11 +82,25 @@ export default function EditQuiz({ ) ) { const updatedQuiz = quizMarkdownUtils.parseMarkdown(quizText); - updateQuizMutation.mutate({ - quiz: updatedQuiz, - moduleName, - quizName, - }); + updateQuizMutation + .mutateAsync({ + quiz: updatedQuiz, + moduleName, + quizName: updatedQuiz.name, + previousModuleName: moduleName, + previousQuizName: quizName, + }) + .then(() => { + if (updatedQuiz.name !== quizName) + router.push( + getModuleItemUrl( + courseName, + moduleName, + "quiz", + updatedQuiz.name + ) + ); + }); } setError(""); } catch (e: any) { @@ -92,7 +111,7 @@ export default function EditQuiz({ return () => { clearTimeout(handler); }; - }, [moduleName, quiz, quizName, quizText, updateQuizMutation]); + }, [courseName, moduleName, quiz, quizName, quizText, router, updateQuizMutation]); return (
diff --git a/nextjs/src/hooks/localCourse/pageHooks.ts b/nextjs/src/hooks/localCourse/pageHooks.ts index 5877748..51e6898 100644 --- a/nextjs/src/hooks/localCourse/pageHooks.ts +++ b/nextjs/src/hooks/localCourse/pageHooks.ts @@ -123,15 +123,19 @@ export const useUpdatePageMutation = () => { encodeURIComponent(moduleName) + "/pages/" + encodeURIComponent(pageName); - await axiosClient.put(url, page); + await axiosClient.put(url, { + page, + previousModuleName, + previousPageName, + }); }, onSuccess: (_, { moduleName, pageName }) => { queryClient.invalidateQueries({ queryKey: localCourseKeys.page(courseName, moduleName, pageName), }); - queryClient.invalidateQueries({ - queryKey: localCourseKeys.pageNames(courseName, moduleName), - }); + // queryClient.invalidateQueries({ + // queryKey: localCourseKeys.pageNames(courseName, moduleName), + // }); }, }); }; diff --git a/nextjs/src/services/fileStorage/pageFileStorageService.ts b/nextjs/src/services/fileStorage/pageFileStorageService.ts index 01cc56c..1568c60 100644 --- a/nextjs/src/services/fileStorage/pageFileStorageService.ts +++ b/nextjs/src/services/fileStorage/pageFileStorageService.ts @@ -65,4 +65,23 @@ export const pageFileStorageService = { await fs.unlink(oldFilePath); } }, + async delete({ + courseName, + moduleName, + pageName, + }: { + courseName: string; + moduleName: string; + pageName: string; + }) { + const filePath = path.join( + basePath, + courseName, + moduleName, + "pages", + pageName + ".md" + ); + console.log("removing page", filePath); + await fs.unlink(filePath) + } }; \ No newline at end of file