diff --git a/web/frontend/src/pages/Analysis/components/ReportDisplay.js b/web/frontend/src/pages/Analysis/components/ReportDisplay.js index bbf7153f..4860fdd2 100644 --- a/web/frontend/src/pages/Analysis/components/ReportDisplay.js +++ b/web/frontend/src/pages/Analysis/components/ReportDisplay.js @@ -1,8 +1,8 @@ -import React, { useState, useEffect } from 'react'; -import { Card, Tabs, Typography, Table, Tag, Row, Col, Spin, Alert } from 'antd'; +import React from 'react'; +import { Card, Typography } from 'antd'; import styled from 'styled-components'; -const { Title, Paragraph } = Typography; +const { Title } = Typography; const ReportWrapper = styled.div` padding: ${props => props.theme.spacing.md}; @@ -16,144 +16,29 @@ const SectionCard = styled(Card)` & .ant-card-head { background-color: ${props => props.theme.colors.backgroundSecondary}; } + & .ant-card-body { + padding-top: 16px; + padding-bottom: 16px; + } `; const ReportDisplay = ({ reportData }) => { - const [parsedData, setParsedData] = useState(null); - const [loading, setLoading] = useState(true); - const [error, setError] = useState(null); - - useEffect(() => { - if (reportData) { - setLoading(true); - setError(null); - try { - const data = JSON.parse(reportData); - if (data && data.reports) { - setParsedData(data); - } else { - throw new Error("Invalid report structure received."); - } - } catch (e) { - console.error("Failed to parse report JSON:", e); - setError({ - message: "보고서 파싱에 실패했습니다.", - originalData: reportData - }); - } finally { - setLoading(false); - } - } - }, [reportData]); - - if (loading) { - return ; - } - - if (error) { - return ( - - -
-                    {error.originalData}
-                
-
- ); - } - - if (!parsedData) { - return ; - } - - const { company_info, reports, final_decision } = parsedData; - - const renderMarketReport = (data) => { - const { price_summary, indicator_analysis, overall_conclusion } = data; - const indicatorColumns = [ - { title: '지표', dataIndex: 'indicator', key: 'indicator', width: '20%' }, - { title: '값', dataIndex: 'value', key: 'value', width: '15%' }, - { title: '해석', dataIndex: 'interpretation', key: 'interpretation' }, - ]; - return ( - <> - {price_summary} - - - - {overall_conclusion} - - ); - }; - - const renderFundamentalsReport = (data) => { - const { company_overview, financial_performance, stock_market_info, analyst_forecasts, insider_sentiment, summary } = data; - const fundamentalsColumns = [ - { title: '메트릭', dataIndex: 'metric', key: 'metric', width: '40%' }, - { title: '값', dataIndex: 'value', key: 'value', width: '60%' }, - ]; - return ( - <> - {company_overview} -
-
-
- {insider_sentiment} - {summary} - - ); - }; - - const renderGenericReport = (data) => ( - -
-                {JSON.stringify(data, null, 2)}
-            
-
- ); - - const reportRenderers = { - 'market': renderMarketReport, - 'fundamentals': renderFundamentalsReport, - // Add other specific renderers here - }; - - const tabItems = Object.entries(reports) - .filter(([key, data]) => data && !data.error) - .map(([key, data]) => { - const renderer = reportRenderers[key] || renderGenericReport; - // Capitalize first letter for label - const label = key.charAt(0).toUpperCase() + key.slice(1).replace('_', ' '); - return { - key: key, - label: `${label} 리포트`, - children: renderer(data), - }; - }); - - const getTagColor = (proposal) => { - switch (proposal?.toUpperCase()) { - case 'BUY': return 'green'; - case 'SELL': return 'red'; - case 'HOLD': return 'blue'; - default: return 'default'; - } + if (!reportData) { + return null; } return ( - 최종 분석 보고서: {company_info.ticker} - 분석 기준일: {company_info.analysis_date} - - 최종 거래 제안: - {final_decision.final_proposal} - - - + +
+                    {reportData}
+                
+
); };