/** * Company 页面顶部搜索栏组件 - FUI 科幻风格 */ import React, { memo, useMemo, useCallback, useState } from 'react'; import { Box, Flex, HStack, VStack, Text } from '@chakra-ui/react'; import { AutoComplete, Input, Spin } from 'antd'; import { SearchOutlined } from '@ant-design/icons'; import { useStockSearch } from '@hooks/useStockSearch'; import { LAYOUT_PADDING } from '@/layouts/config/layoutConfig'; import { THEME } from '../../config'; import { FUI_COLORS, FUI_GLOW } from '../../theme/fui'; import type { CompanyHeaderProps, StockSearchResult } from '../../types'; import { DROPDOWN_STYLE, SEARCH_ICON_STYLE, INPUT_STYLE, AUTOCOMPLETE_STYLE, SEARCH_BOX_SX, } from './constants'; // ============================================ // SearchBox 子组件 // ============================================ const SearchBox = memo<{ onStockChange: (value: string) => void; }>(({ onStockChange }) => { const [inputCode, setInputCode] = useState(''); const { searchResults, isSearching, handleSearch: doSearch, clearSearch, } = useStockSearch({ limit: 10, debounceMs: 300, onSearch: () => {}, }) as { searchResults: StockSearchResult[]; isSearching: boolean; handleSearch: (query: string) => void; clearSearch: () => void; }; const stockOptions = useMemo(() => ( searchResults.map((stock: StockSearchResult) => ({ value: stock.stock_code, label: ( {stock.stock_code} {stock.stock_name} {stock.pinyin_abbr && ( {stock.pinyin_abbr.toUpperCase()} )} ), })) ), [searchResults]); const handleSearch = useCallback(() => { if (inputCode) { onStockChange(inputCode); } }, [inputCode, onStockChange]); const handleSelect = useCallback((value: string) => { clearSearch(); setInputCode(value); onStockChange(value); }, [clearSearch, onStockChange]); const handleKeyDown = useCallback((e: React.KeyboardEvent) => { if (e.key === 'Enter') handleSearch(); }, [handleSearch]); const searchIcon = useMemo(() => ( ), [handleSearch]); return ( : null} > ); }); SearchBox.displayName = 'SearchBox'; // ============================================ // CompanyHeader 主组件 // ============================================ const CompanyHeader: React.FC = memo(({ onStockChange }) => ( 个股详情 查看股票实时行情、财务数据和盈利预测 )); CompanyHeader.displayName = 'CompanyHeader'; export default CompanyHeader;