mirror of
https://github.com/alexmickelson/canvasManagement.git
synced 2026-03-25 23:28:33 -06:00
215 lines
6.0 KiB
TypeScript
215 lines
6.0 KiB
TypeScript
"use client";
|
|
import { useTRPC } from "@/services/serverFunctions/trpcClient";
|
|
import { useCourseContext } from "@/app/course/[courseName]/context/courseContext";
|
|
import {
|
|
extractImageSources,
|
|
markdownToHtmlNoImages,
|
|
} from "@/services/htmlMarkdownUtils";
|
|
import { useEffect, useState } from "react";
|
|
import {
|
|
useMutation,
|
|
useQueryClient,
|
|
useSuspenseQuery,
|
|
} from "@tanstack/react-query";
|
|
import {
|
|
useLocalCourseSettingsQuery,
|
|
useUpdateLocalCourseSettingsMutation,
|
|
} from "@/features/local/course/localCoursesHooks";
|
|
|
|
export const useAssignmentQuery = (
|
|
moduleName: string,
|
|
assignmentName: string
|
|
) => {
|
|
const { courseName } = useCourseContext();
|
|
const trpc = useTRPC();
|
|
return useSuspenseQuery(
|
|
trpc.assignment.getAssignment.queryOptions({
|
|
moduleName,
|
|
courseName,
|
|
assignmentName,
|
|
})
|
|
);
|
|
};
|
|
|
|
const enable_images = process.env.NEXT_PUBLIC_ENABLE_FILE_SYNC === "true";
|
|
|
|
export const useUpdateImageSettingsForAssignment = ({
|
|
moduleName,
|
|
assignmentName,
|
|
}: {
|
|
moduleName: string;
|
|
assignmentName: string;
|
|
}) => {
|
|
const { data: assignment } = useAssignmentQuery(moduleName, assignmentName);
|
|
const [isPending, setIsPending] = useState(false);
|
|
const addNewImagesToCanvasMutation = useAddNewImagesToCanvasMutation();
|
|
|
|
useEffect(() => {
|
|
if (!enable_images) {
|
|
console.log(
|
|
"not uploading images, NEXT_PUBLIC_ENABLE_FILE_SYNC is not set to true"
|
|
);
|
|
return;
|
|
}
|
|
|
|
if (isPending) {
|
|
console.log("not updating image assets, still loading");
|
|
return;
|
|
}
|
|
setIsPending(true);
|
|
const assignmentMarkdown = markdownToHtmlNoImages(assignment.description);
|
|
|
|
addNewImagesToCanvasMutation
|
|
.mutateAsync({
|
|
markdownString: assignmentMarkdown,
|
|
})
|
|
.then(() => setIsPending(false));
|
|
// not sure why mutation reference changes...
|
|
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
}, [assignment.description, isPending]);
|
|
return { isPending };
|
|
};
|
|
|
|
export const useAddNewImagesToCanvasMutation = () => {
|
|
const { data: settings } = useLocalCourseSettingsQuery();
|
|
const trpc = useTRPC();
|
|
const createCanvasUrlMutation = useMutation(
|
|
trpc.canvasFile.getCanvasFileUrl.mutationOptions()
|
|
);
|
|
const updateSettings = useUpdateLocalCourseSettingsMutation();
|
|
|
|
return useMutation({
|
|
mutationFn: async ({ markdownString }: { markdownString: string }) => {
|
|
const imageSources = extractImageSources(markdownString);
|
|
// console.log("original image urls", imageSources);
|
|
const newImages = imageSources.filter((source) =>
|
|
settings.assets.every((a) => a.sourceUrl !== source)
|
|
);
|
|
|
|
if (newImages.length === 0) {
|
|
console.log("no new images to upload");
|
|
return;
|
|
}
|
|
|
|
const newAssets = await Promise.all(
|
|
newImages.map(async (source) => {
|
|
console.log("uploading image to canvas", source);
|
|
const canvasUrl = await createCanvasUrlMutation.mutateAsync({
|
|
sourceUrl: source,
|
|
canvasCourseId: settings.canvasId,
|
|
});
|
|
console.log("got canvas url", source, canvasUrl);
|
|
return { sourceUrl: source, canvasUrl };
|
|
})
|
|
);
|
|
await updateSettings.mutateAsync({
|
|
settings: {
|
|
...settings,
|
|
assets: [...settings.assets, ...newAssets],
|
|
},
|
|
});
|
|
},
|
|
});
|
|
};
|
|
|
|
export const useAssignmentNamesQuery = (moduleName: string) => {
|
|
const { courseName } = useCourseContext();
|
|
const trpc = useTRPC();
|
|
return useSuspenseQuery({
|
|
...trpc.assignment.getAllAssignments.queryOptions({
|
|
moduleName,
|
|
courseName,
|
|
}),
|
|
select: (assignments) => assignments.map((a) => a.name),
|
|
});
|
|
};
|
|
|
|
export const useUpdateAssignmentMutation = () => {
|
|
const trpc = useTRPC();
|
|
const queryClient = useQueryClient();
|
|
return useMutation(
|
|
trpc.assignment.updateAssignment.mutationOptions({
|
|
onSuccess: (
|
|
_,
|
|
{
|
|
courseName,
|
|
moduleName,
|
|
assignmentName,
|
|
previousAssignmentName,
|
|
previousModuleName,
|
|
}
|
|
) => {
|
|
if (moduleName !== previousModuleName) {
|
|
queryClient.invalidateQueries({
|
|
queryKey: trpc.assignment.getAllAssignments.queryKey({
|
|
courseName,
|
|
moduleName: previousModuleName,
|
|
}),
|
|
});
|
|
}
|
|
queryClient.invalidateQueries({
|
|
queryKey: trpc.assignment.getAllAssignments.queryKey({
|
|
courseName,
|
|
moduleName,
|
|
}),
|
|
});
|
|
queryClient.invalidateQueries({
|
|
queryKey: trpc.assignment.getAssignment.queryKey({
|
|
courseName,
|
|
moduleName,
|
|
assignmentName,
|
|
}),
|
|
});
|
|
queryClient.invalidateQueries({
|
|
queryKey: trpc.assignment.getAssignment.queryKey({
|
|
courseName,
|
|
moduleName,
|
|
assignmentName: previousAssignmentName,
|
|
}),
|
|
});
|
|
},
|
|
})
|
|
);
|
|
};
|
|
|
|
export const useCreateAssignmentMutation = () => {
|
|
const trpc = useTRPC();
|
|
const queryClient = useQueryClient();
|
|
return useMutation(
|
|
trpc.assignment.createAssignment.mutationOptions({
|
|
onSuccess: (_result, { courseName, moduleName }) => {
|
|
queryClient.invalidateQueries({
|
|
queryKey: trpc.assignment.getAllAssignments.queryKey({
|
|
courseName,
|
|
moduleName,
|
|
}),
|
|
});
|
|
},
|
|
})
|
|
);
|
|
};
|
|
|
|
export const useDeleteAssignmentMutation = () => {
|
|
const trpc = useTRPC();
|
|
const queryClient = useQueryClient();
|
|
return useMutation(
|
|
trpc.assignment.deleteAssignment.mutationOptions({
|
|
onSuccess: (_result, { courseName, moduleName, assignmentName }) => {
|
|
queryClient.invalidateQueries({
|
|
queryKey: trpc.assignment.getAllAssignments.queryKey({
|
|
courseName,
|
|
moduleName,
|
|
}),
|
|
});
|
|
queryClient.invalidateQueries({
|
|
queryKey: trpc.assignment.getAssignment.queryKey({
|
|
courseName,
|
|
moduleName,
|
|
assignmentName,
|
|
}),
|
|
});
|
|
},
|
|
})
|
|
);
|
|
};
|