45 lines
1.4 KiB
TypeScript
45 lines
1.4 KiB
TypeScript
"use client";
|
|
|
|
import { useMemo, useState } from "react";
|
|
import { usePreferredSidebarDocumentTitle } from "@/components/sidebar/preferred-sidebar-snapshot-context";
|
|
|
|
function normalizePageHeadTitle(title: string | null | undefined): string {
|
|
const normalized = String(title ?? "").trim();
|
|
return normalized || "无标题";
|
|
}
|
|
|
|
export function usePageHeadTitle(input: { documentId: string; fallbackTitle: string }) {
|
|
const liveSidebarTitle = usePreferredSidebarDocumentTitle(input.documentId);
|
|
const committedTitle = useMemo(
|
|
() => normalizePageHeadTitle(liveSidebarTitle ?? input.fallbackTitle),
|
|
[input.fallbackTitle, liveSidebarTitle],
|
|
);
|
|
const [draftState, setDraftState] = useState<{
|
|
documentId: string;
|
|
title: string | null;
|
|
}>({
|
|
documentId: input.documentId,
|
|
title: null,
|
|
});
|
|
const draftTitle = draftState.documentId === input.documentId ? draftState.title : null;
|
|
const hasDraft = draftTitle != null && normalizePageHeadTitle(draftTitle) !== committedTitle;
|
|
|
|
return {
|
|
displayTitle: hasDraft ? draftTitle ?? committedTitle : committedTitle,
|
|
committedTitle,
|
|
hasDraft,
|
|
setDraftTitle: (title: string) => {
|
|
setDraftState({
|
|
documentId: input.documentId,
|
|
title,
|
|
});
|
|
},
|
|
commitPersistedTitle: (title: string) => {
|
|
setDraftState({
|
|
documentId: input.documentId,
|
|
title: normalizePageHeadTitle(title),
|
|
});
|
|
},
|
|
};
|
|
}
|