import React, { useState, useEffect } from 'react'; import { Newspaper, ExternalLink, RefreshCw, Bookmark, Search, AlertCircle, Sparkles, X, MessageSquareQuote } from 'lucide-react'; import { NewsItem, ApiSettings } from '../types'; import { NaverService } from '../services/naverService'; import { AiService } from '../services/aiService'; interface NewsProps { settings: ApiSettings; } const MOCK_NEWS: NewsItem[] = [ { title: "BatchuKis 마켓 브리핑: AI 트레이딩의 미래", description: "딥러닝 알고리즘을 활용한 자동매매 시장이 국내에서도 빠르게 성장하고 있습니다. 개인 투자자들의 접근성이 확대되며...", link: "#", pubDate: new Date().toISOString() }, { title: "KIS API 연동 가이드: 보안 설정과 데이터 암호화", description: "한국투자증권 오픈 API를 활용한 안전한 트레이딩 환경 구축을 위해 사용자는 반드시 앱키 노출에 주의해야 하며...", link: "#", pubDate: new Date().toISOString() } ]; const News: React.FC = ({ settings }) => { const [loading, setLoading] = useState(false); const [news, setNews] = useState(MOCK_NEWS); const [filter, setFilter] = useState(''); // AI 분석 관련 상태 const [analysisResult, setAnalysisResult] = useState(null); const [isAnalyzing, setIsAnalyzing] = useState(false); const naverService = new NaverService(settings); useEffect(() => { if (settings.useNaverNews) { handleRefresh(); } }, [settings.useNaverNews]); const handleRefresh = async () => { setLoading(true); if (settings.useNaverNews) { const fetchedNews = await naverService.fetchNews(); if (fetchedNews.length > 0) { setNews([...fetchedNews, ...MOCK_NEWS]); } } setTimeout(() => setLoading(false), 800); }; const handleAnalyze = async () => { const aiId = settings.preferredNewsAiId; if (!aiId) { alert("설정 페이지에서 '뉴스 분석 엔진'을 먼저 지정해주세요."); return; } const config = settings.aiConfigs.find(c => c.id === aiId); if (!config) { alert("지정된 AI 엔진 설정을 찾을 수 없습니다."); return; } setIsAnalyzing(true); setAnalysisResult(null); const headlines = news.slice(0, 10).map(n => n.title); try { const fullResult = await AiService.analyzeNewsSentiment(config, headlines); const [report, metadataStr] = fullResult.split('---METADATA---'); setAnalysisResult(report.trim()); if (metadataStr) { try { const metadata = JSON.parse(metadataStr.trim()); if (Array.isArray(metadata)) { setNews(prev => { const updated = [...prev]; metadata.forEach(item => { if (updated[item.index]) { updated[item.index] = { ...updated[item.index], relatedThemes: item.themes, relatedStocks: item.stocks, sentiment: item.sentiment }; } }); return updated; }); } } catch (e) { console.error("메타데이터 파싱 실패:", e); } } } catch (e) { setAnalysisResult("AI 분석 중 오류가 발생했습니다. 설정을 확인해 주세요."); } finally { setIsAnalyzing(false); } }; const filteredNews = news.filter(n => n.title.toLowerCase().includes(filter.toLowerCase()) || n.description.toLowerCase().includes(filter.toLowerCase()) ); return (
{/* 뉴스 스크랩 비활성 알림 */} {!settings.useNaverNews && (
뉴스 스크랩 비활성

네이버 뉴스 연동이 꺼져 있습니다. 설정 메뉴에서 Naver Client ID를 입력하세요.

)} {/* 분석 결과 리포트 */} {analysisResult && (

AI Intelligence Report

{analysisResult}
)} {/* 툴바: 검색 및 실행 버튼 */}
setFilter(e.target.value)} />
{/* 뉴스 리스트 */}
{filteredNews.map((item, idx) => (
Financial Market {new Date(item.pubDate).toLocaleDateString('ko-KR')}

{item.title}

{item.description}

{/* AI 분석 인사이트 태그 */} {(item.relatedThemes || item.relatedStocks) && (
{item.relatedThemes?.map(theme => ( #{theme} ))} {item.relatedStocks?.map(stock => ( {stock} ))}
)}
))}
); }; export default News;