diff --git a/src/app/course/[courseName]/modules/[moduleName]/assignment/[assignmentName]/EditAssignment.tsx b/src/app/course/[courseName]/modules/[moduleName]/assignment/[assignmentName]/EditAssignment.tsx index 92caa09..8e2ac73 100644 --- a/src/app/course/[courseName]/modules/[moduleName]/assignment/[assignmentName]/EditAssignment.tsx +++ b/src/app/course/[courseName]/modules/[moduleName]/assignment/[assignmentName]/EditAssignment.tsx @@ -21,6 +21,7 @@ import { useRouter } from "next/navigation"; import { AssignmentFooterButtons } from "./AssignmentFooterButtons"; import { useAuthoritativeUpdates } from "@/app/course/[courseName]/utils/useAuthoritativeUpdates"; import EditAssignmentHeader from "./EditAssignmentHeader"; +import { Spinner } from "@/components/Spinner"; export default function EditAssignment({ moduleName, @@ -37,7 +38,8 @@ export default function EditAssignment({ { dataUpdatedAt: serverDataUpdatedAt, isFetching: assignmentIsFetching }, ] = useAssignmentQuery(moduleName, assignmentName); const updateAssignment = useUpdateAssignmentMutation(); - useUpdateImageSettingsForAssignment({ moduleName, assignmentName }); + const { isPending: imageUpdateIsPending } = + useUpdateImageSettingsForAssignment({ moduleName, assignmentName }); const { clientIsAuthoritative, @@ -152,6 +154,12 @@ export default function EditAssignment({
+ {imageUpdateIsPending && ( +
+ images being uploaded to canvas +
+ )} +
diff --git a/src/hooks/localCourse/assignmentHooks.ts b/src/hooks/localCourse/assignmentHooks.ts index b787f34..ab847c1 100644 --- a/src/hooks/localCourse/assignmentHooks.ts +++ b/src/hooks/localCourse/assignmentHooks.ts @@ -35,7 +35,7 @@ export const useUpdateImageSettingsForAssignment = ({ const [settings] = useLocalCourseSettingsQuery(); const [assignment] = useAssignmentQuery(moduleName, assignmentName); const updateSettings = useUpdateLocalCourseSettingsMutation(); - const [isUpdatingSettings, setIsUpdatingSettings] = useState(false); + const [isPending, setIsPending] = useState(false); const createCanvasUrlMutation = trpc.canvasFile.getCanvasFileUrl.useMutation(); @@ -45,18 +45,17 @@ export const useUpdateImageSettingsForAssignment = ({ return; } - if (isUpdatingSettings) { + if (isPending) { console.log("not updating image assets, still loading"); return; } - setIsUpdatingSettings(true); + setIsPending(true); const assignmentMarkdown = markdownToHtmlNoImages(assignment.description); const imageSources = extractImageSources(assignmentMarkdown); const imagesToUpdate = imageSources.filter((source) => settings.assets.every((a) => a.sourceUrl !== source) ); - console.log("images to update", imagesToUpdate); if (imagesToUpdate.length) { Promise.all( @@ -78,17 +77,20 @@ export const useUpdateImageSettingsForAssignment = ({ assets: [...settings.assets, ...newAssets], }, }); - setIsUpdatingSettings(false); + setIsPending(false); }); + } else { + setIsPending(false) } }, [ assignment.description, createCanvasUrlMutation, - isUpdatingSettings, + isPending, settings, settings.assets, updateSettings, ]); + return { isPending }; }; export const useAssignmentNamesQuery = (moduleName: string) => { diff --git a/src/services/canvas/canvasAssignmentService.ts b/src/services/canvas/canvasAssignmentService.ts index 5b420f3..62f4383 100644 --- a/src/services/canvas/canvasAssignmentService.ts +++ b/src/services/canvas/canvasAssignmentService.ts @@ -29,6 +29,7 @@ export const canvasAssignmentService = { ) { console.log(`Creating assignment: ${localAssignment.name}`); const url = `${canvasApi}/courses/${canvasCourseId}/assignments`; + const content = markdownToHTMLSafe(localAssignment.description, settings); const body = { assignment: { name: localAssignment.name, @@ -38,7 +39,7 @@ export const canvasAssignmentService = { allowed_extensions: localAssignment.allowedFileUploadExtensions.map( (e) => e.toString() ), - description: markdownToHTMLSafe(localAssignment.description, settings), + description: content, due_at: getDateFromString(localAssignment.dueAt)?.toISOString(), lock_at: localAssignment.lockAt && diff --git a/src/services/htmlMarkdownUtils.ts b/src/services/htmlMarkdownUtils.ts index 93afe67..bbb6bc9 100644 --- a/src/services/htmlMarkdownUtils.ts +++ b/src/services/htmlMarkdownUtils.ts @@ -1,13 +1,15 @@ "use client"; import { marked } from "marked"; -import DOMPurify from "isomorphic-dompurify"; +import DOMPurify from "isomorphic-dompurify"; import { LocalCourseSettings } from "@/models/local/localCourseSettings"; import markedKatex from "marked-katex-extension"; -marked.use(markedKatex({ - throwOnError: false, - output: "mathml" -})); +marked.use( + markedKatex({ + throwOnError: false, + output: "mathml", + }) +); export function extractImageSources(htmlString: string) { const srcUrls = []; @@ -46,7 +48,8 @@ export function markdownToHTMLSafe( markdownString: string, settings: LocalCourseSettings ) { - return markdownToHtmlNoImages(markdownString); + const html = markdownToHtmlNoImages(markdownString); + return convertImagesToCanvasImages(html, settings); } export function markdownToHtmlNoImages(markdownString: string) { diff --git a/src/services/serverFunctions/router/canvasFileRouter.ts b/src/services/serverFunctions/router/canvasFileRouter.ts index bf063df..2e7253d 100644 --- a/src/services/serverFunctions/router/canvasFileRouter.ts +++ b/src/services/serverFunctions/router/canvasFileRouter.ts @@ -7,6 +7,8 @@ import { uploadToCanvasPart2, } from "@/services/canvas/files/canvasFileService"; +const fileStorageLocation = process.env.FILE_STORAGE_LOCATION ?? "/app/public"; + export const canvasFileRouter = router({ getCanvasFileUrl: publicProcedure .input( @@ -16,15 +18,17 @@ export const canvasFileRouter = router({ }) ) .mutation(async ({ input: { sourceUrl, canvasCourseId } }) => { - const localTempFile = await downloadUrlToTempDirectory(sourceUrl); - console.log("local temp file", localTempFile); + const localFile = sourceUrl.startsWith("/") + ? fileStorageLocation + sourceUrl + : await downloadUrlToTempDirectory(sourceUrl); + console.log("local temp file", localFile); const { upload_url, upload_params } = await uploadToCanvasPart1( - localTempFile, + localFile, canvasCourseId ); console.log("part 1 done", upload_url, upload_params); const canvasUrl = await uploadToCanvasPart2({ - pathToUpload: localTempFile, + pathToUpload: localFile, upload_url, upload_params, });