feat: 주식 보유종목 인텔리전스 탭 (액션·이슈·포트건강)

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-05-31 22:32:35 +09:00
parent b15cbbb1b6
commit 597e6504e1
5 changed files with 376 additions and 4 deletions

View File

@@ -6,7 +6,7 @@ import SwipeableView from '../../components/SwipeableView';
import {
formatNumber, formatPercent,
toNumeric, profitColorClass,
TAB_PORTFOLIO, TAB_REPORT, TAB_ADVISOR,
TAB_PORTFOLIO, TAB_REPORT, TAB_ADVISOR, TAB_HOLDINGS_INTEL,
} from './stockUtils';
/* ── hooks ──────────────────────────────────────────────────────── */
@@ -22,6 +22,7 @@ import useAdvisor from './hooks/useAdvisor';
import PortfolioTab from './components/PortfolioTab';
import ReportTab from './components/ReportTab';
import AdvisorTab from './components/AdvisorTab';
import HoldingsIntelTab from './components/HoldingsIntelTab';
import SellHistoryDrawer from './components/SellHistoryDrawer';
/* ── component ───────────────────────────────────────────────────── */
@@ -30,8 +31,8 @@ const StockTrade = () => {
const [activeTab, setActiveTab] = React.useState(TAB_REPORT);
const isMobile = useIsMobile();
const TAB_ORDER = [TAB_PORTFOLIO, TAB_REPORT, TAB_ADVISOR];
const tabLabels = ['포트폴리오', '리포트', '어드바이저'];
const TAB_ORDER = [TAB_PORTFOLIO, TAB_REPORT, TAB_ADVISOR, TAB_HOLDINGS_INTEL];
const tabLabels = ['포트폴리오', '리포트', '어드바이저', '보유종목 인텔'];
const tabIndex = TAB_ORDER.indexOf(activeTab);
const handleTabChange = useCallback((idx) => setActiveTab(TAB_ORDER[idx]), []); // eslint-disable-line react-hooks/exhaustive-deps
@@ -166,7 +167,9 @@ const StockTrade = () => {
? <PortfolioTab pf={pf} asset={asset} handleSell={handleSell} handleSaveSnapshot={handleSaveSnapshot} />
: tabId === TAB_REPORT
? <ReportTab pf={pf} report={report} ai={ai} marketCtx={marketCtx} />
: <AdvisorTab pf={pf} advisor={advisor} />,
: tabId === TAB_ADVISOR
? <AdvisorTab pf={pf} advisor={advisor} />
: <HoldingsIntelTab />,
}))}
activeIndex={tabIndex}
onTabChange={handleTabChange}
@@ -178,6 +181,7 @@ const StockTrade = () => {
{ id: TAB_PORTFOLIO, icon: '💼', label: '쟁승토리 계좌', badge: pf.portfolioHoldings.length || null },
{ id: TAB_REPORT, icon: '📊', label: '리포트', sub: '분석·AI코치' },
{ id: TAB_ADVISOR, icon: '🧠', label: 'AI 어드바이저', sub: 'Gemini Pro', className: 'stock-main-tab--advisor' },
{ id: TAB_HOLDINGS_INTEL, icon: '🔍', label: '보유종목 인텔', sub: '신호·이슈', className: 'stock-main-tab--holdings-intel' },
].map(({ id, icon, label, sub, badge, className: cls }) => (
<button
key={id}
@@ -198,6 +202,7 @@ const StockTrade = () => {
)}
{activeTab === TAB_REPORT && <ReportTab pf={pf} report={report} ai={ai} marketCtx={marketCtx} />}
{activeTab === TAB_ADVISOR && <AdvisorTab pf={pf} advisor={advisor} />}
{activeTab === TAB_HOLDINGS_INTEL && <HoldingsIntelTab />}
</>
)}