import { useState, type ChangeEvent, type SubmitEvent } from "react"; import { RiLoader5Fill } from "@remixicon/react"; import { add } from "~/components/ui/notice/utils"; import { useIsLogin } from "~/composables/use-is-login"; import { clsn } from "~/utils"; import { getAuthorInfo, setAuthorInfo } from "~/utils/comment"; export interface CommentFormSubmitValues { name: string; email: string; site: string; content: string; root?: string; parent?: string; } interface CommentFormProps { className?: string; parent?: string; root?: string; onSubmit: (values: CommentFormSubmitValues) => Promise; } export default function CommentForm({ className, parent, root, onSubmit }: CommentFormProps) { const isLogin = useIsLogin(); const [loading, setLoading] = useState(false); const [input, setInput] = useState(() => ({ ...getAuthorInfo(), content: "", })); const onChange = (ev: ChangeEvent) => { const { name, value } = ev.target; setInput((prev) => ({ ...prev, [name]: value })); }; const onFormSubmit = (ev: SubmitEvent) => { ev.preventDefault(); if (!isLogin && (!input.name || !input.email || !input.content)) { add({ title: "评论失败", type: "error", content: "缺少必填项", }); return; } if (!input.content) { add({ title: "评论失败", type: "error", content: "缺少必填项", }); return; } setAuthorInfo({ name: input.name, email: input.email, site: input.site, }); setLoading(true); onSubmit({ ...input, root, parent, }).then(() => { setInput((prev) => ({ ...prev, content: "" })); setLoading(false); }).catch(() => { setLoading(false); }); }; const inputClass = "w-full px-3 py-2.5 rounded-xl bg-white border-4 border-gray-200 focus:border-pink-400 outline-none transition-colors placeholder:text-neutral-400"; const labelClass = "block text-sm font-medium mb-2 text-neutral-500"; if (isLogin) { return (

欢迎回来!