import { useEffect, useState } from "react" import { Loader2 } from "lucide-react" import { Button } from "~/components/ui/button" import { Dialog, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogTitle, } from "~/components/ui/dialog" import { Input } from "~/components/ui/input" import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow, } from "~/components/ui/table" import { api } from "~/lib/api" import type { HistoryEntry } from "~/lib/api" import { cn, formatDateTime } from "~/lib/utils" /** * 获取特定版本弹窗:输入或从该对象历史中点选 changeset, * 确认后把对象本地内容整体切到该变更集时刻(目录为递归覆盖), * 对应 VS 的 Get Specific Version + Overwrite。 */ export function GetVersionDialog({ serverPath, folder, onConfirm, onClose, }: { serverPath: string folder: boolean /** 确认后执行获取,由编排层调用 get-version 接口并刷新。 */ onConfirm: (changeset: number) => Promise onClose: () => void }) { const [input, setInput] = useState("") const [entries, setEntries] = useState([]) const [loading, setLoading] = useState(true) const [error, setError] = useState(null) const [busy, setBusy] = useState(false) useEffect(() => { let active = true void (async () => { setLoading(true) const result = await api.getHistory({ path: serverPath, folder }) if (!active) { return } setLoading(false) if (!result.ok) { setError(result.errorMessage ?? "历史加载失败") return } setError(null) setEntries(result.data?.history ?? []) })() return () => { active = false } }, [serverPath, folder]) const changeset = /^\d+$/.test(input.trim()) ? Number(input.trim()) : null const valid = changeset != null && changeset > 0 return ( !open && !busy && onClose()}> 获取特定版本 {serverPath}
Changeset setInput(event.target.value)} placeholder="输入编号或从下方历史点选" className="h-8 w-56 font-mono text-sm" inputMode="numeric" />
{loading ? (
正在加载历史…
) : error ? (
{error}
) : entries.length === 0 ? (
没有历史记录,可直接输入 changeset 编号
) : ( Changeset 作者 时间 注释 {entries.map((entry) => ( setInput(String(entry.changeset))} > {entry.changeset} {entry.author} {formatDateTime(entry.date)} {entry.comment || "—"} ))}
)}

确认后{folder ? "该目录(递归)" : "该文件"}的本地内容会被所选版本覆盖, 本地未签入的修改无法恢复。

) }