From 7f1c804a0cd0b61e36149c8295fd7f587766226b Mon Sep 17 00:00:00 2001 From: ljpark Date: Fri, 7 Aug 2026 20:59:05 +0900 Subject: [PATCH] =?UTF-8?q?dm:=20LoginModal=20=EC=82=AC=EC=97=85=EC=9E=90?= =?UTF-8?q?=EB=93=B1=EB=A1=9D=EB=B2=88=ED=98=B8=20=EC=9E=85=EB=A0=A5=20?= =?UTF-8?q?=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/dm/components/LoginModal.tsx | 43 +++++++++++++++---------------- 1 file changed, 21 insertions(+), 22 deletions(-) diff --git a/apps/dm/components/LoginModal.tsx b/apps/dm/components/LoginModal.tsx index 086deedff..292718977 100644 --- a/apps/dm/components/LoginModal.tsx +++ b/apps/dm/components/LoginModal.tsx @@ -20,9 +20,24 @@ type FieldKey = "bizNo" | "workerNo" | "pw"; const REGISTER_HREF = "/apply/dmdco"; function isBizNoValid(v: string) { - return /^\d{10}$/.test(v); + return /^\d{10}$/.test(v.replace(/\D/g, "")); } +const getBusinessNumberDigits = (value: string) => + value.replace(/\D/g, "").slice(0, 10); + +const formatBusinessNumber = (value: string) => { + const normalized = value.replace(/[^\d-]/g, "").slice(0, 12); + const digits = getBusinessNumberDigits(normalized); + + if (normalized.endsWith("-") && digits.length === 3) return `${digits}-`; + if (normalized.endsWith("-") && digits.length === 5) + return `${digits.slice(0, 3)}-${digits.slice(3)}-`; + if (digits.length <= 3) return digits; + if (digits.length <= 5) return `${digits.slice(0, 3)}-${digits.slice(3)}`; + return `${digits.slice(0, 3)}-${digits.slice(3, 5)}-${digits.slice(5)}`; +}; + function inputCls(opts: { hasError?: boolean; disabled?: boolean }) { const base = "h-[48px] w-full rounded-[4px] border px-5 text-[18px] outline-none"; @@ -102,7 +117,7 @@ export default function LoginModal({ const validate = () => { const next: Partial> = {}; - const b = bizNo.trim(); + const b = getBusinessNumberDigits(bizNo); const w = workerNo.trim(); const p = pw.trim(); @@ -122,23 +137,6 @@ export default function LoginModal({ return next; }; - const formatBusinessNumber = (value: string) => { - // 숫자만 추출 - const digitsOnly = value.replace(/\D/g, ""); - - // 10자리까지만 처리 - const limitedDigits = digitsOnly.slice(0, 10); - - // 3-2-5 형식으로 포맷팅 - if (limitedDigits.length <= 3) { - return limitedDigits; - } else if (limitedDigits.length <= 5) { - return `${limitedDigits.slice(0, 3)}-${limitedDigits.slice(3)}`; - } else { - return `${limitedDigits.slice(0, 3)}-${limitedDigits.slice(3, 5)}-${limitedDigits.slice(5)}`; - } - }; - const markTouched = (key: FieldKey) => setTouched((p) => ({ ...p, [key]: true })); @@ -154,8 +152,9 @@ export default function LoginModal({ try { setSubmitting(true); + const businessNumber = getBusinessNumberDigits(bizNo); const param = { - dmdInfoId: bizNo + (noWorker ? "0000" : workerNo), // 종사업자번호 해당없음 "0000"으로 채움 + dmdInfoId: businessNumber + (noWorker ? "0000" : workerNo), // 종사업자번호 해당없음 "0000"으로 채움 dmdAplyPswd: sha512.hex(pw), }; await actionLogin(param as DemandCompType); @@ -227,9 +226,9 @@ export default function LoginModal({ 사업자 등록번호 { - setBizNo(e.target.value.replace(/\D/g, "").slice(0, 10)); + setBizNo(formatBusinessNumber(e.target.value)); setErrors((p) => ({ ...p, bizNo: undefined })); }} onBlur={() => {