// src/components/Navbars/components/FeatureMenus/WatchlistMenu.js // 自选股下拉菜单组件 import React, { memo } from 'react'; import { Menu, MenuButton, MenuList, MenuItem, MenuDivider, Button, Badge, Box, Text, HStack, VStack, Spinner, useColorModeValue } from '@chakra-ui/react'; import { ChevronDownIcon } from '@chakra-ui/icons'; import { FiStar } from 'react-icons/fi'; import { useNavigate } from 'react-router-dom'; import { useWatchlist } from '../../../../hooks/useWatchlist'; /** * 自选股下拉菜单组件 * 显示用户自选股实时行情,支持分页和移除 * 仅在桌面版 (lg+) 显示 */ const WatchlistMenu = memo(() => { const navigate = useNavigate(); const { watchlistQuotes, watchlistLoading, watchlistPage, setWatchlistPage, WATCHLIST_PAGE_SIZE, loadWatchlistQuotes, handleRemoveFromWatchlist } = useWatchlist(); const titleColor = useColorModeValue('gray.600', 'gray.300'); const loadingTextColor = useColorModeValue('gray.500', 'gray.300'); const emptyTextColor = useColorModeValue('gray.500', 'gray.300'); const codeTextColor = useColorModeValue('gray.500', 'gray.400'); const pageTextColor = useColorModeValue('gray.600', 'gray.400'); return ( } leftIcon={} > 自选股 {watchlistQuotes && watchlistQuotes.length > 0 && ( {watchlistQuotes.length} )} 我的自选股 {watchlistLoading ? ( 加载中... ) : ( <> {(!watchlistQuotes || watchlistQuotes.length === 0) ? ( 暂无自选股 ) : ( {watchlistQuotes .slice((watchlistPage - 1) * WATCHLIST_PAGE_SIZE, watchlistPage * WATCHLIST_PAGE_SIZE) .map((item) => ( navigate(`/company?scode=${item.stock_code}`)} > {item.stock_name || item.stock_code} {item.stock_code} 0 ? 'red' : ((item.change_percent || 0) < 0 ? 'green' : 'gray') } fontSize="xs" > {(item.change_percent || 0) > 0 ? '+' : ''} {(item.change_percent || 0).toFixed(2)}% {item.current_price?.toFixed ? item.current_price.toFixed(2) : (item.current_price || '-')} { e.preventDefault(); e.stopPropagation(); handleRemoveFromWatchlist(item.stock_code); }} > 取消 ))} )} {watchlistPage} / {Math.max(1, Math.ceil((watchlistQuotes?.length || 0) / WATCHLIST_PAGE_SIZE))} )} ); }); WatchlistMenu.displayName = 'WatchlistMenu'; export default WatchlistMenu;