"use client"; import { Suspense, useEffect, useState } from "react"; import { useRouter } from "next/navigation"; import { apiMe, apiGetSnippet } from "@/lib/api"; import SnippetEditor from "@/components/SnippetEditor"; function EditSnippetInner({ id }: { id: number }) { const router = useRouter(); const [ready, setReady] = useState(false); const [snippet, setSnippet] = useState<{ title: string; language: string; description: string; code: string; visibility: "public" | "private"; user_id: number; } | null>(null); useEffect(() => { let cancelled = false; (async () => { const me = await apiMe().catch(() => null); if (cancelled) return; if (!me?.user) { router.push(`/login?redirect=/snippets/${id}/edit`); return; } try { const data = await apiGetSnippet(id); if (cancelled) return; if (!data) { router.push("/snippets"); return; } // 仅 owner 或 staff 可编辑(后端会再次校验) setSnippet({ title: data.snippet.title, language: data.snippet.language, description: data.snippet.description, code: data.snippet.code, visibility: data.snippet.visibility, user_id: data.snippet.user_id, }); setReady(true); } catch { if (!cancelled) router.push("/snippets"); } })(); return () => { cancelled = true; }; }, [router, id]); if (!ready || !snippet) { return (
正在加载片段…
正在加载…
正在加载片段…