// src/views/Company/components/CompanyHeader/SearchBar.js // 股票搜索栏组件 - 金色主题 + 模糊搜索下拉 import React, { useState, useEffect, useRef } from 'react'; import { useSelector } from 'react-redux'; import { Box, HStack, Input, InputGroup, InputLeftElement, Text, VStack, } from '@chakra-ui/react'; import { SearchIcon } from '@chakra-ui/icons'; import { useStockSearch } from '../../hooks/useStockSearch'; /** * 股票搜索栏组件(带模糊搜索下拉) * * @param {Object} props * @param {string} props.inputCode - 输入框当前值 * @param {Function} props.onInputChange - 输入变化回调 * @param {Function} props.onSearch - 搜索按钮点击回调 * @param {Function} props.onKeyDown - 键盘事件回调 */ const SearchBar = ({ inputCode, onInputChange, onSearch, onKeyDown, }) => { // 下拉状态 const [showDropdown, setShowDropdown] = useState(false); const containerRef = useRef(null); // 从 Redux 获取全部股票列表 const allStocks = useSelector(state => state.stock.allStocks); // 使用共享的搜索 Hook const filteredStocks = useStockSearch(allStocks, inputCode, { limit: 10 }); // 根据搜索结果更新下拉显示状态 useEffect(() => { setShowDropdown(filteredStocks.length > 0 && !!inputCode?.trim()); }, [filteredStocks, inputCode]); // 点击外部关闭下拉 useEffect(() => { const handleClickOutside = (event) => { if (containerRef.current && !containerRef.current.contains(event.target)) { setShowDropdown(false); } }; document.addEventListener('mousedown', handleClickOutside); return () => document.removeEventListener('mousedown', handleClickOutside); }, []); // 选择股票 - 直接触发搜索跳转 const handleSelectStock = (stock) => { onInputChange(stock.code); setShowDropdown(false); onSearch(stock.code); }; // 处理键盘事件 const handleKeyDownWrapper = (e) => { if (e.key === 'Enter') { setShowDropdown(false); } onKeyDown?.(e); }; return ( onInputChange(e.target.value)} onKeyDown={handleKeyDownWrapper} onFocus={() => inputCode && filteredStocks.length > 0 && setShowDropdown(true)} borderRadius="md" color="white" borderColor="#C9A961" _placeholder={{ color: '#C9A961' }} _focus={{ borderColor: '#F4D03F', boxShadow: '0 0 0 1px #F4D03F', }} _hover={{ borderColor: '#F4D03F', }} /> {/* 模糊搜索下拉列表 */} {showDropdown && ( {filteredStocks.map((stock) => ( handleSelectStock(stock)} borderBottom="1px solid" borderColor="whiteAlpha.100" _last={{ borderBottom: 'none' }} > {stock.code} {stock.name} ))} )} ); }; export default SearchBar;