"use client"; import { useState, useEffect } from "react"; import Link from "next/link"; import { useRouter } from "next/navigation"; import { GitFork, History, Pencil, Trash2, Copy, Check } from "lucide-react"; import { apiForkSnippet, apiDeleteSnippet, apiMe } from "@/lib/api"; import type { SnippetDetail } from "@/lib/api"; import { toast } from "@/lib/toast"; import { snippetPath, snippetsPath, type UrlStyle } from "@/lib/urlStyle"; import Modal from "@/components/Modal"; import SnippetVersionModal from "@/components/SnippetVersionModal"; export default function SnippetActions({ snippet, urlStyle, isOwner: initialIsOwner, isStaff: initialIsStaff, }: { snippet: SnippetDetail; urlStyle: UrlStyle; isOwner: boolean; isStaff: boolean; }) { const router = useRouter(); const [isOwner, setIsOwner] = useState(initialIsOwner); const [isStaff, setIsStaff] = useState(initialIsStaff); const [forking, setForking] = useState(false); const [deleting, setDeleting] = useState(false); const [deleteOpen, setDeleteOpen] = useState(false); const [historyOpen, setHistoryOpen] = useState(false); const [copied, setCopied] = useState(false); useEffect(() => { apiMe() .then((res) => { if (res.user) { setIsOwner(res.user.id === snippet.user_id); setIsStaff(["admin", "moderator"].includes(res.user.role)); } }) .catch(() => {}); }, [snippet.user_id]); const onFork = async () => { if (forking) return; setForking(true); try { const res = await apiForkSnippet(snippet.id); toast("已复制为你的私有副本,随便改改吧", "ok"); // 直接进入编辑页,让"Fork 后可以演化"这件事立刻可见 router.push(`/snippets/${res.snippet.id}/edit`); } catch (e) { toast(e instanceof Error ? e.message : "Fork 失败"); } finally { setForking(false); } }; const onDelete = async () => { if (deleting) return; setDeleting(true); try { await apiDeleteSnippet(snippet.id); toast("已删除", "ok"); router.push(snippetsPath(urlStyle)); } catch (e) { toast(e instanceof Error ? e.message : "删除失败"); } finally { setDeleting(false); setDeleteOpen(false); } }; const onCopyLink = async () => { try { const url = `${window.location.origin}${snippetPath(urlStyle, snippet.id)}`; await navigator.clipboard.writeText(url); setCopied(true); toast("链接已复制", "ok"); window.setTimeout(() => setCopied(false), 1600); } catch { toast("复制失败"); } }; const btnBase = "h-8 px-3 inline-flex items-center gap-1.5 rounded-full text-[12.5px] font-medium transition-colors disabled:opacity-50 disabled:cursor-not-allowed"; const btnNormal = { background: "var(--panel)", border: "1px solid var(--line)", color: "var(--ink-2)", } as const; return ( <>
此操作不可撤销。