"use client" import { useEffect, useState } from "react" import { zodResolver } from "@hookform/resolvers/zod" import { Resolver, useForm } from "react-hook-form" import { z } from "zod/v4" import { CircleXIcon } from "lucide-react" import { toast } from "sonner" import { closeConversation } from "@/lib/api/admin" import { Button } from "@/components/ui/button" import { Dialog, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogTitle, } from "@/components/ui/dialog" import { Field, FieldContent, FieldError, FieldLabel, } from "@/components/ui/field" import { Textarea } from "@/components/ui/textarea" type ConversationCloseDialogProps = { open: boolean conversationId: number | null onOpenChange: (open: boolean) => void onSuccess?: () => Promise | void } const closeSchema = z.object({ closeReason: z.string().trim().min(1, "请输入关闭原因"), }) type CloseForm = z.infer const closeResolver = zodResolver(closeSchema as never) as Resolver< z.input, undefined, z.output > const emptyForm: CloseForm = { closeReason: "", } export function ConversationCloseDialog({ open, conversationId, onOpenChange, onSuccess, }: ConversationCloseDialogProps) { return ( {open ? ( ) : null} ) } type ConversationCloseDialogBodyProps = { conversationId: number | null onOpenChange: (open: boolean) => void onSuccess?: () => Promise | void } function ConversationCloseDialogBody({ conversationId, onOpenChange, onSuccess, }: ConversationCloseDialogBodyProps) { const [saving, setSaving] = useState(false) const form = useForm< z.input, undefined, z.output >({ resolver: closeResolver, defaultValues: emptyForm, }) const { handleSubmit, reset, register, formState: { errors }, } = form useEffect(() => { reset(emptyForm) }, [conversationId, reset]) async function onFormSubmit(values: CloseForm) { if (!conversationId) { toast.error("会话不存在") return } setSaving(true) try { await closeConversation(conversationId, values.closeReason.trim()) toast.success(`已关闭会话:#${conversationId}`) reset(emptyForm) onOpenChange(false) await onSuccess?.() } catch (error) { toast.error(error instanceof Error ? error.message : "关闭会话失败") } finally { setSaving(false) } } return ( 关闭会话 {/* 当前会话:{conversationId ? `#${conversationId}` : "-"} */}
关闭原因