fix: 관리자 등록·수정의 휴대전화 앞자리를 고를 수 없던 문제
증상: 번호를 다 입력해도 "휴대전화 번호를 정확히 입력해 주세요."로 막힘.
`FoxPhoneNumber`의 `prefixOptions` 기본값이 빈 배열인데 호출부가 넘기지 않았다. 그래서 앞자리
셀렉트에 고를 항목이 하나도 없고, 그 자리에는 placeholder "010"이 떠서 이미 고른 것처럼 보인다.
실제 값은 빈 문자열이라 가운데·끝자리를 다 채워도 8자리만 제출되고, `formatPhoneNumber`의
`/^(\d{3})(\d{3,4})(\d{4})$/`에 걸리지 않아 null → 빈 값 → 위 오류로 떨어졌다.
앞자리 목록을 `lib/domain/phone-number.ts`의 MOBILE_PHONE_PREFIXES로 두고 호출부가 넘긴다 —
등록·수정이 같은 `AdminMemberFormFields`를 쓰므로 두 팝업이 함께 고쳐진다.
검증 — 화면 실측(실제 클릭·키 입력): 앞자리 셀렉트에 010/011/016/017/018/019가 뜨고, 010 선택
후 1234·5678 입력 시 제출값 "01012345678"(11자리) → 서버 포맷 "010-1234-5678" 통과.
수정 전에는 같은 조작에서 "12345678"(8자리) → null이었다.
@fox 관찰(보고만): `unit` 모드에서 `prefixOptions`를 주지 않으면 항목이 없는 셀렉트가 그려지고,
placeholder 때문에 고른 것처럼 보인 채 잘못된 값이 조용히 만들어진다. 기본값을 두거나 빈 목록일
때 앞자리를 입력 칸으로 바꾸는 편이 안전해 보인다.
Co-Authored-By: Claude Opus 5
@a0316e6800b5b3fa9ae8496253e80f79fb9e5967
--- app/(protected)/(basic)/admins/_components/admin-member-form-fields.tsx
+++ app/(protected)/(basic)/admins/_components/admin-member-form-fields.tsx
... | ... | @@ -11,6 +11,7 @@ |
| 11 | 11 |
ADMIN_ROLE_OPTIONS, |
| 12 | 12 |
} from '@/lib/domain/admin-member'; |
| 13 | 13 |
import type { AdminMemberFormErrors } from '@/lib/domain/admin-member-form';
|
| 14 |
+import { MOBILE_PHONE_PREFIXES } from '@/lib/domain/phone-number';
|
|
| 14 | 15 |
import styles from './admin-member-modal.module.scss'; |
| 15 | 16 |
|
| 16 | 17 |
interface AdminMemberFormFieldsProps {
|
... | ... | @@ -78,6 +79,8 @@ |
| 78 | 79 |
</FoxFormLabel> |
| 79 | 80 |
<FoxPhoneNumber |
| 80 | 81 |
type="unit" |
| 82 |
+ // 넘기지 않으면 앞자리 셀렉트가 빈 목록이라 아무것도 고를 수 없다(상수 주석 참조). |
|
| 83 |
+ prefixOptions={[...MOBILE_PHONE_PREFIXES]}
|
|
| 81 | 84 |
value={phoneNumber}
|
| 82 | 85 |
onChange={onPhoneNumberChange}
|
| 83 | 86 |
message={errors.phoneNumber}
|
--- lib/domain/phone-number.ts
+++ lib/domain/phone-number.ts
... | ... | @@ -57,3 +57,19 @@ |
| 57 | 57 |
|
| 58 | 58 |
return groups === null ? trimmed : groups.join('-');
|
| 59 | 59 |
} |
| 60 |
+ |
|
| 61 |
+/** |
|
| 62 |
+ * 휴대전화 앞자리 목록 — `FoxPhoneNumber`의 앞자리 셀렉트에 넘긴다. |
|
| 63 |
+ * |
|
| 64 |
+ * **넘기지 않으면 그 셀렉트에 고를 것이 하나도 없다**(@fox의 기본값이 빈 배열이다). 그때도 칸에는 |
|
| 65 |
+ * placeholder "010"이 떠서 고른 것처럼 보이는데 값은 빈 문자열이라, 가운데·끝자리를 다 채워도 |
|
| 66 |
+ * 8자리만 제출돼 "휴대전화 번호를 정확히 입력해 주세요."로 막힌다. |
|
| 67 |
+ */ |
|
| 68 |
+export const MOBILE_PHONE_PREFIXES: readonly string[] = [ |
|
| 69 |
+ '010', |
|
| 70 |
+ '011', |
|
| 71 |
+ '016', |
|
| 72 |
+ '017', |
|
| 73 |
+ '018', |
|
| 74 |
+ '019', |
|
| 75 |
+]; |
Add a comment
Delete comment
Once you delete this comment, you won't be able to recover it. Are you sure you want to delete this comment?