import React, { useEffect, useState } from 'react'; import { loadPaperLedger, type PaperLedgerEntryDto } from '../../utils/backendApi'; import { fmtKrw } from '../TradeOrderPanel'; const ENTRY_LABELS: Record = { INITIAL: '초기 예탁', BUY_SETTLE: '매수 결제', SELL_SETTLE: '매도 입금', RESET: '계좌 초기화', FEE: '수수료', ADJUST: '조정', }; interface Props { refreshKey?: number; } const PaperLedgerTab: React.FC = ({ refreshKey = 0 }) => { const [entries, setEntries] = useState([]); const [loading, setLoading] = useState(true); useEffect(() => { let cancelled = false; if (entries.length === 0) setLoading(true); void loadPaperLedger({ page: 0, size: 50 }).then(page => { if (!cancelled) { setEntries(page.content); setLoading(false); } }); return () => { cancelled = true; }; // entries.length: 최초 로드만 스피너 — 갱신 시 목록 유지(깜빡임 방지) // eslint-disable-next-line react-hooks/exhaustive-deps }, [refreshKey]); if (loading) return

원장 로딩…

; if (!entries.length) return

자금 변동 내역이 없습니다.

; return ( {entries.map(e => ( ))}
시각 유형 금액 예수금 종목
{e.createdAt?.slice(5, 16).replace('T', ' ') ?? '—'} {ENTRY_LABELS[e.entryType] ?? e.entryType} = 0 ? 'up' : 'down'}>{e.amount >= 0 ? '+' : ''}{fmtKrw(e.amount)} {fmtKrw(e.cashAfter)} {e.symbol?.replace(/^KRW-/, '') ?? '—'}
); }; export default PaperLedgerTab;