import React, { useState, useEffect, useMemo } from 'react'; import { X, Search, Star, Globe, Building2, TrendingUp, TrendingDown, ChevronRight } from 'lucide-react'; import { StockItem, WatchlistGroup, MarketType } from '../types'; import { DbService } from '../services/dbService'; import { MOCK_STOCKS } from '../constants'; interface StockSearchModalProps { onClose: () => void; onSelect: (stock: StockItem) => void; currentMarket: MarketType; } const StockSearchModal: React.FC = ({ onClose, onSelect, currentMarket }) => { const [searchQuery, setSearchQuery] = useState(''); const [groups, setGroups] = useState([]); const [selectedGroupId, setSelectedGroupId] = useState('ALL'); const dbService = useMemo(() => new DbService(), []); useEffect(() => { const fetchGroups = async () => { const data = await dbService.getWatchlistGroups(); setGroups(data.filter(g => g.market === currentMarket)); }; fetchGroups(); }, [dbService, currentMarket]); const filteredStocks = useMemo(() => { let base = MOCK_STOCKS.filter(s => s.market === currentMarket); if (selectedGroupId !== 'ALL') { const group = groups.find(g => g.id === selectedGroupId); if (group) { base = base.filter(s => group.codes.includes(s.code)); } } if (searchQuery) { const lowerQuery = searchQuery.toLowerCase(); base = base.filter(s => s.name.toLowerCase().includes(lowerQuery) || s.code.toLowerCase().includes(lowerQuery) ); } return base; }, [searchQuery, selectedGroupId, groups, currentMarket]); return (
{/* 사이드바: 그룹 목록 */}

관심 그룹

{groups.map(group => ( ))}
{/* 메인: 검색 및 목록 */}
setSearchQuery(e.target.value)} />
{filteredStocks.length > 0 ? ( filteredStocks.map(stock => (
onSelect(stock)} className="p-3 rounded-2xl border border-slate-50 hover:border-blue-100 hover:bg-blue-50/30 cursor-pointer transition-all flex items-center justify-between group" >
{stock.name[0]}
{stock.name}
{stock.code}

{stock.market === MarketType.DOMESTIC ? stock.price.toLocaleString() : `$${stock.price}`}

= 0 ? 'text-rose-500' : 'text-blue-600'}`}> {stock.changePercent >= 0 ? : } {Math.abs(stock.changePercent)}%
)) ) : (

검색 결과가 없습니다.

)}
); }; export default StockSearchModal;