diff --git a/src/components/GlobalSidebar/index.js b/src/components/GlobalSidebar/index.js new file mode 100644 index 00000000..6ea5e5bc --- /dev/null +++ b/src/components/GlobalSidebar/index.js @@ -0,0 +1,197 @@ +/** + * GlobalSidebar - 全局右侧工具栏 + * + * 可收起/展开的侧边栏,包含关注股票和事件动态 + */ + +import React from 'react'; +import { + Box, + VStack, + Icon, + IconButton, + Tooltip, + Badge, + Spinner, + Center, +} from '@chakra-ui/react'; +import { ChevronLeft, ChevronRight, BarChart2, Star } 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 WatchSidebar from '@views/Profile/components/WatchSidebar'; + +/** + * 收起状态下的图标菜单 + */ +const CollapsedMenu = ({ watchlist, followingEvents, onToggle }) => { + return ( + + {/* 展开按钮 */} + + } + size="sm" + variant="ghost" + color="rgba(255, 255, 255, 0.6)" + _hover={{ color: 'rgba(212, 175, 55, 0.9)', bg: 'rgba(255, 255, 255, 0.05)' }} + onClick={onToggle} + aria-label="展开工具栏" + /> + + + {/* 关注股票图标 */} + + + + {watchlist.length > 0 && ( + + {watchlist.length > 99 ? '99+' : 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.4)" + _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} + /> + + + ) : ( + /* 收起状态 */ + + )} +
+ ); +}; + +export default GlobalSidebar;