임동욱 임동욱 08-19
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
+++ app/(protected)/(basic)/admins/_components/admin-member-form-fields.tsx
@@ -11,6 +11,7 @@
   ADMIN_ROLE_OPTIONS,
 } from '@/lib/domain/admin-member';
 import type { AdminMemberFormErrors } from '@/lib/domain/admin-member-form';
+import { MOBILE_PHONE_PREFIXES } from '@/lib/domain/phone-number';
 import styles from './admin-member-modal.module.scss';
 
 interface AdminMemberFormFieldsProps {
@@ -78,6 +79,8 @@
         </FoxFormLabel>
         <FoxPhoneNumber
           type="unit"
+          // 넘기지 않으면 앞자리 셀렉트가 빈 목록이라 아무것도 고를 수 없다(상수 주석 참조).
+          prefixOptions={[...MOBILE_PHONE_PREFIXES]}
           value={phoneNumber}
           onChange={onPhoneNumberChange}
           message={errors.phoneNumber}
lib/domain/phone-number.ts
--- lib/domain/phone-number.ts
+++ lib/domain/phone-number.ts
@@ -57,3 +57,19 @@
 
   return groups === null ? trimmed : groups.join('-');
 }
+
+/**
+ * 휴대전화 앞자리 목록 — `FoxPhoneNumber`의 앞자리 셀렉트에 넘긴다.
+ *
+ * **넘기지 않으면 그 셀렉트에 고를 것이 하나도 없다**(@fox의 기본값이 빈 배열이다). 그때도 칸에는
+ * placeholder "010"이 떠서 고른 것처럼 보이는데 값은 빈 문자열이라, 가운데·끝자리를 다 채워도
+ * 8자리만 제출돼 "휴대전화 번호를 정확히 입력해 주세요."로 막힌다.
+ */
+export const MOBILE_PHONE_PREFIXES: readonly string[] = [
+  '010',
+  '011',
+  '016',
+  '017',
+  '018',
+  '019',
+];
Add a comment
List