Files
mnote/wolai-frontend/src/components/documents/move-embed-picker-host.tsx
T

71 lines
2.0 KiB
TypeScript
Raw Normal View History

2026-01-17 10:12:53 +08:00
"use client";
import { useCallback, useEffect } from "react";
import { MoveEmbedPickerDialog } from "@/components/documents/move-embed-picker-dialog";
import { useMoveEmbedPickerStore } from "@/store/move-embed-picker";
export function MoveEmbedPickerHost() {
const open = useMoveEmbedPickerStore((s) => s.open);
const workspaceId = useMoveEmbedPickerStore((s) => s.workspaceId);
const defaultMode = useMoveEmbedPickerStore((s) => s.defaultMode);
const modes = useMoveEmbedPickerStore((s) => s.modes);
const allowRoot = useMoveEmbedPickerStore((s) => s.allowRoot);
const excludeIds = useMoveEmbedPickerStore((s) => s.excludeIds);
const onPick = useMoveEmbedPickerStore((s) => s.onPick);
const setWorkspaceId = useMoveEmbedPickerStore((s) => s.setWorkspaceId);
const close = useMoveEmbedPickerStore((s) => s.close);
useEffect(() => {
if (!open) return;
if (workspaceId) return;
let cancelled = false;
const run = async () => {
try {
const res = await fetch("/api/sidebar");
if (!res.ok) return;
const json = (await res.json().catch(() => null)) as { activeWorkspaceId?: string } | null;
const nextId = typeof json?.activeWorkspaceId === "string" ? json.activeWorkspaceId : null;
if (!cancelled) {
setWorkspaceId(nextId);
}
} catch {
// ignore
}
};
void run();
return () => {
cancelled = true;
};
}, [open, setWorkspaceId, workspaceId]);
const handlePick = useCallback(
async (mode: "move" | "embed", targetId: string | null) => {
if (onPick) {
await onPick(mode, targetId);
}
close();
},
[close, onPick],
);
return (
<MoveEmbedPickerDialog
open={open}
onOpenChange={(next) => {
if (!next) {
close();
}
}}
workspaceId={workspaceId}
defaultMode={defaultMode}
modes={modes}
allowRoot={allowRoot}
excludeIds={excludeIds}
onPick={handlePick}
/>
);
}