"use client" import React, { useState } from "react" import { Dialog, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogTitle, DialogTrigger, } from "@/components/ui/dialog" import { Input } from "@/components/ui/input" import { Label } from "@/components/ui/label" import { Button } from "@/components/ui/button" import { toast } from "sonner" import useSWR from "swr" import { ApiError } from "next/dist/server/api-utils" import { BlogPermissionCheckBoxs } from "./BlogPermissionCheckBoxs" import { BlogPermission } from "@/lib/types/Blog.Permission.enum" import { SetPasswordDialog } from "./SetPasswordDialog" import { AdminAPI } from "@/lib/api/client" import { copyShareURL } from "./utils" interface BlogEditProps { id: string; children?: React.ReactNode; onRefresh: () => void; } export default function BlogEdit({ id, children, onRefresh }: BlogEditProps) { const [open, setOpen] = useState(false) const { data: blog, mutate } = useSWR( open ? `/api/admin/web/blog/${id}` : null, () => AdminAPI.getBlog(id), { revalidateOnFocus: false, revalidateOnReconnect: false, revalidateIfStale: false, dedupingInterval: 5000, } ) const handleSubmit = async () => { if (!blog) return; try { await AdminAPI.updateBlog(id, { title: blog.title, description: blog.description, slug: blog.slug, contentUrl: blog.contentUrl, permissions: blog.permissions, }); toast.success("更新成功") setOpen(false); onRefresh(); } catch (error) { toast.error((error as ApiError).message || "更新失败") } } const handleDelete = async () => { try { await AdminAPI.removeBlog(id); toast.success("删除成功") setOpen(false); onRefresh(); } catch (error) { toast.error((error as ApiError).message || "删除失败") } } return ( {children} 编辑博客 保存前请确认博客信息填写正确、权限配置合理 { blog && ( <>
mutate({ ...blog, title: e.target.value }, false)} />
mutate({ ...blog, description: e.target.value }, false)} />
mutate({ ...blog, slug: e.target.value }, false)} />
mutate({ ...blog, contentUrl: e.target.value }, false)} />
{ mutate({ ...blog, permissions: newState ? [...blog.permissions, permission] : blog.permissions.filter(p => p !== permission) }, false) }} />
{ blog.permissions.includes(BlogPermission.ByPassword) &&
}
) }
) }