import { useState, useEffect, forwardRef, useImperativeHandle } from "react"; import { useSelector, useDispatch } from "react-redux"; import { authService } from "../../services/auth.service"; import { updateProfileSuccess } from "../../store/slices/authSlice"; import { usernameColors, fallbackColors } from "../../constants/usernameColors"; const UserProfile = forwardRef(function UserProfile(_, ref) { const { isDark } = useSelector((state) => state.theme); const authUser = useSelector((state) => state.auth.user); const dispatch = useDispatch(); const [userName, setUserName] = useState( () => localStorage.getItem("userName") || authUser?.name || "Sinh viên", ); const [username] = useState( () => localStorage.getItem("username") || authUser?.username || "", ); const [userAvatar, setUserAvatar] = useState( () => localStorage.getItem("userAvatar") || authUser?.avatar || null, ); const [userBio, setUserBio] = useState( () => localStorage.getItem("userBio") || authUser?.bio || "", ); const [usernameColor, setUsernameColor] = useState( () => localStorage.getItem("usernameColor")?.toLowerCase().trim() || "", ); const [nameError, setNameError] = useState(""); useEffect(() => { if (authUser) { if (!localStorage.getItem("userName")) { setUserName(authUser.name || "Sinh viên"); } if (!localStorage.getItem("userAvatar")) { setUserAvatar(authUser.avatar || null); } if (!localStorage.getItem("userBio")) { setUserBio(authUser.bio || ""); } if (!localStorage.getItem("usernameColor")) { const authColor = authUser.color?.trim(); const matched = usernameColors.find((c) => c.name === authColor); setUsernameColor(matched?.value || usernameColors[0].value); } } }, [authUser]); useImperativeHandle(ref, () => ({ validateAndSave: async () => { const trimmedName = userName.trim(); if (!trimmedName) { setNameError("Vui lòng nhập tên hiển thị"); return { success: false, changed: false }; } setNameError(""); const trimmedBio = userBio.trim(); const originalName = authUser?.name || ""; const originalUsername = authUser?.username || ""; const originalBio = authUser?.bio || ""; const originalAvatar = authUser?.avatar || null; const hasChanged = trimmedName !== originalName || trimmedBio !== originalBio || userAvatar !== originalAvatar; if (trimmedBio.length > 500) { return { success: false, changed: false, error: "Giới thiệu tối đa 500 ký tự" }; } localStorage.setItem("userName", trimmedName); localStorage.setItem("username", username); localStorage.setItem("userAvatar", userAvatar); localStorage.setItem("userBio", trimmedBio); if (usernameColor) { localStorage.setItem("usernameColor", usernameColor); } if (!hasChanged) { return { success: true, changed: false }; } try { const payload = { displayName: trimmedName, bio: trimmedBio || null, avatar: userAvatar || null, }; const { data } = await authService.updateProfile(payload); if (data?.user) { dispatch(updateProfileSuccess(data.user)); localStorage.setItem("auth_user", JSON.stringify(data.user)); } return { success: true, changed: true }; } catch (err) { const msg = err?.response?.data?.message || "Cập nhật thất bại"; return { success: false, changed: false, error: msg }; } }, })); const handleColorChange = (colorValue) => { setUsernameColor(colorValue.trim()); }; const currentColorName = usernameColors.find((c) => c.value === usernameColor)?.name || usernameColor; return (