mirror of
https://github.com/alexmickelson/canvasManagement.git
synced 2026-03-25 23:28:33 -06:00
fixing authority on server
This commit is contained in:
@@ -1,5 +1,4 @@
|
|||||||
"use client";
|
"use client";
|
||||||
|
|
||||||
import { MonacoEditor } from "@/components/editor/MonacoEditor";
|
import { MonacoEditor } from "@/components/editor/MonacoEditor";
|
||||||
import {
|
import {
|
||||||
useLecturesSuspenseQuery,
|
useLecturesSuspenseQuery,
|
||||||
@@ -9,47 +8,63 @@ import {
|
|||||||
lectureToString,
|
lectureToString,
|
||||||
parseLecture,
|
parseLecture,
|
||||||
} from "@/services/fileStorage/utils/lectureUtils";
|
} from "@/services/fileStorage/utils/lectureUtils";
|
||||||
import { useEffect, useState } from "react";
|
import { useCallback, useEffect, useState } from "react";
|
||||||
import LecturePreview from "./LecturePreview";
|
import LecturePreview from "./LecturePreview";
|
||||||
import EditLectureTitle from "./EditLectureTitle";
|
import EditLectureTitle from "./EditLectureTitle";
|
||||||
import LectureButtons from "./LectureButtons";
|
import LectureButtons from "./LectureButtons";
|
||||||
import { useCourseContext } from "../../context/courseContext";
|
import { useCourseContext } from "../../context/courseContext";
|
||||||
import { useLocalCourseSettingsQuery } from "@/hooks/localCourse/localCoursesHooks";
|
import { useLocalCourseSettingsQuery } from "@/hooks/localCourse/localCoursesHooks";
|
||||||
|
import { Lecture } from "@/models/local/lecture";
|
||||||
|
|
||||||
export default function EditLecture({ lectureDay }: { lectureDay: string }) {
|
export default function EditLecture({ lectureDay }: { lectureDay: string }) {
|
||||||
const [_, {dataUpdatedAt}] = useLecturesSuspenseQuery();
|
|
||||||
return (
|
|
||||||
<InnerEditLecture key={dataUpdatedAt} lectureDay={lectureDay} />
|
|
||||||
);
|
|
||||||
}
|
|
||||||
export function InnerEditLecture({ lectureDay }: { lectureDay: string }) {
|
|
||||||
const { courseName } = useCourseContext();
|
const { courseName } = useCourseContext();
|
||||||
const [settings] = useLocalCourseSettingsQuery();
|
const [settings] = useLocalCourseSettingsQuery();
|
||||||
const [weeks] = useLecturesSuspenseQuery();
|
const [weeks, { dataUpdatedAt: serverDataUpdatedAt }] =
|
||||||
|
useLecturesSuspenseQuery();
|
||||||
const updateLecture = useLectureUpdateMutation();
|
const updateLecture = useLectureUpdateMutation();
|
||||||
|
|
||||||
const lecture = weeks
|
const lecture = weeks
|
||||||
.flatMap(({ lectures }) => lectures.map((lecture) => lecture))
|
.flatMap(({ lectures }) => lectures.map((lecture) => lecture))
|
||||||
.find((l) => l.date === lectureDay);
|
.find((l) => l.date === lectureDay);
|
||||||
|
|
||||||
const startingText = lecture
|
const serverVersionOfText = getLectureTextOrDefault(lecture, lectureDay);
|
||||||
? lectureToString(lecture)
|
|
||||||
: `Name:
|
|
||||||
Date: ${lectureDay}
|
|
||||||
---
|
|
||||||
`;
|
|
||||||
|
|
||||||
const [text, setText] = useState(startingText);
|
const [text, setText] = useState(serverVersionOfText);
|
||||||
|
const [updateMonacoKey, setUpdateMonacoKey] = useState(1);
|
||||||
const [error, setError] = useState("");
|
const [error, setError] = useState("");
|
||||||
|
|
||||||
|
const [clientDataUpdatedAt, setClientDataUpdatedAt] =
|
||||||
|
useState(serverDataUpdatedAt);
|
||||||
|
const clientIsAuthoritative = serverDataUpdatedAt <= clientDataUpdatedAt;
|
||||||
|
console.log("client it authoritative", clientIsAuthoritative);
|
||||||
|
|
||||||
|
const textUpdate = useCallback((t: string) => {
|
||||||
|
setText(t);
|
||||||
|
setClientDataUpdatedAt(Date.now());
|
||||||
|
}, []);
|
||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
const delay = 500;
|
const delay = 500;
|
||||||
const handler = setTimeout(() => {
|
const handler = setTimeout(() => {
|
||||||
try {
|
try {
|
||||||
const parsed = parseLecture(text);
|
const parsed = parseLecture(text);
|
||||||
if (!lecture || lectureToString(parsed) !== lectureToString(lecture)) {
|
if (!lecture || lectureToString(parsed) !== lectureToString(lecture)) {
|
||||||
console.log("updating lecture");
|
if (clientIsAuthoritative) {
|
||||||
updateLecture.mutate({ lecture: parsed, settings, courseName });
|
console.log("updating lecture");
|
||||||
|
updateLecture.mutate({ lecture: parsed, settings, courseName });
|
||||||
|
} else {
|
||||||
|
if (lecture) {
|
||||||
|
console.log(
|
||||||
|
"client not authoritative, updating client with server data"
|
||||||
|
);
|
||||||
|
textUpdate(lectureToString(lecture));
|
||||||
|
setUpdateMonacoKey((k) => k + 1);
|
||||||
|
} else {
|
||||||
|
console.log(
|
||||||
|
"client not authoritative, but no lecture on server, this is a bug"
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
setError("");
|
setError("");
|
||||||
} catch (e: any) {
|
} catch (e: any) {
|
||||||
@@ -60,14 +75,26 @@ Date: ${lectureDay}
|
|||||||
return () => {
|
return () => {
|
||||||
clearTimeout(handler);
|
clearTimeout(handler);
|
||||||
};
|
};
|
||||||
}, [courseName, lecture, settings, text, updateLecture]);
|
}, [
|
||||||
|
clientIsAuthoritative,
|
||||||
|
courseName,
|
||||||
|
lecture,
|
||||||
|
settings,
|
||||||
|
text,
|
||||||
|
textUpdate,
|
||||||
|
updateLecture,
|
||||||
|
]);
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div className="h-full flex flex-col">
|
<div className="h-full flex flex-col">
|
||||||
<EditLectureTitle lectureDay={lectureDay} />
|
<EditLectureTitle lectureDay={lectureDay} />
|
||||||
<div className="sm:columns-2 min-h-0 flex-1">
|
<div className="sm:columns-2 min-h-0 flex-1">
|
||||||
<div className="flex-1 h-full">
|
<div className="flex-1 h-full">
|
||||||
<MonacoEditor value={text} onChange={setText} />
|
<MonacoEditor
|
||||||
|
key={updateMonacoKey}
|
||||||
|
value={text}
|
||||||
|
onChange={textUpdate}
|
||||||
|
/>
|
||||||
</div>
|
</div>
|
||||||
<div className="h-full sm:block none overflow-auto">
|
<div className="h-full sm:block none overflow-auto">
|
||||||
<div className="text-red-300">{error && error}</div>
|
<div className="text-red-300">{error && error}</div>
|
||||||
@@ -78,3 +105,15 @@ Date: ${lectureDay}
|
|||||||
</div>
|
</div>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function getLectureTextOrDefault(
|
||||||
|
lecture: Lecture | undefined,
|
||||||
|
lectureDay: string
|
||||||
|
) {
|
||||||
|
return lecture
|
||||||
|
? lectureToString(lecture)
|
||||||
|
: `Name:
|
||||||
|
Date: ${lectureDay}
|
||||||
|
---
|
||||||
|
`;
|
||||||
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user