"use client" import { useState } from "react" import Link from "next/link" import { useRouter } from "next/navigation" import { toast } from "sonner" import { useTranslations } from "next-intl" import { ArrowLeft, Send } from "lucide-react" import { Button } from "@/shared/components/ui/button" import { Card, CardContent, CardFooter, CardHeader, CardTitle } from "@/shared/components/ui/card" import { Input } from "@/shared/components/ui/input" import { Label } from "@/shared/components/ui/label" import { Textarea } from "@/shared/components/ui/textarea" import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue, } from "@/shared/components/ui/select" import { sendMessageAction } from "../actions" import type { RecipientOption } from "../types" type FieldErrors = Record export function MessageCompose({ recipients, parentMessageId, defaultReceiverId, defaultSubject, backHref = "/messages", }: { recipients: RecipientOption[] parentMessageId?: string defaultReceiverId?: string defaultSubject?: string backHref?: string }) { const t = useTranslations("messages") const router = useRouter() const [isWorking, setIsWorking] = useState(false) const [receiverId, setReceiverId] = useState(defaultReceiverId ?? "") const [fieldErrors, setFieldErrors] = useState({}) const getFieldError = (field: string): string | null => { const errs = fieldErrors[field] return errs && errs.length > 0 ? errs[0] : null } const handleSubmit = async (formData: FormData) => { if (!receiverId) { toast.error(t("form.selectRecipient")) return } formData.set("receiverId", receiverId) if (parentMessageId) { formData.set("parentMessageId", parentMessageId) } setIsWorking(true) setFieldErrors({}) try { const res = await sendMessageAction(null, formData) if (res.success) { toast.success(res.message) router.push("/messages") router.refresh() } else { // 展示字段级错误(来自 Zod 校验) if (res.errors) { setFieldErrors(res.errors) } toast.error(res.message || t("messages.sendFailed")) } } catch { toast.error(t("messages.sendFailed")) } finally { setIsWorking(false) } } return (
{parentMessageId ? t("title.reply") : t("title.newMessage")}
{getFieldError("receiverId") ? (

{getFieldError("receiverId")}

) : null}
{getFieldError("subject") ? (

{getFieldError("subject")}

) : null}