"use client"; import { useState } from "react"; import { useRouter } from "next/navigation"; import { apiUpdateProfile, type User } from "@/lib/api"; interface ProfileFormProps { user: User; } /** * 个人资料编辑表单:昵称、头像 URL、邮箱、签名。 * 提交成功后刷新 layout 使 Header 同步最新昵称/头像,并在页面内显示成功提示。 */ export default function ProfileForm({ user }: ProfileFormProps) { const router = useRouter(); const [nickname, setNickname] = useState(user.nickname || ""); const [avatar, setAvatar] = useState(user.avatar || ""); 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, avatar: avatar.trim(), email: email.trim(), signature, }); if (res.user) { setSuccess("资料已保存"); // 刷新 layout 让 Header 同步最新昵称/头像 router.refresh(); } else { setError(res.error || "保存失败"); } } catch { setError("网络错误,请重试"); } finally { setSubmitting(false); } }; return ( <>
个人资料
> ); }