"use client"; import React, { useState, useEffect } from 'react'; import { X, Mail, Server, Lock, Zap, Loader2, CheckCircle2, AlertCircle } from 'lucide-react'; import { Button } from '@/components/ui/button'; import { MailAccount, CreateMailAccountDto, UpdateMailAccountDto, testMailConnection, } from '@/lib/api/mail'; interface MailAccountModalProps { isOpen: boolean; onClose: () => void; onSave: (data: CreateMailAccountDto | UpdateMailAccountDto) => Promise; account?: MailAccount | null; mode: 'create' | 'edit'; } export default function MailAccountModal({ isOpen, onClose, onSave, account, mode, }: MailAccountModalProps) { const [formData, setFormData] = useState({ name: '', email: '', smtpHost: '', smtpPort: 587, smtpSecure: false, smtpUsername: '', smtpPassword: '', dailyLimit: 1000, }); const [isSubmitting, setIsSubmitting] = useState(false); const [isTesting, setIsTesting] = useState(false); const [testResult, setTestResult] = useState<{ success: boolean; message: string; } | null>(null); // 수정 모드일 때 기존 데이터 로드 useEffect(() => { if (mode === 'edit' && account) { setFormData({ name: account.name, email: account.email, smtpHost: account.smtpHost, smtpPort: account.smtpPort, smtpSecure: account.smtpSecure, smtpUsername: account.smtpUsername, smtpPassword: '', // 비밀번호는 비워둠 (보안) dailyLimit: account.dailyLimit, }); } else { // 생성 모드일 때 초기화 setFormData({ name: '', email: '', smtpHost: '', smtpPort: 587, smtpSecure: false, smtpUsername: '', smtpPassword: '', dailyLimit: 1000, }); } setTestResult(null); }, [mode, account, isOpen]); const handleChange = ( e: React.ChangeEvent ) => { const { name, value, type } = e.target; setFormData((prev) => ({ ...prev, [name]: type === 'number' ? parseInt(value) : type === 'checkbox' ? (e.target as HTMLInputElement).checked : value, })); }; const handleTestConnection = async () => { if (!account?.id && mode === 'edit') return; setIsTesting(true); setTestResult(null); try { // 수정 모드에서만 테스트 가능 (저장된 계정만) if (mode === 'edit' && account) { const result = await testMailConnection(account.id); setTestResult(result); } else { setTestResult({ success: false, message: '계정을 먼저 저장한 후 테스트할 수 있습니다.', }); } } catch (error) { setTestResult({ success: false, message: error instanceof Error ? error.message : '연결 테스트 실패', }); } finally { setIsTesting(false); } }; const handleSubmit = async (e: React.FormEvent) => { e.preventDefault(); setIsSubmitting(true); try { await onSave(formData); onClose(); } catch (error) { console.error('저장 실패:', error); alert(error instanceof Error ? error.message : '저장 중 오류가 발생했습니다.'); } finally { setIsSubmitting(false); } }; if (!isOpen) return null; return (
{/* 헤더 */}

{mode === 'create' ? '새 메일 계정 추가' : '메일 계정 수정'}

{/* 폼 */}
{/* 기본 정보 */}

기본 정보

{/* SMTP 설정 */}

SMTP 서버 설정

예: smtp.gmail.com, smtp.naver.com, smtp.office365.com

일반적으로 587 (TLS) 또는 465 (SSL)

{/* 인증 정보 */}

인증 정보

대부분 이메일 주소와 동일

Gmail의 경우 앱 비밀번호 사용 권장

{/* 발송 제한 */}

발송 설정

하루에 발송 가능한 최대 메일 수 (0 = 제한 없음)

{/* 연결 테스트 (수정 모드만) */} {mode === 'edit' && account && (
{testResult && (
{testResult.success ? ( ) : ( )}

{testResult.message}

)}
)} {/* 버튼 */}
); }