'use client'; import { useActionState, useEffect, useRef, useState } from 'react'; import { FoxButton } from '@fox/core/components/fox-button'; import { FoxButtonGroup } from '@fox/core/components/fox-button-group'; import { FoxFormLabel } from '@fox/core/components/fox-form-label'; import { FoxInput } from '@fox/core/components/fox-input'; import { FoxModal } from '@fox/core/components/fox-modal'; import { FoxToggleSwitch } from '@fox/core/components/fox-toggle-switch'; import { foxPasswordValidator } from '@fox/core/validation'; import { useFeedback } from '@/app/_hooks/use-feedback'; import { DEFAULT_ADMIN_ROLE_CODE, type AdminMember } from '@/lib/domain/admin-member'; import { ADMIN_EMAIL_MESSAGES, ADMIN_PASSWORD_ERROR_TEXT, ADMIN_PASSWORD_HELP_TEXT, ADMIN_PASSWORD_POLICY, INITIAL_ADMIN_MEMBER_FORM_STATE, adminEmailValidators, toPhoneDigits, } from '@/lib/domain/admin-member-form'; import { updateAdminMemberAction } 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'; import { DEFAULT_MOBILE_PHONE_PREFIX } from '@/lib/domain/phone-number'; interface AdminMemberEditModalProps { member: AdminMember; onClose: () => void; } export function AdminMemberEditModal({ member, onClose, }: AdminMemberEditModalProps) { const { showToast } = useFeedback(); const [state, formAction, isPending] = useActionState( updateAdminMemberAction, INITIAL_ADMIN_MEMBER_FORM_STATE ); const formRef = useRef(null); const [isPasswordEditable, setIsPasswordEditable] = useState(false); const [phoneNumber, setPhoneNumber] = useState( () => toPhoneDigits(member.phoneNumber) || DEFAULT_MOBILE_PHONE_PREFIX ); const [email, setEmail] = useState(member.email ?? ''); const [roleCode, setRoleCode] = useState( member.roleCode || DEFAULT_ADMIN_ROLE_CODE ); const [isActive, setIsActive] = useState(!(member.isLocked ?? false)); useEffect(() => { if (state.status === 'success') { showToast({ variant: 'success', message: '관리자 정보를 수정했습니다.' }); onClose(); } }, [state, showToast, onClose]); const errors = state.status === 'error' ? (state.errors ?? {}) : {}; return ( formRef.current?.requestSubmit()} /> } >
submitFormAction(event, formAction)} className={styles.formList}>
} />
잠김여부
{state.status === 'error' && state.message && (

{state.message}

)}
); }