Files
ColdBreeze-chat-web/src/routes/setting/MyAccount.tsx
T
2023-02-17 09:22:59 +08:00

122 lines
4.5 KiB
TypeScript

import { useEffect, useState, MouseEvent } from "react";
import toast from "react-hot-toast";
import { useUpdateAvatarMutation } from "../../app/services/user";
import AvatarUploader from "../../common/component/AvatarUploader";
import Button from "../../common/component/styled/Button";
import ProfileBasicEditModal from "./ProfileBasicEditModal";
import RemoveAccountConfirmModal from "./RemoveAccountConfirmModal";
import UpdatePasswordModal from "./UpdatePasswordModal";
import { useAppSelector } from "../../app/store";
import { useTranslation } from "react-i18next";
type EditField = "name" | "email" | "";
export default function MyAccount() {
const { t } = useTranslation("member");
const { t: ct } = useTranslation();
const [passwordModal, setPasswordModal] = useState(false);
const [editModal, setEditModal] = useState<EditField>("");
const [removeConfirmVisible, setRemoveConfirmVisible] = useState(false);
const [uploadAvatar, { isSuccess: uploadSuccess }] = useUpdateAvatarMutation();
const EditModalInfo = {
name: {
label: t("username"),
title: t("change_name"),
intro: t("change_name_desc")
},
email: {
label: t("email"),
title: t("change_email"),
intro: t("change_email_desc")
}
};
const loginUser = useAppSelector((store) => {
return store.users.byId[store.authData.user?.uid || 0];
});
useEffect(() => {
if (uploadSuccess) {
toast.success(ct("tip.update"));
}
}, [uploadSuccess]);
const handleBasicEdit = (evt: MouseEvent<HTMLButtonElement>) => {
const { edit } = evt.currentTarget.dataset as { edit: EditField };
setEditModal(edit);
};
const closeBasicEditModal = () => {
setEditModal("");
};
const togglePasswordModal = () => {
setPasswordModal((prev) => !prev);
};
const toggleRemoveAccountModalVisible = () => {
setRemoveConfirmVisible((prev) => !prev);
};
if (!loginUser) return null;
const { uid, avatar, name, email } = loginUser;
return (
<>
<div className="flex flex-col items-start gap-8">
<div className="md:p-6 flex flex-col items-center w-full md:w-[512px] md:bg-gray-100 md:dark:bg-gray-800 md:rounded-2xl">
<AvatarUploader url={avatar} name={name} uploadImage={uploadAvatar} />
<div className="mt-2 mb-16 font-bold text-lg text-gray-800 dark:text-white">
{name} <span className="font-normal text-gray-500">#{uid}</span>
</div>
<div className="w-full flex items-start justify-between mb-6">
<div className="flex flex-col text-gray-500 dark:text-gray-50">
<span className="text-xs uppercase font-semibold">{t("username")}</span>
<span className="text-sm ">
{name} <span className="text-gray-600 dark:text-gray-400"> #{uid}</span>
</span>
</div>
<Button data-edit="name" onClick={handleBasicEdit} className="">
{ct("action.edit")}
</Button>
</div>
<div className="w-full flex items-start justify-between mb-6">
<div className="flex flex-col text-gray-500 dark:text-gray-50">
<span className="text-xs uppercase font-semibold">{t("email")}</span>
<span className="text-sm">{email}</span>
</div>
<Button data-edit="email" onClick={handleBasicEdit}>
{ct("action.edit")}
</Button>
</div>
<div className="w-full flex items-start justify-between mb-6">
<div className="flex flex-col text-gray-500 dark:text-gray-50">
<span className="text-xs uppercase font-semibold">{t("password")}</span>
<span className="text-sm">*********</span>
</div>
<Button onClick={togglePasswordModal}>
{ct("action.edit")}
</Button>
</div>
</div>
{/* uid 1 是初始账户,不能删 */}
{uid != 1 && (
<Button className="danger" onClick={toggleRemoveAccountModalVisible}>
{t("delete_account")}
</Button>
)}
</div>
{editModal && (
<ProfileBasicEditModal
type={editModal == "email" ? "email" : "text"}
valueKey={editModal}
{...EditModalInfo[editModal]}
value={eval(editModal)}
closeModal={closeBasicEditModal}
/>
)}
{passwordModal && <UpdatePasswordModal closeModal={togglePasswordModal} />}
{removeConfirmVisible && (
<RemoveAccountConfirmModal closeModal={toggleRemoveAccountModalVisible} />
)}
</>
);
}