import { useState } from "react"; import { toast } from "react-hot-toast"; import { Button } from "@/components/ui/button"; import { Dialog, DialogContent, DialogFooter, DialogHeader, DialogTitle } from "@/components/ui/dialog"; 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"; interface CreateUserDialogProps { open: boolean; onOpenChange: (open: boolean) => void; user?: User; onSuccess?: () => void; } export function CreateUserDialog({ open, onOpenChange, user: initialUser, onSuccess }: CreateUserDialogProps) { const t = useTranslate(); const [user, setUser] = useState(User.fromPartial({ ...initialUser })); const requestState = useLoading(false); const isCreating = !initialUser; 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 { requestState.setLoading(); if (isCreating) { await userServiceClient.createUser({ user }); toast.success("Create user successfully"); } else { const updateMask = []; if (user.username !== initialUser?.username) { updateMask.push("username"); } if (user.password) { updateMask.push("password"); } if (user.role !== initialUser?.role) { updateMask.push("role"); } await userServiceClient.updateUser({ user, updateMask }); toast.success("Update user successfully"); } requestState.setFinish(); onSuccess?.(); onOpenChange(false); } catch (error: any) { console.error(error); toast.error(error.details); requestState.setError(); } }; return ( {`${isCreating ? t("common.create") : t("common.edit")} ${t("common.user")}`}
setPartialUser({ username: e.target.value, }) } />
setPartialUser({ password: e.target.value, }) } />
setPartialUser({ role: value as User_Role })} className="flex flex-row gap-4" >
); } export default CreateUserDialog;