'use client'; import { useState, useEffect, useMemo } from 'react'; import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'; import { faCircleCheck, faTriangleExclamation } from '@fortawesome/free-solid-svg-icons'; import { fetchApi } from '@/lib/utils/client'; import type { SettlementAccountResponse, SettlementAccountItem } from '@/types/response/settlement/account'; import { BANK_LIST } from '../constants'; import Loading from '@/app/component/Loading'; const MAX_ACCOUNTS = 8; export default function SettlementAccountPage() { const [loading, setLoading] = useState(true); const [submitting, setSubmitting] = useState(false); const [accounts, setAccounts] = useState([]); const [mode, setMode] = useState<'list'|'add'|'edit'>('list'); const [editTarget, setEditTarget] = useState(null); const [bankCode, setBankCode] = useState(''); const [accountNumber, setAccountNumber] = useState(''); const [accountHolder, setAccountHolder] = useState(''); const fetchAccounts = () => { setLoading(true); fetchApi('/api/studio/settlement/account') .then(res => { if (res.data) { setAccounts(res.data.accounts); } }) .catch(() => {}) .finally(() => setLoading(false)); }; useEffect(() => { fetchAccounts(); }, []); const canSubmit = useMemo(() => { return ( bankCode !== '' && /^\d{7,16}$/.test(accountNumber) && accountHolder.trim().length >= 2 && !submitting ); }, [bankCode, accountNumber, accountHolder, submitting]); const resetForm = () => { setBankCode(''); setAccountNumber(''); setAccountHolder(''); setEditTarget(null); }; const handleAdd = () => { resetForm(); setMode('add'); }; const handleEdit = (item: SettlementAccountItem) => { setEditTarget(item); setBankCode(item.bankCode); setAccountNumber(''); setAccountHolder(item.accountHolder); setMode('edit'); }; const handleCancel = () => { resetForm(); setMode('list'); }; const handleDelete = async (item: SettlementAccountItem) => { if (!confirm(`${item.bankName} ${item.accountNumber} 계좌를 삭제하시겠습니까?`)) { return; } try { await fetchApi(`/api/studio/settlement/account/${item.id}`, { method: 'DELETE' }); fetchAccounts(); } catch (err: unknown) { alert(err instanceof Error ? err.message : '계좌 삭제에 실패했습니다.'); } }; const handleSubmit = async () => { if (!canSubmit) { return; } setSubmitting(true); try { await fetchApi('/api/studio/settlement/account', { method: 'POST', body: { accountID: editTarget?.id ?? null, bankCode, accountNumber, accountHolder, }, }); alert(editTarget ? '계좌가 수정되었습니다.' : '계좌가 등록되었습니다.'); resetForm(); setMode('list'); fetchAccounts(); } catch (err: unknown) { alert(err instanceof Error ? err.message : '계좌 등록에 실패했습니다.'); } finally { setSubmitting(false); } }; if (loading) { return ; } return (

계좌 관리

{/* 계좌 추가/수정 폼 */} {mode !== 'list' && (

{mode === 'edit' ? '계좌 수정' : '계좌 추가'}

setAccountNumber(e.target.value.replace(/\D/g, ''))} maxLength={16} />
setAccountHolder(e.target.value)} />
  • 본인 명의 계좌만 등록 가능합니다.
  • 출금 시 등록된 계좌로 입금됩니다.
)} {/* 계좌 목록 */} {mode === 'list' && ( <>
등록 계좌 {accounts.length}/{MAX_ACCOUNTS} {accounts.length < MAX_ACCOUNTS && ( )}
{accounts.length === 0 ? (
등록된 계좌가 없습니다. 출금을 위해 계좌를 등록해 주세요.
) : (
{accounts.map(item => (
{item.bankName} {item.accountNumber} 예금주: {item.accountHolder} {item.isVerified ? ( <> 인증 완료 ) : ( <> 미인증 )} · 등록일 {item.registeredAt.slice(0, 10).replace(/-/g, '.')}
))}
)} )}
); }