import { XIcon } from "lucide-react"; import { useState } from "react"; import { toast } from "react-hot-toast"; import { Button } from "@/components/ui/button"; import { Input } from "@/components/ui/input"; import { Label } from "@/components/ui/label"; import { RadioGroup, RadioGroupItem } from "@/components/ui/radio-group"; import { userServiceClient } from "@/grpcweb"; import useLoading from "@/hooks/useLoading"; import { User, User_Role } from "@/types/proto/api/v1/user_service"; import { useTranslate } from "@/utils/i18n"; import { generateDialog } from "./Dialog"; interface Props extends DialogProps { user?: User; confirmCallback?: () => void; } const CreateUserDialog: React.FC = (props: Props) => { const { confirmCallback, destroy } = props; const t = useTranslate(); const [user, setUser] = useState(User.fromPartial({ ...props.user })); const requestState = useLoading(false); const isCreating = !props.user; const setPartialUser = (state: Partial) => { setUser({ ...user, ...state, }); }; const handleConfirm = async () => { if (isCreating && (!user.username || !user.password)) { toast.error("Username and password cannot be empty"); return; } try { if (isCreating) { await userServiceClient.createUser({ user }); toast.success("Create user successfully"); } else { const updateMask = []; if (user.username !== props.user?.username) { updateMask.push("username"); } if (user.password) { updateMask.push("password"); } if (user.role !== props.user?.role) { updateMask.push("role"); } await userServiceClient.updateUser({ user, updateMask }); toast.success("Update user successfully"); } } catch (error: any) { console.error(error); toast.error(error.details); } if (confirmCallback) { confirmCallback(); } destroy(); }; return (

{`${isCreating ? t("common.create") : t("common.edit")} ${t("common.user")}`}

{t("common.username")} setPartialUser({ username: e.target.value, }) } /> {t("common.password")} setPartialUser({ password: e.target.value, }) } /> {t("common.role")} setPartialUser({ role: value as User_Role })} className="flex flex-row gap-4" >
); }; function showCreateUserDialog(user?: User, confirmCallback?: () => void) { generateDialog( { className: "create-user-dialog", dialogName: "create-user-dialog", }, CreateUserDialog, { user, confirmCallback }, ); } export default showCreateUserDialog;