75 lines
2.8 KiB
TypeScript
75 lines
2.8 KiB
TypeScript
import { useCallback, useState } from "react";
|
|
import type { Dispatch, SetStateAction } from "react";
|
|
import type { EditorSnapshot, Section, SectionCommit, SectionState } from "@/types/sections";
|
|
|
|
type Options = {
|
|
defaultEditorUserId: string;
|
|
};
|
|
|
|
type SectionTask = "idle" | "saving" | "submitting" | "opening-section";
|
|
|
|
export function useSectionSessionState(options: Options) {
|
|
const [sectionTask, setSectionTask] = useState<SectionTask>("idle");
|
|
const setTaskFlag = useCallback((task: Exclude<SectionTask, "idle">, next: SetStateAction<boolean>) => {
|
|
setSectionTask((prev) => {
|
|
const currentValue = prev === task;
|
|
const nextValue = typeof next === "function" ? next(currentValue) : next;
|
|
if (nextValue) return task;
|
|
return prev === task ? "idle" : prev;
|
|
});
|
|
}, []);
|
|
|
|
const isSaving = sectionTask === "saving";
|
|
const isSubmitting = sectionTask === "submitting";
|
|
const isOpeningSection = sectionTask === "opening-section";
|
|
const setIsSaving: Dispatch<SetStateAction<boolean>> = useCallback((next) => {
|
|
setTaskFlag("saving", next);
|
|
}, [setTaskFlag]);
|
|
const setIsSubmitting: Dispatch<SetStateAction<boolean>> = useCallback((next) => {
|
|
setTaskFlag("submitting", next);
|
|
}, [setTaskFlag]);
|
|
const setIsOpeningSection: Dispatch<SetStateAction<boolean>> = useCallback((next) => {
|
|
setTaskFlag("opening-section", next);
|
|
}, [setTaskFlag]);
|
|
|
|
const [availableSections, setAvailableSections] = useState<Section[]>([]);
|
|
const [selectedSectionId, setSelectedSectionId] = useState("");
|
|
const [newSectionTitle, setNewSectionTitle] = useState("");
|
|
const [commitTitle, setCommitTitle] = useState("");
|
|
const [commitNote, setCommitNote] = useState("");
|
|
const [editorUserIdInput, setEditorUserIdInput] = useState(options.defaultEditorUserId);
|
|
const [activeSection, setActiveSection] = useState<Section | null>(null);
|
|
const [sectionState, setSectionState] = useState<SectionState | null>(null);
|
|
const [sectionCommits, setSectionCommits] = useState<SectionCommit[]>([]);
|
|
const [lastSectionSnapshot, setLastSectionSnapshot] = useState<EditorSnapshot | null>(null);
|
|
|
|
return {
|
|
isSaving,
|
|
setIsSaving,
|
|
isSubmitting,
|
|
setIsSubmitting,
|
|
isOpeningSection,
|
|
setIsOpeningSection,
|
|
availableSections,
|
|
setAvailableSections,
|
|
selectedSectionId,
|
|
setSelectedSectionId,
|
|
newSectionTitle,
|
|
setNewSectionTitle,
|
|
commitTitle,
|
|
setCommitTitle,
|
|
commitNote,
|
|
setCommitNote,
|
|
editorUserIdInput,
|
|
setEditorUserIdInput,
|
|
activeSection,
|
|
setActiveSection,
|
|
sectionState,
|
|
setSectionState,
|
|
sectionCommits,
|
|
setSectionCommits,
|
|
lastSectionSnapshot,
|
|
setLastSectionSnapshot,
|
|
};
|
|
}
|