import { Button, Input, Modal, ModalDialog, Radio, RadioGroup } from "@mui/joy"; import { isUndefined } from "lodash-es"; import { useEffect, useState } from "react"; import { toast } from "react-hot-toast"; import { useTranslation } from "react-i18next"; import useLoading from "@/hooks/useLoading"; import { useUserStore } from "@/stores"; import { Role, User } from "@/types/proto/api/v1/user_service"; import Icon from "./Icon"; interface Props { user?: User; onClose: () => void; onConfirm?: () => void; } interface State { userCreate: Pick; } const CreateUserDialog: React.FC = (props: Props) => { const { onClose, onConfirm, user } = props; const { t } = useTranslation(); const userStore = useUserStore(); const [state, setState] = useState({ userCreate: { email: "", nickname: "", password: "", role: Role.USER, }, }); const requestState = useLoading(false); const isCreating = isUndefined(user); useEffect(() => { if (user) { setState({ ...state, userCreate: Object.assign(state.userCreate, { email: user.email, nickname: user.nickname, password: "", role: user.role, }), }); } }, [user]); const setPartialState = (partialState: Partial) => { setState({ ...state, ...partialState, }); }; const handleEmailInputChange = (e: React.ChangeEvent) => { setPartialState({ userCreate: Object.assign(state.userCreate, { email: e.target.value.toLowerCase(), }), }); }; const handleNicknameInputChange = (e: React.ChangeEvent) => { setPartialState({ userCreate: Object.assign(state.userCreate, { nickname: e.target.value, }), }); }; const handlePasswordInputChange = (e: React.ChangeEvent) => { setPartialState({ userCreate: Object.assign(state.userCreate, { password: e.target.value, }), }); }; const handleRoleInputChange = (e: React.ChangeEvent) => { setPartialState({ userCreate: Object.assign(state.userCreate, { role: e.target.value, }), }); }; const handleSaveBtnClick = async () => { if (isCreating && (!state.userCreate.email || !state.userCreate.nickname || !state.userCreate.password)) { toast.error("Please fill all inputs"); return; } try { if (user) { const userPatch: Partial = { id: user.id, }; const updateMask: string[] = []; if (user.email !== state.userCreate.email) { userPatch.email = state.userCreate.email; updateMask.push("email"); } if (user.nickname !== state.userCreate.nickname) { userPatch.nickname = state.userCreate.nickname; updateMask.push("nickname"); } if (user.role !== state.userCreate.role) { userPatch.role = state.userCreate.role; updateMask.push("role"); } await userStore.patchUser(userPatch, updateMask); } else { await userStore.createUser(state.userCreate); } if (onConfirm) { onConfirm(); } else { onClose(); } } catch (error: any) { console.error(error); toast.error(error.details); } }; return (
{isCreating ? "Create User" : "Edit User"}
Email *
Nickname *
{isCreating && (
Password *
)}
Role *
); }; export default CreateUserDialog;