import React, { useCallback } from 'react'; import type { PaperAllocationDto } from '../../utils/backendApi'; import { patchPaperAllocation } from '../../utils/backendApi'; import { fmtKrw } from '../TradeOrderPanel'; function coinCode(symbol: string): string { return symbol.replace(/^KRW-/, ''); } interface Props { allocations: PaperAllocationDto[]; selectedMarket?: string; onSelectMarket?: (market: string) => void; onChanged?: () => void; } const PaperAllocationTable: React.FC = ({ allocations, selectedMarket, onSelectMarket, onChanged, }) => { const toggleActive = useCallback(async (row: PaperAllocationDto) => { await patchPaperAllocation(row.symbol, { isActive: !row.isActive }); onChanged?.(); }, [onChanged]); if (!allocations.length) { return (
종목별 한도 0종목

등록된 종목 한도가 없습니다. 가상투자 대상 추가 시 동기화됩니다.

); } return (
종목별 한도 {allocations.length}종목
{allocations.map(row => { const ret = row.symbolReturnPct ?? 0; const selected = row.symbol === selectedMarket; const name = row.koreanName || coinCode(row.symbol); const code = coinCode(row.symbol); const up = ret >= 0; return (
onSelectMarket?.(row.symbol)} onKeyDown={e => { if (e.key === 'Enter' || e.key === ' ') { e.preventDefault(); onSelectMarket?.(row.symbol); } }} >
{name} {code}/KRW
비중 {(row.weightPct ?? 0).toFixed(1)}%
한도 {fmtKrw(row.maxInvestKrw)}
투입 {fmtKrw(row.investedKrw ?? 0)}
평가 {fmtKrw(row.evalAmount ?? 0)}
수익률 {ret >= 0 ? '+' : ''}{ret.toFixed(2)}%
{(row.buyStage1Krw || row.buyStage2Krw || row.sellStage1Krw) ? (
분할 매수 {row.buyStageDone ?? 0}/3 · 매도 {row.sellStageDone ?? 0}/3
) : null}
); })}
); }; export default PaperAllocationTable;