'use client'; import { useActionState, useEffect, useRef, useState, useTransition, } from 'react'; import { FoxButton } from '@fox/core/components/fox-button'; import { FoxButtonGroup } from '@fox/core/components/fox-button-group'; import { FoxEmail } from '@fox/core/components/fox-email'; import { FoxInput } from '@fox/core/components/fox-input'; import { FoxModal } from '@fox/core/components/fox-modal'; import { foxPasswordValidator, foxValidationMessage, foxValidators, } from '@fox/core/validation'; import { useFeedback } from '@/app/_hooks/use-feedback'; import { DEFAULT_ADMIN_ROLE_CODE } from '@/lib/domain/admin-member'; import { DEFAULT_MOBILE_PHONE_PREFIX } from '@/lib/domain/phone-number'; import { ADMIN_EMAIL_MESSAGES, ADMIN_LOGIN_ID_HELP_TEXT, ADMIN_LOGIN_ID_MESSAGES, ADMIN_LOGIN_ID_VALIDATORS, ADMIN_PASSWORD_ERROR_TEXT, ADMIN_PASSWORD_HELP_TEXT, ADMIN_PASSWORD_POLICY, INITIAL_ADMIN_MEMBER_FORM_STATE, adminEmailValidators, } from '@/lib/domain/admin-member-form'; import { checkAdminLoginId, createAdminMemberAction, type LoginIdCheckResult, } from '../_actions'; import { AdminMemberFormFields } from './admin-member-form-fields'; import styles from './admin-member-modal.module.scss'; import { submitFormAction } from '@/app/_hooks/submit-form-action'; interface AdminMemberCreateModalProps { onClose: () => void; } const EMAIL_DOMAIN_OPTIONS = [ 'naver.com', 'gmail.com', 'daum.net', 'hanmail.net', 'nate.com', ]; export function AdminMemberCreateModal({ onClose, }: AdminMemberCreateModalProps) { const { showToast } = useFeedback(); const [state, formAction, isPending] = useActionState( createAdminMemberAction, INITIAL_ADMIN_MEMBER_FORM_STATE ); const formRef = useRef(null); const [loginId, setLoginId] = useState(''); const [checkResult, setCheckResult] = useState({ status: 'idle', }); const [isChecking, startChecking] = useTransition(); const [phoneNumber, setPhoneNumber] = useState(DEFAULT_MOBILE_PHONE_PREFIX); const [emailValue, setEmailValue] = useState(`@${EMAIL_DOMAIN_OPTIONS[0]}`); const [isEmailTouched, setIsEmailTouched] = useState(false); const [roleCode, setRoleCode] = useState(DEFAULT_ADMIN_ROLE_CODE); useEffect(() => { if (state.status === 'success') { showToast({ variant: 'success', message: '관리자를 등록했습니다.' }); onClose(); } }, [state, showToast, onClose]); const isLoginIdVerified = checkResult.status === 'available' && checkResult.loginId === loginId.trim(); const errors = state.status === 'error' ? (state.errors ?? {}) : {}; const [emailLocal = '', emailDomain = ''] = emailValue.split('@'); const email = emailLocal && emailDomain ? emailValue : ''; const emailMessage = errors.email ?? (isEmailTouched ? foxValidationMessage( foxValidators.compose(adminEmailValidators(true))(email), ADMIN_EMAIL_MESSAGES ) : undefined); const loginIdFailure = checkResult.status === 'unavailable' || checkResult.status === 'failed' ? checkResult.message : undefined; const loginIdMessage = loginIdFailure ?? errors.loginId ?? (isLoginIdVerified ? '사용할 수 있는 ID입니다.' : ADMIN_LOGIN_ID_HELP_TEXT); return ( formRef.current?.requestSubmit()} /> } >
submitFormAction(event, formAction)} className={styles.formList}>
); }