"use client"; import { useState } from "react"; import { useRouter } from "next/navigation"; import { Check } from "lucide-react"; import { apiUpdateProfile, type User } from "@/lib/api"; import AvatarPicker from "@/components/AvatarPicker"; interface ProfileFormProps { user: User; } /** * 个人资料编辑表单:头像(上传/裁剪/历史选择)、昵称、邮箱、签名。 * 头像由独立上传链路处理,不随本表单提交;保存成功后 router.refresh() * 让 Header 等 SSR 区域同步最新昵称。 */ export default function ProfileForm({ user }: ProfileFormProps) { const router = useRouter(); const [nickname, setNickname] = useState(user.nickname || ""); const [email, setEmail] = useState(user.email || ""); const [signature, setSignature] = useState(user.signature || ""); const [submitting, setSubmitting] = useState(false); const [error, setError] = useState(""); const [success, setSuccess] = useState(""); const handleSubmit = async (e: React.FormEvent) => { e.preventDefault(); setError(""); setSuccess(""); const trimmed = nickname.trim(); if (!trimmed) { setError("昵称不能为空"); return; } if (trimmed.length > 64) { setError("昵称不能超过 64 个字符"); return; } if (signature.length > 255) { setError("签名不能超过 255 个字符"); return; } setSubmitting(true); try { const res = await apiUpdateProfile({ nickname: trimmed, email: email.trim(), signature, }); if (res.user) { setSuccess("资料已保存"); router.refresh(); } else { setError(res.error || "保存失败"); } } catch { setError("网络错误,请重试"); } finally { setSubmitting(false); } }; return (
); }