import { Button, IconButton, Input, Textarea } from "@mui/joy"; import { isEqual } from "lodash-es"; import { useState } from "react"; import { toast } from "react-hot-toast"; import { convertFileToBase64 } from "@/helpers/utils"; import useCurrentUser from "@/hooks/useCurrentUser"; import { UserNamePrefix, useUserStore } from "@/store/v1"; import { User as UserPb } from "@/types/proto/api/v1/user_service"; import { useTranslate } from "@/utils/i18n"; import { generateDialog } from "./Dialog"; import Icon from "./Icon"; import UserAvatar from "./UserAvatar"; type Props = DialogProps; interface State { avatarUrl: string; username: string; nickname: string; email: string; description: string; } const UpdateAccountDialog: React.FC = ({ destroy }: Props) => { const t = useTranslate(); const currentUser = useCurrentUser(); const userStore = useUserStore(); const [state, setState] = useState({ avatarUrl: currentUser.avatarUrl, username: currentUser.username, nickname: currentUser.nickname, email: currentUser.email, description: currentUser.description, }); const handleCloseBtnClick = () => { destroy(); }; const setPartialState = (partialState: Partial) => { setState((state) => { return { ...state, ...partialState, }; }); }; const handleAvatarChanged = async (e: React.ChangeEvent) => { const files = e.target.files; if (files && files.length > 0) { const image = files[0]; if (image.size > 2 * 1024 * 1024) { toast.error("Max file size is 2MB"); return; } try { const base64 = await convertFileToBase64(image); setPartialState({ avatarUrl: base64, }); } catch (error) { console.error(error); toast.error(`Failed to convert image to base64`); } } }; const handleNicknameChanged = (e: React.ChangeEvent) => { setPartialState({ nickname: e.target.value as string, }); }; const handleUsernameChanged = (e: React.ChangeEvent) => { setPartialState({ username: e.target.value as string, }); }; const handleEmailChanged = (e: React.ChangeEvent) => { setState((state) => { return { ...state, email: e.target.value as string, }; }); }; const handleDescriptionChanged = (e: React.ChangeEvent) => { setState((state) => { return { ...state, description: e.target.value as string, }; }); }; const handleSaveBtnClick = async () => { if (state.username === "") { toast.error(t("message.fill-all")); return; } try { const updateMask = []; if (!isEqual(currentUser.name.replace(UserNamePrefix, ""), state.username)) { updateMask.push("username"); } if (!isEqual(currentUser.nickname, state.nickname)) { updateMask.push("nickname"); } if (!isEqual(currentUser.email, state.email)) { updateMask.push("email"); } if (!isEqual(currentUser.avatarUrl, state.avatarUrl)) { updateMask.push("avatar_url"); } if (!isEqual(currentUser.description, state.description)) { updateMask.push("description"); } await userStore.updateUser( UserPb.fromPartial({ name: currentUser.name, username: state.username, nickname: state.nickname, email: state.email, avatarUrl: state.avatarUrl, description: state.description, }), updateMask, ); toast.success(t("message.update-succeed")); handleCloseBtnClick(); } catch (error: any) { console.error(error); toast.error(error.details); } }; return ( <>

{t("setting.account-section.update-information")}

{t("common.avatar")} {state.avatarUrl && ( setPartialState({ avatarUrl: "", }) } /> )}

{t("common.username")} ({t("setting.account-section.username-note")})

{t("common.nickname")} ({t("setting.account-section.nickname-note")})

{t("common.email")} ({t("setting.account-section.email-note")})

{t("common.description")}