"use client"; import React, { useState, useCallback } from "react"; import { Dialog, DialogContent, DialogHeader, DialogTitle } from "@/components/ui/dialog"; import { Button } from "@/components/ui/button"; import { Input } from "@/components/ui/input"; import { Label } from "@/components/ui/label"; import { Eye, EyeOff } from "lucide-react"; import { userAPI } from "@/lib/api/user"; import { AlertModal, AlertType } from "@/components/common/AlertModal"; interface UserPasswordResetModalProps { isOpen: boolean; onClose: () => void; userId: string | null; userName: string | null; onSuccess?: () => void; } export function UserPasswordResetModal({ isOpen, onClose, userId, userName, onSuccess }: UserPasswordResetModalProps) { const [newPassword, setNewPassword] = useState(""); const [confirmPassword, setConfirmPassword] = useState(""); const [showPassword, setShowPassword] = useState(false); const [showConfirmPassword, setShowConfirmPassword] = useState(false); const [isLoading, setIsLoading] = useState(false); // 알림 모달 상태 const [alertState, setAlertState] = useState<{ isOpen: boolean; type: AlertType; title: string; message: string; }>({ isOpen: false, type: "info", title: "", message: "", }); // 알림 모달 표시 헬퍼 함수 const showAlert = (type: AlertType, title: string, message: string) => { setAlertState({ isOpen: true, type, title, message, }); }; // 알림 모달 닫기 const closeAlert = () => { setAlertState((prev) => ({ ...prev, isOpen: false })); // 성공 알림이 닫힐 때 메인 모달도 닫기 if (alertState.type === "success") { handleClose(); onSuccess?.(); } }; // 비밀번호 유효성 검사 (영문, 숫자, 특수문자만 허용) const validatePassword = (password: string) => { const regex = /^[a-zA-Z0-9!@#$%^&*()_+\-=\[\]{};':"\\|,.<>\/?`~]*$/; return regex.test(password); }; // 비밀번호 일치 여부 확인 const isPasswordMatch = newPassword && confirmPassword && newPassword === confirmPassword; const showMismatchError = confirmPassword && newPassword !== confirmPassword; // 초기화 핸들러 const handleReset = useCallback(async () => { if (!userId || !newPassword.trim()) { showAlert("warning", "입력 필요", "새 비밀번호를 입력해주세요."); return; } if (!validatePassword(newPassword)) { showAlert("warning", "형식 오류", "비밀번호는 영문, 숫자, 특수문자만 사용할 수 있습니다."); return; } if (newPassword !== confirmPassword) { showAlert("warning", "비밀번호 불일치", "비밀번호가 일치하지 않습니다."); return; } setIsLoading(true); try { const response = await userAPI.resetPassword({ userId: userId, newPassword: newPassword, }); if (response.success) { showAlert("success", "초기화 완료", "비밀번호가 성공적으로 초기화되었습니다."); // 성공 알림은 사용자가 확인 버튼을 눌러서 닫도록 함 } else { showAlert("error", "초기화 실패", response.message || "비밀번호 초기화에 실패했습니다."); } } catch (error) { console.error("비밀번호 초기화 오류:", error); showAlert("error", "시스템 오류", "비밀번호 초기화 중 오류가 발생했습니다."); } finally { setIsLoading(false); } }, [userId, newPassword, confirmPassword, onSuccess]); // 모달 닫기 핸들러 const handleClose = useCallback(() => { setNewPassword(""); setConfirmPassword(""); setShowPassword(false); setShowConfirmPassword(false); setIsLoading(false); onClose(); }, [onClose]); // Enter 키 처리 const handleKeyDown = (e: React.KeyboardEvent) => { if (e.key === "Enter" && !isLoading) { handleReset(); } }; if (!userId) return null; return ( 비밀번호 초기화
{/* 대상 사용자 정보 */}
{/* 새 비밀번호 입력 */}
setNewPassword(e.target.value)} placeholder="새 비밀번호를 입력하세요" disabled={isLoading} className="pr-10" />
{/* 비밀번호 재확인 */}
setConfirmPassword(e.target.value)} placeholder="비밀번호를 다시 입력하세요" disabled={isLoading} className="pr-10" />
{/* 비밀번호 일치 여부 표시 */} {showMismatchError &&

비밀번호가 일치하지 않습니다.

} {isPasswordMatch &&

비밀번호가 일치합니다.

}
* 비밀번호는 영문, 숫자, 특수문자만 사용할 수 있습니다.
{/* 알림 모달 */}
); }