/** * GlobalSidebar - 全局右侧工具栏 * * 可收起/展开的侧边栏,包含关注股票和事件动态 * 收起时点击图标显示悬浮弹窗 */ import React from 'react'; import { Box, VStack, Icon, IconButton, Badge, Spinner, Center, Popover, PopoverTrigger, PopoverContent, PopoverBody, PopoverHeader, PopoverCloseButton, Text, HStack, Portal, } from '@chakra-ui/react'; import { ChevronLeft, ChevronRight, BarChart2, Star, TrendingUp } from 'lucide-react'; import { useNavigate } from 'react-router-dom'; import { useGlobalSidebar } from '@/contexts/GlobalSidebarContext'; import { useAuth } from '@/contexts/AuthContext'; import { getEventDetailUrl } from '@/utils/idEncoder'; import { Z_INDEX, LAYOUT_SIZE } from '@/layouts/config/layoutConfig'; import WatchSidebar from '@views/Profile/components/WatchSidebar'; import { WatchlistPanel, FollowingEventsPanel } from '@views/Profile/components/WatchSidebar/components'; import HotSectorsRanking from '@views/Profile/components/MarketDashboard/components/atoms/HotSectorsRanking'; /** * 收起状态下的图标菜单(带悬浮弹窗) */ const CollapsedMenu = ({ watchlist, realtimeQuotes, followingEvents, eventComments, onToggle, onStockClick, onEventClick, onCommentClick, onAddStock, onAddEvent, onUnwatch, onUnfollow, }) => { return ( {/* 展开按钮 */} 展开 {/* 关注股票 - 悬浮弹窗 */} {watchlist.length > 0 && ( {watchlist.length > 99 ? '99+' : watchlist.length} )} 关注股票 关注股票 ({watchlist.length}) {/* 事件动态 - 悬浮弹窗 */} {followingEvents.length > 0 && ( {followingEvents.length > 99 ? '99+' : followingEvents.length} )} 关注事件 事件动态 {/* 热门板块 - 悬浮弹窗 */} 热门板块 ); }; /** * GlobalSidebar 主组件 */ const GlobalSidebar = () => { const { user } = useAuth(); const navigate = useNavigate(); const { isOpen, toggle, watchlist, realtimeQuotes, followingEvents, eventComments, loading, unwatchStock, unfollowEvent, } = useGlobalSidebar(); // 未登录时不显示 if (!user) { return null; } return ( {/* 加载状态 */} {loading && (
)} {isOpen ? ( /* 展开状态 */ {/* 标题栏 - 收起按钮 + 标题 */} } size="xs" variant="ghost" color="rgba(255, 255, 255, 0.5)" _hover={{ color: 'rgba(212, 175, 55, 0.9)', bg: 'rgba(255, 255, 255, 0.05)' }} onClick={toggle} aria-label="收起工具栏" /> 工具栏 {/* WatchSidebar 内容 */} navigate(`/company/${stock.stock_code}`)} onEventClick={(event) => navigate(getEventDetailUrl(event.id))} onCommentClick={(comment) => navigate(getEventDetailUrl(comment.event_id))} onAddStock={() => navigate('/stocks')} onAddEvent={() => navigate('/community')} onUnwatch={unwatchStock} onUnfollow={unfollowEvent} /> ) : ( /* 收起状态 - 点击图标显示悬浮弹窗 */ navigate(`/company/${stock.stock_code}`)} onEventClick={(event) => navigate(getEventDetailUrl(event.id))} onCommentClick={(comment) => navigate(getEventDetailUrl(comment.event_id))} onAddStock={() => navigate('/stocks')} onAddEvent={() => navigate('/community')} onUnwatch={unwatchStock} onUnfollow={unfollowEvent} /> )}
); }; export default GlobalSidebar;