"use client" import { Button } from "@/components/ui/button" import { Input } from "@/components/ui/input" import { Textarea } from "@/components/ui/textarea" import { z } from "zod" import { Form, FormControl, FormField, FormItem, FormLabel, FormMessage } from "@/components/ui/form" import { useForm } from "react-hook-form" import { zodResolver } from "@hookform/resolvers/zod" import { useEffect, useState, useCallback } from "react" import { gql, useMutation } from "@apollo/client" import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from "@/components/ui/select" import { DialogClose, DialogFooter } from "@/components/ui/dialog" import { IconLoader } from "@tabler/icons-react" const CREATE_BLOG = gql` mutation CreateBlog($input: CreateBlogInput!) { createBlog(input: $input) { id title slug status } } ` const schema = z.object({ title: z.string().min(1, "标题不能为空"), slug: z.string().min(1, "链接不能为空"), excerpt: z.string().optional(), content: z.string().min(1, "内容不能为空"), status: z.enum(["draft", "published", "archived"]), metaTitle: z.string().optional(), metaDescription: z.string().optional(), isFeatured: z.boolean().default(false), isActive: z.boolean().default(true), }) export default function CreateBlogForm() { const [isLoading, setIsLoading] = useState(false); const [error, setError] = useState(null); const [createBlog] = useMutation(CREATE_BLOG) const form = useForm>({ resolver: zodResolver(schema), defaultValues: { title: "", slug: "", excerpt: "", content: "", status: "draft" as const, metaTitle: "", metaDescription: "", isFeatured: false, isActive: true, }, }) // 生成slug const generateSlug = useCallback((title: string) => { return title .toLowerCase() .replace(/[^\w\s-]/g, '') // 移除特殊字符 .replace(/\s+/g, '-') // 空格替换为连字符 .replace(/-+/g, '-') // 多个连字符合并为一个 .trim(); }, []); // 监听标题变化自动生成slug const watchedTitle = form.watch("title"); useEffect(() => { if (watchedTitle) { const slug = generateSlug(watchedTitle); form.setValue("slug", slug); } }, [watchedTitle, generateSlug, form]); async function onSubmit(values: z.infer) { try { setIsLoading(true); setError(null); await createBlog({ variables: { input: { title: values.title, slug: values.slug, content: JSON.stringify(values.content), // Convert to JSON status: values.status, excerpt: values.excerpt || null, metaTitle: values.metaTitle || null, metaDescription: values.metaDescription || null, isFeatured: values.isFeatured, isActive: values.isActive, } } }); // 重置表单 form.reset(); } catch (err) { setError(err instanceof Error ? err.message : '创建博客失败,请重试'); } finally { setIsLoading(false); } } return (
{error && (
{error}
)}
( 标题 * )} />
( 链接 * )} />
( 摘要