"use client"; import { useEffect, useMemo, useState } from "react"; import { Button } from "@/components/ui/button"; import { useBacklinks } from "@/hooks/use-backlinks"; import type { BacklinkRecord } from "@/types/references"; import { cn } from "@/lib/utils"; interface PageBacklinksPanelProps { workspaceId: string; documentId: string; className?: string; defaultCollapsed?: boolean; } const formatRelative = (value: string) => { if (!value) return ""; const date = new Date(value); return date.toLocaleString(); }; const EmptyState = () => (
暂无反向引用。试试输入 [[#{" "} 来引用其他页面。
); const BacklinkItem = ({ record }: { record: BacklinkRecord }) => (
{record.alias || record.sourceTitle || "无标题"} {record.displayMode === "embed" ? "嵌入块" : "行内引用"}
来自页面:{record.sourceTitle || "无标题"} · 更新:{formatRelative(record.updatedAt)}
); export function PageBacklinksPanel({ workspaceId, documentId, className, defaultCollapsed }: PageBacklinksPanelProps) { const { data, isLoading, error, refetch, isFetching } = useBacklinks({ workspaceId, documentId, }); const records = useMemo(() => data ?? [], [data]); // 说明:collapsed 需要可交互;这里用一个轻量的局部状态,但默认值来自 props(用于“自定义页面:折叠引用列表”)。 const [isCollapsed, setIsCollapsed] = useState(Boolean(defaultCollapsed)); useEffect(() => setIsCollapsed(Boolean(defaultCollapsed)), [defaultCollapsed]); // 避免页面切换时“先出现加载态、随后又消失”的闪烁: // 当尚未拿到任何记录且正在加载时,直接不渲染面板。 if (!error && records.length === 0 && (isLoading || isFetching)) { return null; } if (!isLoading && !error && records.length === 0) { return null; } return (

反向引用

展示指向当前页面的所有页面或块引用

{records.length > 0 && (
共 {records.length} 条
)} {isLoading ? (
加载引用中...
) : error ? (
{(error as Error).message}
) : records.length === 0 ? ( ) : isCollapsed ? (
已折叠。点击“展开”查看。
) : (
{records.map((record) => ( ))}
)}
); }