From 30d18524e8e7119ec5cf6c3cd20967d5ba8f7496 Mon Sep 17 00:00:00 2001 From: syc0123 Date: Wed, 1 Apr 2026 15:20:05 +0900 Subject: [PATCH] =?UTF-8?q?[RAPID-micro]=20=EB=A9=94=EC=9D=BC=20=EA=B3=84?= =?UTF-8?q?=EC=A0=95=20=EB=93=B1=EB=A1=9D=20=ED=8F=BC=20=ED=95=84=EB=93=9C?= =?UTF-8?q?=EB=B3=84=20=EC=9C=A0=ED=9A=A8=EC=84=B1=20=EA=B2=80=EC=82=AC=20?= =?UTF-8?q?=EC=97=90=EB=9F=AC=20=ED=91=9C=EC=8B=9C=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Sonnet 4.6 (1M context) --- frontend/app/(main)/mail/imap/page.tsx | 30 ++++++++++++++++++++------ 1 file changed, 24 insertions(+), 6 deletions(-) diff --git a/frontend/app/(main)/mail/imap/page.tsx b/frontend/app/(main)/mail/imap/page.tsx index 4dc6362f..ccdeb317 100644 --- a/frontend/app/(main)/mail/imap/page.tsx +++ b/frontend/app/(main)/mail/imap/page.tsx @@ -129,6 +129,7 @@ export default function ImapMailPage() { const [searchTerm, setSearchTerm] = useState(""); const [saving, setSaving] = useState(false); const [saveError, setSaveError] = useState(null); + const [formErrors, setFormErrors] = useState>>({}); // New states const [folders, setFolders] = useState([]); @@ -432,6 +433,7 @@ export default function ImapMailPage() { setTestResult(null); setShowPassword(false); setHostPopoverOpen(false); + setFormErrors({}); setShowDialog(true); } @@ -461,6 +463,14 @@ export default function ImapMailPage() { } async function handleSave() { + const errors: typeof formErrors = {}; + if (!form.displayName.trim()) errors.displayName = "표시 이름을 입력하세요."; + if (!form.email.trim()) errors.email = "이메일 주소를 입력하세요."; + if (!form.host.trim()) errors.host = "IMAP 호스트를 입력하세요."; + if (!form.username.trim()) errors.username = "사용자명을 입력하세요."; + if (!editingAccount && !form.password.trim()) errors.password = "비밀번호를 입력하세요."; + if (Object.keys(errors).length > 0) { setFormErrors(errors); return; } + setFormErrors({}); setSaving(true); setSaveError(null); try { @@ -914,18 +924,22 @@ export default function ImapMailPage() { setForm((p) => ({ ...p, displayName: e.target.value }))} + onChange={(e) => { setForm((p) => ({ ...p, displayName: e.target.value })); setFormErrors((p) => ({ ...p, displayName: undefined })); }} placeholder="내 Gmail" + className={formErrors.displayName ? "border-destructive" : ""} /> + {formErrors.displayName &&

{formErrors.displayName}

}
setForm((p) => ({ ...p, email: e.target.value, username: e.target.value }))} + onChange={(e) => { setForm((p) => ({ ...p, email: e.target.value, username: e.target.value })); setFormErrors((p) => ({ ...p, email: undefined })); }} placeholder="user@example.com" + className={formErrors.email ? "border-destructive" : ""} /> + {formErrors.email &&

{formErrors.email}

}
@@ -944,7 +958,7 @@ export default function ImapMailPage() { setForm((p) => ({ ...p, host: v }))} + onValueChange={(v) => { setForm((p) => ({ ...p, host: v })); setFormErrors((p) => ({ ...p, host: undefined })); }} /> 직접 입력한 값을 사용합니다 @@ -970,6 +984,7 @@ export default function ImapMailPage() { + {formErrors.host &&

{formErrors.host}

}
@@ -988,9 +1003,11 @@ export default function ImapMailPage() { setForm((p) => ({ ...p, username: e.target.value }))} + onChange={(e) => { setForm((p) => ({ ...p, username: e.target.value })); setFormErrors((p) => ({ ...p, username: undefined })); }} placeholder="user@example.com" + className={formErrors.username ? "border-destructive" : ""} /> + {formErrors.username &&

{formErrors.username}

}
@@ -998,10 +1015,10 @@ export default function ImapMailPage() { setForm((p) => ({ ...p, password: e.target.value }))} + onChange={(e) => { setForm((p) => ({ ...p, password: e.target.value })); setFormErrors((p) => ({ ...p, password: undefined })); }} onKeyDown={(e) => { if (e.key === "Enter") handleSave(); }} placeholder="••••••••" - className="pr-9" + className={`pr-9 ${formErrors.password ? "border-destructive" : ""}`} />
+ {formErrors.password &&

{formErrors.password}

}
{editingAccount && (