"use client" import { useEffect, useMemo, 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, DialogFooter, DialogHeader, DialogTitle, } from "@/components/ui/dialog" import { Field, FieldContent, FieldError, FieldLabel, } from "@/components/ui/field" import { Textarea } from "@/components/ui/textarea" import { useI18n } from "@/i18n/provider" type ConversationCloseDialogProps = { open: boolean conversationId: number | null onOpenChange: (open: boolean) => void onSuccess?: () => Promise | void } type CloseForm = { closeReason: string } 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 t = useI18n() const [saving, setSaving] = useState(false) const closeSchema = useMemo( () => z.object({ closeReason: z.string().trim().min(1, t("conversationAction.closeReasonRequired")), }), [t] ) const closeResolver = useMemo( () => zodResolver(closeSchema as never) as Resolver, [closeSchema] ) const form = useForm({ 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(t("conversationAction.conversationMissing")) return } setSaving(true) try { await closeConversation(conversationId, values.closeReason.trim()) toast.success(t("conversationAction.closed", { id: conversationId })) reset(emptyForm) onOpenChange(false) await onSuccess?.() } catch (error) { toast.error(error instanceof Error ? error.message : t("conversationAction.closeFailed")) } finally { setSaving(false) } } return ( {t("conversationAction.closeTitle")}
{t("conversationAction.closeReason")}