import React from 'react'; import Loading from '../../../components/Loading'; import { ResponsiveContainer, AreaChart, Area, XAxis, YAxis, Tooltip as ChartTooltip, } from 'recharts'; import { formatNumber, formatPercent, toNumeric, profitColorClass, numFitClass } from '../stockUtils'; const formatPriceTime = (iso) => { if (!iso) return ''; const d = new Date(iso); if (Number.isNaN(d.getTime())) return ''; return `${String(d.getHours()).padStart(2, '0')}:${String(d.getMinutes()).padStart(2, '0')}`; }; const PriceSessionBadge = ({ session, asOf }) => { if (session !== 'NXT_AFTER' && session !== 'NXT_PRE') return null; const isPre = session === 'NXT_PRE'; const label = isPre ? 'NXT 프리' : 'NXT'; const desc = isPre ? 'NXT 프리마켓 거래가' : 'NXT 야간거래 (15:30~20:00)'; const time = formatPriceTime(asOf); return ( {label} ); }; const PortfolioTab = ({ pf, asset, handleSell, handleSaveSnapshot }) => ( <> {pf.portfolioError ? (
{pf.portfolioError}
) : null} {/* 포트폴리오 관리 헤더 + 추가 폼 */}포트폴리오
증권사별 보유 종목을 수동 등록하면 현재가를 자동 조회합니다. (3분 캐시)
총 자산 추이
예수금 관리
증권사별 예수금을 입력하면 총 자산에 자동 반영됩니다.
등록된 예수금이 없습니다.
)}{broker}
{items.length}종목 · 총 매입{' '} {formatNumber(bSummary.totalBuy)} · 평가{' '} {formatNumber(bSummary.totalEval)} · 손익{' '} {formatNumber(bSummary.totalProfit)} ( {formatPercent(bSummary.totalProfitRate)}) {(() => { const bc = pf.cashList.find((c) => c.broker === broker); return bc ? ( 예수금 {formatNumber(bc.cash)}원 ) : null; })()}
{item.name ?? item.ticker ?? 'N/A'}
{item.ticker ?? ''}등록된 종목이 없습니다. 상단의 + 종목 추가 버튼으로 보유 종목을 등록하세요.