starting to move over settings

This commit is contained in:
2024-11-08 16:01:41 -07:00
parent 6fd5053ac5
commit 026ca3846f
35 changed files with 188 additions and 155 deletions

View File

@@ -1,16 +1,14 @@
import { NextRequest, NextResponse } from "next/server"; import { NextRequest, NextResponse } from "next/server";
import { axiosClient } from "@/services/axiosUtils"; import { axiosClient } from "@/services/axiosUtils";
import { withErrorHandling } from "@/services/withErrorHandling"; import { withErrorHandling } from "@/services/withErrorHandling";
import { import { isAxiosError } from "axios";
isAxiosError,
} from "axios";
const appendQueryParams = (url: URL, req: NextRequest) => { const appendQueryParams = (url: URL, req: NextRequest) => {
req.nextUrl.searchParams.forEach((value, key) => { req.nextUrl.searchParams.forEach((value, key) => {
url.searchParams.set(key, value); url.searchParams.set(key, value);
}); });
}; };
const getUrl = (params: { rest: string[] }, req: NextRequest) => { const getUrl = (params: { rest: string[] }, req: NextRequest) => {
const { rest } = params; const { rest } = params;
const path = rest.join("/"); const path = rest.join("/");
@@ -19,7 +17,8 @@ const getUrl = (params: { rest: string[] }, req: NextRequest) => {
appendQueryParams(url, req); appendQueryParams(url, req);
return url;}; return url;
};
const proxyResponseHeaders = (response: any) => { const proxyResponseHeaders = (response: any) => {
const headers = new Headers(); const headers = new Headers();
@@ -31,15 +30,13 @@ const proxyResponseHeaders = (response: any) => {
export async function GET( export async function GET(
req: NextRequest, req: NextRequest,
{ params }: { params: { rest: string[] } } { params }: { params: Promise<{ rest: string[] }> }
) { ) {
return withErrorHandling(async () => { return withErrorHandling(async () => {
try { try {
const url = getUrl(params, req); const url = getUrl(await params, req);
const response = await axiosClient.get( const response = await axiosClient.get(url.toString());
url.toString()
);
const headers = proxyResponseHeaders(response); const headers = proxyResponseHeaders(response);
return new NextResponse(JSON.stringify(response.data), { headers }); return new NextResponse(JSON.stringify(response.data), { headers });
@@ -54,10 +51,10 @@ export async function GET(
export async function POST( export async function POST(
req: NextRequest, req: NextRequest,
{ params }: { params: { rest: string[] } } { params }: { params: Promise<{ rest: string[] }> }
) { ) {
return withErrorHandling(async () => { return withErrorHandling(async () => {
const url = getUrl(params, req); const url = getUrl(await params, req);
const body = await req.json(); const body = await req.json();
let response; let response;
try { try {
@@ -83,10 +80,10 @@ export async function POST(
export async function PUT( export async function PUT(
req: NextRequest, req: NextRequest,
{ params }: { params: { rest: string[] } } { params }: { params: Promise<{ rest: string[] }> }
) { ) {
return withErrorHandling(async () => { return withErrorHandling(async () => {
const url = getUrl(params, req); const url = getUrl(await params, req);
const body = await req.json(); const body = await req.json();
try { try {
const response = await axiosClient.put(url.toString(), body); const response = await axiosClient.put(url.toString(), body);
@@ -118,11 +115,11 @@ export async function PUT(
export async function DELETE( export async function DELETE(
req: NextRequest, req: NextRequest,
{ params }: { params: { rest: string[] } } { params }: { params: Promise<{ rest: string[] }> }
) { ) {
return withErrorHandling(async () => { return withErrorHandling(async () => {
try { try {
const url = getUrl(params, req); const url = getUrl(await params, req);
const response = await axiosClient.delete(url.toString()); const response = await axiosClient.delete(url.toString());
const headers = proxyResponseHeaders(response); const headers = proxyResponseHeaders(response);

View File

@@ -3,7 +3,7 @@ import { useLocalCourseSettingsQuery } from "@/hooks/localCourse/localCoursesHoo
import Link from "next/link"; import Link from "next/link";
export function CourseNavigation() { export function CourseNavigation() {
const { data: settings } = useLocalCourseSettingsQuery(); const [settings] = useLocalCourseSettingsQuery();
return ( return (
<div className="pb-1 ps-5 flex flex-row gap-3"> <div className="pb-1 ps-5 flex flex-row gap-3">
<Link href={"/"} className="btn"> <Link href={"/"} className="btn">

View File

@@ -7,12 +7,16 @@ import { getCourseSettingsUrl } from "@/services/urlUtils";
export default function CourseSettingsLink() { export default function CourseSettingsLink() {
const { courseName } = useCourseContext(); const { courseName } = useCourseContext();
const { data: settings } = useLocalCourseSettingsQuery(); const [settings] = useLocalCourseSettingsQuery();
return ( return (
<div> <div>
{settings.name} {settings.name}
<Link className="mx-3 underline" href={getCourseSettingsUrl(courseName)} shallow={true}> <Link
className="mx-3 underline"
href={getCourseSettingsUrl(courseName)}
shallow={true}
>
Course Settings Course Settings
</Link> </Link>
</div> </div>

View File

@@ -11,7 +11,7 @@ export function CalendarWeek({
week: string[]; //date strings week: string[]; //date strings
monthNumber: number; monthNumber: number;
}) { }) {
const { data: settings } = useLocalCourseSettingsQuery(); const [settings]= useLocalCourseSettingsQuery();
const startDate = getDateFromStringOrThrow( const startDate = getDateFromStringOrThrow(
settings.startDate, settings.startDate,
"week calculation start date" "week calculation start date"

View File

@@ -7,7 +7,7 @@ import { useMemo } from "react";
import CalendarItemsContextProvider from "../context/CalendarItemsContextProvider"; import CalendarItemsContextProvider from "../context/CalendarItemsContextProvider";
export default function CourseCalendar() { export default function CourseCalendar() {
const { data: settings } = useLocalCourseSettingsQuery(); const [settings] = useLocalCourseSettingsQuery();
const startDateTime = useMemo( const startDateTime = useMemo(
() => getDateFromStringOrThrow(settings.startDate, "course start date"), () => getDateFromStringOrThrow(settings.startDate, "course start date"),

View File

@@ -19,7 +19,7 @@ export default function Day({ day, month }: { day: string; month: number }) {
getDateOnlyMarkdownString(new Date()) === getDateOnlyMarkdownString(new Date()) ===
getDateOnlyMarkdownString(dayAsDate); getDateOnlyMarkdownString(dayAsDate);
const { data: settings } = useLocalCourseSettingsQuery(); const [settings] = useLocalCourseSettingsQuery();
const { itemDropOnDay } = useDraggingContext(); const { itemDropOnDay } = useDraggingContext();
const { todaysAssignments, todaysQuizzes, todaysPages } = useTodaysItems(day); const { todaysAssignments, todaysQuizzes, todaysPages } = useTodaysItems(day);

View File

@@ -32,7 +32,7 @@ export function useItemDropOnDay({
setIsLoading: Dispatch<SetStateAction<boolean>>; setIsLoading: Dispatch<SetStateAction<boolean>>;
modal: { isOpen: boolean; openModal: () => void; closeModal: () => void }; modal: { isOpen: boolean; openModal: () => void; closeModal: () => void };
}) { }) {
const { data: settings } = useLocalCourseSettingsQuery(); const [settings] = useLocalCourseSettingsQuery();
// const { data: weeks } = useLecturesByWeekQuery(); // const { data: weeks } = useLecturesByWeekQuery();
const [weeks] = trpc.lectures.getLectures.useSuspenseQuery({ const [weeks] = trpc.lectures.getLectures.useSuspenseQuery({
courseName: settings.name, courseName: settings.name,

View File

@@ -11,17 +11,14 @@ export default function EditLectureTitle({
}: { }: {
lectureDay: string; lectureDay: string;
}) { }) {
const { data: settings } = useLocalCourseSettingsQuery(); const [settings] = useLocalCourseSettingsQuery();
const { courseName } = useCourseContext(); const { courseName } = useCourseContext();
const lectureDate = getDateFromString(lectureDay); const lectureDate = getDateFromString(lectureDay);
const lectureWeekName = getLectureWeekName(settings.startDate, lectureDay); const lectureWeekName = getLectureWeekName(settings.startDate, lectureDay);
return ( return (
<div className="flex justify-between sm:flex-row flex-col"> <div className="flex justify-between sm:flex-row flex-col">
<div className="my-auto"> <div className="my-auto">
<Link <Link className="btn hidden sm:inline" href={getCourseUrl(courseName)}>
className="btn hidden sm:inline"
href={getCourseUrl(courseName)}
>
{courseName} {courseName}
</Link> </Link>
</div> </div>

View File

@@ -14,7 +14,7 @@ import { lectureKeys } from "@/hooks/localCourse/lectureKeys";
export default function LectureButtons({ lectureDay }: { lectureDay: string }) { export default function LectureButtons({ lectureDay }: { lectureDay: string }) {
const queryClient = useQueryClient(); const queryClient = useQueryClient();
const { courseName } = useCourseContext(); const { courseName } = useCourseContext();
const { data: settings } = useLocalCourseSettingsQuery(); const [settings] = useLocalCourseSettingsQuery();
const router = useRouter(); const router = useRouter();
const [isLoading, setIsLoading] = useState(false); const [isLoading, setIsLoading] = useState(false);
const modal = useModal(); const modal = useModal();

View File

@@ -7,9 +7,9 @@ export default function ModuleList() {
const { data: moduleNames } = useModuleNamesQuery(); const { data: moduleNames } = useModuleNamesQuery();
return ( return (
<div> <div>
{moduleNames.map((m) => ( {/* {moduleNames.map((m) => (
<ExpandableModule key={m} moduleName={m} /> <ExpandableModule key={m} moduleName={m} />
))} ))} */}
<div className="flex flex-col justify-center"> <div className="flex flex-col justify-center">
<CreateModule /> <CreateModule />
</div> </div>

View File

@@ -27,7 +27,7 @@ export default function NewItemForm({
creationDate?: string; creationDate?: string;
onCreate?: () => void; onCreate?: () => void;
}) { }) {
const { data: settings } = useLocalCourseSettingsQuery(); const [settings] = useLocalCourseSettingsQuery();
const { courseName } = useCourseContext(); const { courseName } = useCourseContext();
const { data: modules } = useModuleNamesQuery(); const { data: modules } = useModuleNamesQuery();
const [type, setType] = useState<"Assignment" | "Quiz" | "Page">( const [type, setType] = useState<"Assignment" | "Quiz" | "Page">(

View File

@@ -29,7 +29,7 @@ export function AssignmentButtons({
}) { }) {
const router = useRouter(); const router = useRouter();
const { courseName } = useCourseContext(); const { courseName } = useCourseContext();
const { data: settings } = useLocalCourseSettingsQuery(); const [settings] = useLocalCourseSettingsQuery();
const { const {
data: canvasAssignments, data: canvasAssignments,
isPending: canvasIsPending, isPending: canvasIsPending,

View File

@@ -26,7 +26,7 @@ export default function EditAssignment({
}) { }) {
const router = useRouter(); const router = useRouter();
const { courseName } = useCourseContext(); const { courseName } = useCourseContext();
const { data: settings } = useLocalCourseSettingsQuery(); const [settings] = useLocalCourseSettingsQuery();
const [assignment] = useAssignmentQuery(moduleName, assignmentName); const [assignment] = useAssignmentQuery(moduleName, assignmentName);
const updateAssignment = useUpdateAssignmentMutation(); const updateAssignment = useUpdateAssignmentMutation();

View File

@@ -30,7 +30,7 @@ export default function EditPage({
localPageMarkdownUtils.toMarkdown(page) localPageMarkdownUtils.toMarkdown(page)
); );
const [error, setError] = useState(""); const [error, setError] = useState("");
const { data: settings } = useLocalCourseSettingsQuery(); const [settings] = useLocalCourseSettingsQuery();
useEffect(() => { useEffect(() => {
const delay = 500; const delay = 500;

View File

@@ -27,7 +27,7 @@ export default function EditPageButtons({
}) { }) {
const router = useRouter(); const router = useRouter();
const { courseName } = useCourseContext(); const { courseName } = useCourseContext();
const { data: settings } = useLocalCourseSettingsQuery(); const [settings] = useLocalCourseSettingsQuery();
const { data: page } = usePageQuery(moduleName, pageName); const { data: page } = usePageQuery(moduleName, pageName);
const { data: canvasPages } = useCanvasPagesQuery(); const { data: canvasPages } = useCanvasPagesQuery();
const createPageInCanvas = useCreateCanvasPageMutation(); const createPageInCanvas = useCreateCanvasPageMutation();

View File

@@ -6,7 +6,10 @@ import {
useAddQuizToCanvasMutation, useAddQuizToCanvasMutation,
useDeleteQuizFromCanvasMutation, useDeleteQuizFromCanvasMutation,
} from "@/hooks/canvas/canvasQuizHooks"; } from "@/hooks/canvas/canvasQuizHooks";
import { useDeleteItemMutation, useItemQuery } from "@/hooks/localCourse/courseItemHooks"; import {
useDeleteItemMutation,
useItemQuery,
} from "@/hooks/localCourse/courseItemHooks";
import { useLocalCourseSettingsQuery } from "@/hooks/localCourse/localCoursesHooks"; import { useLocalCourseSettingsQuery } from "@/hooks/localCourse/localCoursesHooks";
import { baseCanvasUrl } from "@/services/canvas/canvasServiceUtils"; import { baseCanvasUrl } from "@/services/canvas/canvasServiceUtils";
import { getCourseUrl } from "@/services/urlUtils"; import { getCourseUrl } from "@/services/urlUtils";
@@ -24,7 +27,7 @@ export function QuizButtons({
}) { }) {
const router = useRouter(); const router = useRouter();
const { courseName } = useCourseContext(); const { courseName } = useCourseContext();
const { data: settings } = useLocalCourseSettingsQuery(); const [settings] = useLocalCourseSettingsQuery();
const { data: canvasQuizzes } = useCanvasQuizzesQuery(); const { data: canvasQuizzes } = useCanvasQuizzesQuery();
const { data: quiz } = useItemQuery(moduleName, quizName, "Quiz"); const { data: quiz } = useItemQuery(moduleName, quizName, "Quiz");
const addToCanvas = useAddQuizToCanvasMutation(); const addToCanvas = useAddQuizToCanvasMutation();

View File

@@ -10,7 +10,7 @@ import TextInput from "../../../../components/form/TextInput";
import { useSetAssignmentGroupsMutation } from "@/hooks/canvas/canvasCourseHooks"; import { useSetAssignmentGroupsMutation } from "@/hooks/canvas/canvasCourseHooks";
export default function AssignmentGroupManagement() { export default function AssignmentGroupManagement() {
const { data: settings } = useLocalCourseSettingsQuery(); const [settings] = useLocalCourseSettingsQuery();
const updateSettings = useUpdateLocalCourseSettingsMutation(); const updateSettings = useUpdateLocalCourseSettingsMutation();
const applyInCanvas = useSetAssignmentGroupsMutation(settings.canvasId); // untested const applyInCanvas = useSetAssignmentGroupsMutation(settings.canvasId); // untested

View File

@@ -8,7 +8,7 @@ import {
import React from "react"; import React from "react";
export default function DaysOfWeekSettings() { export default function DaysOfWeekSettings() {
const { data: settings } = useLocalCourseSettingsQuery(); const [settings] = useLocalCourseSettingsQuery();
const updateSettings = useUpdateLocalCourseSettingsMutation(); const updateSettings = useUpdateLocalCourseSettingsMutation();
return ( return (

View File

@@ -9,7 +9,7 @@ import { useState } from "react";
import DefaultLockOffset from "./DefaultLockOffset"; import DefaultLockOffset from "./DefaultLockOffset";
export default function DefaultDueTime() { export default function DefaultDueTime() {
const { data: settings } = useLocalCourseSettingsQuery(); const [settings] = useLocalCourseSettingsQuery();
const updateSettings = useUpdateLocalCourseSettingsMutation(); const updateSettings = useUpdateLocalCourseSettingsMutation();
const [haveLockOffset, setHaveLockOffset] = useState( const [haveLockOffset, setHaveLockOffset] = useState(
!!settings.defaultLockHoursOffset !!settings.defaultLockHoursOffset

View File

@@ -7,7 +7,7 @@ import {
import { useState, useEffect } from "react"; import { useState, useEffect } from "react";
export default function DefaultFileUploadTypes() { export default function DefaultFileUploadTypes() {
const { data: settings } = useLocalCourseSettingsQuery(); const [settings] = useLocalCourseSettingsQuery();
const [defaultFileUploadTypes, setDefaultFileUploadTypes] = useState< const [defaultFileUploadTypes, setDefaultFileUploadTypes] = useState<
string[] string[]
>(settings.defaultFileUploadTypes); >(settings.defaultFileUploadTypes);

View File

@@ -8,7 +8,7 @@ import {
import { useEffect, useState } from "react"; import { useEffect, useState } from "react";
export default function DefaultLockOffset() { export default function DefaultLockOffset() {
const { data: settings } = useLocalCourseSettingsQuery(); const [settings] = useLocalCourseSettingsQuery();
const updateSettings = useUpdateLocalCourseSettingsMutation(); const updateSettings = useUpdateLocalCourseSettingsMutation();
const [hoursOffset, setHoursOffset] = useState( const [hoursOffset, setHoursOffset] = useState(
settings.defaultLockHoursOffset?.toString() ?? "0" settings.defaultLockHoursOffset?.toString() ?? "0"

View File

@@ -62,7 +62,7 @@ export default function HolidayConfig() {
); );
} }
function InnerHolidayConfig() { function InnerHolidayConfig() {
const { data: settings } = useLocalCourseSettingsQuery(); const [settings] = useLocalCourseSettingsQuery();
console.log(settings.holidays); console.log(settings.holidays);
const updateSettings = useUpdateLocalCourseSettingsMutation(); const updateSettings = useUpdateLocalCourseSettingsMutation();

View File

@@ -7,23 +7,20 @@ import { useCourseContext } from "../context/courseContext";
export default function SettingsHeader() { export default function SettingsHeader() {
const { courseName } = useCourseContext(); const { courseName } = useCourseContext();
const { data: settings } = useLocalCourseSettingsQuery(); const [settings] = useLocalCourseSettingsQuery();
return ( return (
<> <>
<div className="flex flex-row justify-between"> <div className="flex flex-row justify-between">
<div className="my-auto"> <div className="my-auto">
<Link className="btn" href={getCourseUrl(courseName)}>
<Link className="btn" href={getCourseUrl(courseName)}> Back To Course
Back To Course </Link>
</Link>
</div> </div>
<h3 className="text-center mb-3"> <h3 className="text-center mb-3">
{settings.name}{" "} {settings.name}{" "}
<span className="text-slate-500 text-xl"> settings</span> <span className="text-slate-500 text-xl"> settings</span>
</h3> </h3>
<div> <div></div>
</div>
</div> </div>
<hr /> <hr />
</> </>

View File

@@ -4,7 +4,7 @@ import { getDateOnlyMarkdownString } from "@/models/local/timeUtils";
import React from "react"; import React from "react";
export default function StartAndEndDate() { export default function StartAndEndDate() {
const { data: settings } = useLocalCourseSettingsQuery(); const [settings] = useLocalCourseSettingsQuery();
const startDate = new Date(settings.startDate); const startDate = new Date(settings.startDate);
const endDate = new Date(settings.endDate); const endDate = new Date(settings.endDate);
return ( return (

View File

@@ -11,7 +11,7 @@ import {
import React, { useEffect, useState } from "react"; import React, { useEffect, useState } from "react";
export default function SubmissionDefaults() { export default function SubmissionDefaults() {
const { data: settings } = useLocalCourseSettingsQuery(); const [settings] = useLocalCourseSettingsQuery();
const [defaultSubmissionTypes, setDefaultSubmissionTypes] = useState< const [defaultSubmissionTypes, setDefaultSubmissionTypes] = useState<
AssignmentSubmissionType[] AssignmentSubmissionType[]
>(settings.defaultAssignmentSubmissionTypes); >(settings.defaultAssignmentSubmissionTypes);
@@ -29,8 +29,6 @@ export default function SubmissionDefaults() {
} }
}, [defaultSubmissionTypes, settings, updateSettings]); }, [defaultSubmissionTypes, settings, updateSettings]);
return ( return (
<div className="border w-fit p-3 m-3 rounded-md"> <div className="border w-fit p-3 m-3 rounded-md">
<div className="text-center">Default Assignment Submission Type</div> <div className="text-center">Default Assignment Submission Type</div>

View File

@@ -33,7 +33,7 @@ export default async function RootLayout({
<MyToaster /> <MyToaster />
<Suspense> <Suspense>
<Providers> <Providers>
{children} <DataHydration>{children}</DataHydration>
</Providers> </Providers>
</Suspense> </Suspense>
</div> </div>
@@ -41,3 +41,52 @@ export default async function RootLayout({
</html> </html>
); );
} }
async function DataHydration({
children,
}: Readonly<{
children: React.ReactNode;
}>) {
console.log("starting hydration");
const trpcHelper = createServerSideHelpers({
router: trpcAppRouter,
ctx: createTrpcContext(),
transformer: superjson,
});
const allSettings = await fileStorageService.settings.getAllCoursesSettings();
await Promise.all(
allSettings.map(async (settings) => {
const courseName = settings.name;
const moduleNames = await fileStorageService.modules.getModuleNames(
courseName
);
await Promise.all(
moduleNames.map(
async (moduleName) =>
await trpcHelper.assignment.getAllAssignments.prefetch({
courseName,
moduleName,
})
)
);
})
);
await Promise.all(
allSettings.map(
async (settings) =>
await trpcHelper.lectures.getLectures.prefetch({
courseName: settings.name,
})
)
);
await hydrateCourses(trpcHelper.queryClient);
const dehydratedState = dehydrate(trpcHelper.queryClient);
console.log("ran hydration");
return (
<HydrationBoundary state={dehydratedState}>{children}</HydrationBoundary>
);
}

View File

@@ -1,70 +1,25 @@
import { hydrateCourses } from "@/hooks/hookHydration";
import { fileStorageService } from "@/services/fileStorage/fileStorageService";
import { createTrpcContext } from "@/services/trpc/context";
import { trpcAppRouter } from "@/services/trpc/router/app";
import { dehydrate, HydrationBoundary } from "@tanstack/react-query";
import { createServerSideHelpers } from "@trpc/react-query/server";
import CourseList from "./CourseList"; import CourseList from "./CourseList";
import AddNewCourse from "./newCourse/AddNewCourse"; import AddNewCourse from "./newCourse/AddNewCourse";
import TodaysLectures from "./todaysLectures/TodaysLectures"; import TodaysLectures from "./todaysLectures/TodaysLectures";
import superjson from "superjson";
import { trpc } from "@/services/trpc/utils";
export default async function Home() { export default async function Home() {
const trpcHelper = createServerSideHelpers({
router: trpcAppRouter,
ctx: createTrpcContext(),
transformer: superjson,
});
const allSettings = await fileStorageService.settings.getAllCoursesSettings();
await Promise.all(
allSettings.map(async (settings) => {
const courseName = settings.name;
const moduleNames = await fileStorageService.modules.getModuleNames(
courseName
);
await Promise.all(
moduleNames.map(
async (moduleName) =>
await trpcHelper.assignment.getAllAssignments.fetch({
courseName,
moduleName,
})
)
);
})
);
await Promise.all(
allSettings.map(
async (settings) =>
await trpcHelper.lectures.getLectures.prefetch({ courseName: settings.name })
)
);
await hydrateCourses(trpcHelper.queryClient);
const dehydratedState = dehydrate(trpcHelper.queryClient);
// console.log("dehydratedState", dehydratedState);
return ( return (
<HydrationBoundary state={dehydratedState}> <main className="h-full flex justify-center overflow-auto">
<main className="h-full flex justify-center overflow-auto"> <div className="xl:w-[900px] mx-auto">
<div className="xl:w-[900px] mx-auto"> <br />
<br /> <br />
<br /> <br />
<br /> <br />
<br /> <div className=" flex justify-center">
<div className=" flex justify-center"> <CourseList />
<CourseList />
</div>
<br />
<br />
<TodaysLectures />
<br />
<br />
<AddNewCourse />
</div> </div>
</main> <br />
</HydrationBoundary> <br />
<TodaysLectures />
<br />
<br />
<AddNewCourse />
</div>
</main>
); );
} }

View File

@@ -22,7 +22,7 @@ export const canvasAssignmentKeys = {
}; };
export const useCanvasAssignmentsQuery = () => { export const useCanvasAssignmentsQuery = () => {
const { data: settings } = useLocalCourseSettingsQuery(); const [settings] = useLocalCourseSettingsQuery();
return useSuspenseQuery({ return useSuspenseQuery({
queryKey: canvasAssignmentKeys.assignments(settings.canvasId), queryKey: canvasAssignmentKeys.assignments(settings.canvasId),
@@ -31,7 +31,7 @@ export const useCanvasAssignmentsQuery = () => {
}; };
// export const useCanvasAssignmentsQuery = () => { // export const useCanvasAssignmentsQuery = () => {
// const { data: settings } = useLocalCourseSettingsQuery(); // const [settings] = useLocalCourseSettingsQuery();
// const { data: allAssignments } = useInnerCanvasAssignmentsQuery(); // const { data: allAssignments } = useInnerCanvasAssignmentsQuery();
// return useSuspenseQueries({ // return useSuspenseQueries({
@@ -47,7 +47,7 @@ export const useCanvasAssignmentsQuery = () => {
// }; // };
export const useAddAssignmentToCanvasMutation = () => { export const useAddAssignmentToCanvasMutation = () => {
const { data: settings } = useLocalCourseSettingsQuery(); const [settings] = useLocalCourseSettingsQuery();
const { data: canvasModules } = useCanvasModulesQuery(); const { data: canvasModules } = useCanvasModulesQuery();
const addModule = useAddCanvasModuleMutation(); const addModule = useAddCanvasModuleMutation();
const queryClient = useQueryClient(); const queryClient = useQueryClient();
@@ -90,7 +90,7 @@ export const useAddAssignmentToCanvasMutation = () => {
}; };
export const useUpdateAssignmentInCanvasMutation = () => { export const useUpdateAssignmentInCanvasMutation = () => {
const { data: settings } = useLocalCourseSettingsQuery(); const [settings] = useLocalCourseSettingsQuery();
const queryClient = useQueryClient(); const queryClient = useQueryClient();
return useMutation({ return useMutation({
@@ -120,7 +120,7 @@ export const useUpdateAssignmentInCanvasMutation = () => {
}; };
export const useDeleteAssignmentFromCanvasMutation = () => { export const useDeleteAssignmentFromCanvasMutation = () => {
const { data: settings } = useLocalCourseSettingsQuery(); const [settings] = useLocalCourseSettingsQuery();
const queryClient = useQueryClient(); const queryClient = useQueryClient();
return useMutation({ return useMutation({
mutationFn: async ({ mutationFn: async ({

View File

@@ -11,7 +11,7 @@ export const canvasCourseModuleKeys = {
}; };
export const useCanvasModulesQuery = () => { export const useCanvasModulesQuery = () => {
const { data: settings } = useLocalCourseSettingsQuery(); const [settings] = useLocalCourseSettingsQuery();
return useSuspenseQuery({ return useSuspenseQuery({
queryKey: canvasCourseModuleKeys.modules(settings.canvasId), queryKey: canvasCourseModuleKeys.modules(settings.canvasId),
queryFn: async () => queryFn: async () =>
@@ -20,7 +20,7 @@ export const useCanvasModulesQuery = () => {
}; };
export const useAddCanvasModuleMutation = () => { export const useAddCanvasModuleMutation = () => {
const { data: settings } = useLocalCourseSettingsQuery(); const [settings] = useLocalCourseSettingsQuery();
const queryClient = useQueryClient(); const queryClient = useQueryClient();
return useMutation({ return useMutation({
mutationFn: async (moduleName: string) => mutationFn: async (moduleName: string) =>

View File

@@ -21,7 +21,7 @@ export const canvasPageKeys = {
}; };
export const useCanvasPagesQuery = () => { export const useCanvasPagesQuery = () => {
const { data: settings } = useLocalCourseSettingsQuery(); const [settings] = useLocalCourseSettingsQuery();
return useSuspenseQuery({ return useSuspenseQuery({
queryKey: canvasPageKeys.pagesInCourse(settings.canvasId), queryKey: canvasPageKeys.pagesInCourse(settings.canvasId),
queryFn: async () => await canvasPageService.getAll(settings.canvasId), queryFn: async () => await canvasPageService.getAll(settings.canvasId),
@@ -29,7 +29,7 @@ export const useCanvasPagesQuery = () => {
}; };
export const useCreateCanvasPageMutation = () => { export const useCreateCanvasPageMutation = () => {
const { data: settings } = useLocalCourseSettingsQuery(); const [settings] = useLocalCourseSettingsQuery();
const queryClient = useQueryClient(); const queryClient = useQueryClient();
const { data: canvasModules } = useCanvasModulesQuery(); const { data: canvasModules } = useCanvasModulesQuery();
const addModule = useAddCanvasModuleMutation(); const addModule = useAddCanvasModuleMutation();
@@ -69,7 +69,7 @@ export const useCreateCanvasPageMutation = () => {
}; };
export const useUpdateCanvasPageMutation = () => { export const useUpdateCanvasPageMutation = () => {
const { data: settings } = useLocalCourseSettingsQuery(); const [settings] = useLocalCourseSettingsQuery();
const queryClient = useQueryClient(); const queryClient = useQueryClient();
return useMutation({ return useMutation({
mutationFn: async ({ mutationFn: async ({
@@ -88,7 +88,7 @@ export const useUpdateCanvasPageMutation = () => {
}; };
export const useDeleteCanvasPageMutation = () => { export const useDeleteCanvasPageMutation = () => {
const { data: settings } = useLocalCourseSettingsQuery(); const [settings] = useLocalCourseSettingsQuery();
const queryClient = useQueryClient(); const queryClient = useQueryClient();
return useMutation({ return useMutation({
mutationFn: async (canvasPageId: number) => mutationFn: async (canvasPageId: number) =>

View File

@@ -6,7 +6,10 @@ import {
import { useLocalCourseSettingsQuery } from "../localCourse/localCoursesHooks"; import { useLocalCourseSettingsQuery } from "../localCourse/localCoursesHooks";
import { canvasQuizService } from "@/services/canvas/canvasQuizService"; import { canvasQuizService } from "@/services/canvas/canvasQuizService";
import { LocalQuiz } from "@/models/local/quiz/localQuiz"; import { LocalQuiz } from "@/models/local/quiz/localQuiz";
import { useAddCanvasModuleMutation, useCanvasModulesQuery } from "./canvasModuleHooks"; import {
useAddCanvasModuleMutation,
useCanvasModulesQuery,
} from "./canvasModuleHooks";
import { canvasModuleService } from "@/services/canvas/canvasModuleService"; import { canvasModuleService } from "@/services/canvas/canvasModuleService";
export const canvasQuizKeys = { export const canvasQuizKeys = {
@@ -15,7 +18,7 @@ export const canvasQuizKeys = {
}; };
export const useCanvasQuizzesQuery = () => { export const useCanvasQuizzesQuery = () => {
const { data: settings } = useLocalCourseSettingsQuery(); const [settings] = useLocalCourseSettingsQuery();
return useSuspenseQuery({ return useSuspenseQuery({
queryKey: canvasQuizKeys.quizzes(settings.canvasId), queryKey: canvasQuizKeys.quizzes(settings.canvasId),
@@ -24,7 +27,7 @@ export const useCanvasQuizzesQuery = () => {
}; };
export const useAddQuizToCanvasMutation = () => { export const useAddQuizToCanvasMutation = () => {
const { data: settings } = useLocalCourseSettingsQuery(); const [settings] = useLocalCourseSettingsQuery();
const queryClient = useQueryClient(); const queryClient = useQueryClient();
const { data: canvasModules } = useCanvasModulesQuery(); const { data: canvasModules } = useCanvasModulesQuery();
const addModule = useAddCanvasModuleMutation(); const addModule = useAddCanvasModuleMutation();
@@ -68,7 +71,7 @@ export const useAddQuizToCanvasMutation = () => {
}; };
export const useDeleteQuizFromCanvasMutation = () => { export const useDeleteQuizFromCanvasMutation = () => {
const { data: settings } = useLocalCourseSettingsQuery(); const [settings] = useLocalCourseSettingsQuery();
const queryClient = useQueryClient(); const queryClient = useQueryClient();
return useMutation({ return useMutation({
mutationFn: async (canvasQuizId: number) => { mutationFn: async (canvasQuizId: number) => {

View File

@@ -26,7 +26,7 @@ import { useLocalCourseSettingsQuery } from "./localCoursesHooks";
export const useLectureUpdateMutation = () => { export const useLectureUpdateMutation = () => {
const { courseName } = useCourseContext(); const { courseName } = useCourseContext();
const { data: settings } = useLocalCourseSettingsQuery(); const [settings] = useLocalCourseSettingsQuery();
const queryClient = useQueryClient(); const queryClient = useQueryClient();
return useMutation({ return useMutation({
mutationFn: async ({ mutationFn: async ({

View File

@@ -9,33 +9,35 @@ import { localCourseKeys } from "./localCourseKeys";
import { useCourseContext } from "@/app/course/[courseName]/context/courseContext"; import { useCourseContext } from "@/app/course/[courseName]/context/courseContext";
import { import {
createCourseOnServer, createCourseOnServer,
getAllCoursesSettingsFromServer,
updateCourseSettingsOnServer, updateCourseSettingsOnServer,
} from "./localCoursesServerActions"; } from "./localCoursesServerActions";
import { trpc } from "@/services/trpc/utils";
export const useLocalCoursesSettingsQuery = () => export const useLocalCoursesSettingsQuery = () =>
useSuspenseQuery({ trpc.settings.allCoursesSettings.useSuspenseQuery();
queryKey: localCourseKeys.allCoursesSettings, // useSuspenseQuery({
queryFn: async () => { // queryKey: localCourseKeys.allCoursesSettings,
return await getAllCoursesSettingsFromServer(); // queryFn: async () => {
}, // return await getAllCoursesSettingsFromServer();
}); // },
// });
export const useLocalCourseSettingsQuery = () => { export const useLocalCourseSettingsQuery = () => {
const { courseName } = useCourseContext(); const { courseName } = useCourseContext();
// const { data: settingsList } = useLocalCoursesSettingsQuery(); // const { data: settingsList } = useLocalCoursesSettingsQuery();
return useSuspenseQuery({ return trpc.settings.courseSettings.useSuspenseQuery({ courseName });
queryKey: localCourseKeys.settings(courseName), // return useSuspenseQuery({
queryFn: async () => { // queryKey: localCourseKeys.settings(courseName),
const settingsList = await getAllCoursesSettingsFromServer(); // queryFn: async () => {
const s = settingsList.find((s) => s.name === courseName); // const settingsList = await getAllCoursesSettingsFromServer();
if (!s) { // const s = settingsList.find((s) => s.name === courseName);
console.log(courseName, settingsList); // if (!s) {
throw Error("Could not find settings for course " + courseName); // console.log(courseName, settingsList);
} // throw Error("Could not find settings for course " + courseName);
return s; // }
}, // return s;
}); // },
// });
}; };
export const useCreateLocalCourseMutation = () => { export const useCreateLocalCourseMutation = () => {

View File

@@ -3,6 +3,7 @@ import publicProcedure from "../procedures/public";
import { createCallerFactory, router } from "../trpc"; import { createCallerFactory, router } from "../trpc";
import { assignmentRouter } from "./assignmentRouter"; import { assignmentRouter } from "./assignmentRouter";
import { lectureRouter } from "./lectureRouter"; import { lectureRouter } from "./lectureRouter";
import { settingsRouter } from "./settingsRouter";
export const helloRouter = router({ export const helloRouter = router({
sayHello: publicProcedure.query(() => { sayHello: publicProcedure.query(() => {
@@ -16,6 +17,7 @@ export const trpcAppRouter = router({
hello: helloRouter, hello: helloRouter,
assignment: assignmentRouter, assignment: assignmentRouter,
lectures: lectureRouter, lectures: lectureRouter,
settings: settingsRouter,
}); });
export const createCaller = createCallerFactory(trpcAppRouter); export const createCaller = createCallerFactory(trpcAppRouter);

View File

@@ -0,0 +1,26 @@
import publicProcedure from "../procedures/public";
import { z } from "zod";
import { router } from "../trpc";
import { fileStorageService } from "@/services/fileStorage/fileStorageService";
export const settingsRouter = router({
allCoursesSettings: publicProcedure.query(async () => {
return await fileStorageService.settings.getAllCoursesSettings();
}),
courseSettings: publicProcedure
.input(
z.object({
courseName: z.string(),
})
)
.query(async ({ input: { courseName } }) => {
const settingsList =
await fileStorageService.settings.getAllCoursesSettings();
const s = settingsList.find((s) => s.name === courseName);
if (!s) {
console.log(courseName, settingsList);
throw Error("Could not find settings for course " + courseName);
}
return s;
}),
});