Files
mnote/wolai-frontend/src/components/sidebar/use-preferred-sidebar-snapshot.ts
T

60 lines
1.9 KiB
TypeScript
Raw Normal View History

import { useMemo } from "react";
import type { SidebarInitialData } from "@/components/sidebar/types";
2026-04-24 06:10:18 +08:00
import { buildSidebarDataSyncKey } from "@/components/sidebar/sidebar-sync";
export type PreferredSidebarSnapshotSource = "initial" | "query" | "tree_stream";
export function usePreferredSidebarSnapshot(input: {
initialData: SidebarInitialData;
sidebarQueryData: SidebarInitialData | null;
treeStreamData: SidebarInitialData | null;
2026-04-24 06:10:18 +08:00
treeStreamStatus?: "idle" | "connecting" | "live" | "fallback";
}) {
const querySyncKey = useMemo(
() => (input.sidebarQueryData ? buildSidebarDataSyncKey(input.sidebarQueryData) : null),
[input.sidebarQueryData],
);
const treeStreamSyncKey = useMemo(
() => (input.treeStreamData ? buildSidebarDataSyncKey(input.treeStreamData) : null),
[input.treeStreamData],
);
const initialSyncKey = useMemo(() => buildSidebarDataSyncKey(input.initialData), [input.initialData]);
2026-04-24 06:10:18 +08:00
const streamIsPreferred = input.treeStreamStatus !== "fallback";
const source = useMemo<PreferredSidebarSnapshotSource>(() => {
2026-04-24 06:10:18 +08:00
if (input.treeStreamData && streamIsPreferred) {
return "tree_stream";
}
if (input.sidebarQueryData) {
return "query";
}
return "initial";
}, [
input.sidebarQueryData,
input.treeStreamData,
2026-04-24 06:10:18 +08:00
streamIsPreferred,
]);
const data =
source === "tree_stream" && input.treeStreamData
? input.treeStreamData
: source === "query" && input.sidebarQueryData
? input.sidebarQueryData
: input.treeStreamData ?? input.sidebarQueryData ?? input.initialData;
const syncKey =
source === "tree_stream"
2026-04-24 06:10:18 +08:00
? treeStreamSyncKey ?? querySyncKey ?? initialSyncKey
: source === "query"
? querySyncKey ?? initialSyncKey
: initialSyncKey;
return useMemo(
() => ({
data,
source,
syncKey,
}),
[data, source, syncKey],
);
}