"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) => (
))}
)}
);
}