diff --git a/adminfront/src/features/users/UserDetailPage.tsx b/adminfront/src/features/users/UserDetailPage.tsx index 0f057712..6db94a92 100644 --- a/adminfront/src/features/users/UserDetailPage.tsx +++ b/adminfront/src/features/users/UserDetailPage.tsx @@ -148,7 +148,8 @@ function UserDetailPage() { const queryClient = useQueryClient(); const [error, setError] = React.useState(null); const [successMsg, setSuccessMsg] = React.useState(null); - const [showPassword, setShowPassword] = React.useState(false); + const [isPasswordResetOpen, setIsPasswordResetOpen] = React.useState(false); + const [generatedPassword, setGeneratedPassword] = React.useState(null); const { data: profile } = useQuery({ queryKey: ["me"], @@ -189,7 +190,6 @@ function UserDetailPage() { department: "", position: "", jobTitle: "", - password: "", metadata: {}, }, }); @@ -197,22 +197,38 @@ function UserDetailPage() { const isAdmin = profile?.role === "super_admin" || profile?.role === "tenant_admin"; + const resetPasswordMutation = useMutation({ + mutationFn: (newPass: string) => updateUser(userId, { password: newPass }), + onSuccess: (_, newPass) => { + setGeneratedPassword(newPass); + toast.success( + t( + "msg.admin.users.detail.password_generated", + "사용자 비밀번호가 성공적으로 재설정되었습니다.", + ), + ); + }, + onError: (err: AxiosError<{ error?: string }>) => { + toast.error( + err.response?.data?.error || + t("msg.admin.users.detail.update_error", "수정에 실패했습니다."), + ); + }, + }); + const handleGeneratePassword = () => { + setIsPasswordResetOpen(true); + setGeneratedPassword(null); + }; + + const confirmGeneratePassword = () => { const newPass = generateSecurePassword(); - setValue("password", newPass); - setShowPassword(true); - toast.success( - t( - "msg.admin.users.detail.password_generated", - "안전한 비밀번호가 생성되었습니다.", - ), - ); + resetPasswordMutation.mutate(newPass); }; const handleCopyPassword = () => { - const pass = watch("password"); - if (pass) { - navigator.clipboard.writeText(pass); + if (generatedPassword) { + navigator.clipboard.writeText(generatedPassword); toast.success( t("msg.common.copied_to_clipboard", "클립보드에 복사되었습니다."), ); @@ -670,14 +686,34 @@ function UserDetailPage() { - {showPassword && ( + {isPasswordResetOpen && !generatedPassword && ( +
+

+ {t( + "msg.admin.users.detail.reset_password_confirm", + "정말로 이 사용자의 비밀번호를 초기화하시겠습니까? 기존 비밀번호로는 즉시 로그인할 수 없게 됩니다.", + )} +

+
+ + +
+
+ )} + + {generatedPassword && (

Generated Password

- {watch("password")} + {generatedPassword}