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) { // Single state machine cho các tác vụ async của section (saving/submitting/opening). const [sectionTask, setSectionTask] = useState("idle"); const setTaskFlag = useCallback((task: Exclude, next: SetStateAction) => { 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> = useCallback((next) => { setTaskFlag("saving", next); }, [setTaskFlag]); const setIsSubmitting: Dispatch> = useCallback((next) => { setTaskFlag("submitting", next); }, [setTaskFlag]); const setIsOpeningSection: Dispatch> = useCallback((next) => { setTaskFlag("opening-section", next); }, [setTaskFlag]); // Danh sách sections để user chọn mở. const [availableSections, setAvailableSections] = useState([]); // Section ID đang được chọn trong dropdown. const [selectedSectionId, setSelectedSectionId] = useState(""); // Title section mới (để create). const [newSectionTitle, setNewSectionTitle] = useState(""); // Input title cho commit. const [commitTitle, setCommitTitle] = useState(""); // Input note cho commit. const [commitNote, setCommitNote] = useState(""); // User ID dùng để gắn vào commit/submit/lock. const [editorUserIdInput, setEditorUserIdInput] = useState(options.defaultEditorUserId); // Section đang mở để edit (null nếu chưa mở). const [activeSection, setActiveSection] = useState
(null); // Trạng thái section (version/head/status/lock). const [sectionState, setSectionState] = useState(null); // Danh sách commits của section đang mở. const [sectionCommits, setSectionCommits] = useState([]); // Snapshot gần nhất đã load (để build snapshot diff/metadata). const [lastSectionSnapshot, setLastSectionSnapshot] = useState(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, }; }