/** * InvestmentPlanningCenter - 投资规划中心主组件 (Redux 版本) * * 使用 Redux 管理数据,确保列表和日历视图数据同步 * * 组件架构: * - InvestmentPlanningCenter (主组件) * - CalendarPanel (日历面板,懒加载) * - EventPanel (通用事件面板,用于计划和复盘) * - PlanningContext (UI 状态共享) */ import React, { useState, useEffect, useMemo, Suspense, lazy } from 'react'; import { Box, Heading, HStack, Flex, Icon, useColorModeValue, useToast, Tabs, TabList, TabPanels, Tab, TabPanel, Spinner, Center, Button, ButtonGroup, } from '@chakra-ui/react'; import { FiCalendar, FiFileText, FiList, FiPlus, } from 'react-icons/fi'; import { Target } from 'lucide-react'; import GlassCard from '@components/GlassCard'; import { PlanningDataProvider } from './PlanningContext'; import type { PlanningContextValue } from '@/types'; import { useAppDispatch, useAppSelector } from '@/store/hooks'; import { fetchAllEvents, selectAllEvents, selectPlanningLoading, selectPlans, selectReviews, } from '@/store/slices/planningSlice'; import './InvestmentCalendar.less'; // 懒加载子面板组件(实现代码分割) const CalendarPanel = lazy(() => import('./CalendarPanel').then(module => ({ default: module.CalendarPanel })) ); const EventPanel = lazy(() => import('./EventPanel').then(module => ({ default: module.EventPanel })) ); /** * 面板加载占位符 */ const PanelLoadingFallback: React.FC = () => (
); /** * InvestmentPlanningCenter 主组件 */ const InvestmentPlanningCenter: React.FC = () => { const dispatch = useAppDispatch(); const toast = useToast(); // Redux 状态 const allEvents = useAppSelector(selectAllEvents); const loading = useAppSelector(selectPlanningLoading); const plans = useAppSelector(selectPlans); const reviews = useAppSelector(selectReviews); // 颜色主题 const borderColor = useColorModeValue('gray.200', 'gray.600'); const textColor = useColorModeValue('gray.700', 'white'); const secondaryText = useColorModeValue('gray.600', 'gray.400'); const cardBg = useColorModeValue('gray.50', 'gray.700'); // UI 状态 const [viewMode, setViewMode] = useState<'calendar' | 'list'>('list'); const [listTab, setListTab] = useState(0); // 0: 我的计划, 1: 我的复盘 const [openPlanModalTrigger, setOpenPlanModalTrigger] = useState(0); const [openReviewModalTrigger, setOpenReviewModalTrigger] = useState(0); // 组件挂载时加载数据 useEffect(() => { dispatch(fetchAllEvents()); }, [dispatch]); // 刷新数据的方法(供子组件调用) const loadAllData = async (): Promise => { await dispatch(fetchAllEvents()); }; // 提供给子组件的 Context 值 const contextValue: PlanningContextValue = useMemo( () => ({ allEvents, setAllEvents: () => {}, // Redux 管理,不需要 setter loadAllData, loading, setLoading: () => {}, // Redux 管理,不需要 setter openPlanModalTrigger, openReviewModalTrigger, toast, borderColor, textColor, secondaryText, cardBg, setViewMode, setListTab, }), [ allEvents, loading, openPlanModalTrigger, openReviewModalTrigger, toast, borderColor, textColor, secondaryText, cardBg, ] ); // 金色主题色 const goldAccent = 'rgba(212, 175, 55, 0.9)'; return ( {/* 标题区域 */} 投资规划中心 {/* 视图切换按钮组 - H5隐藏 */} {/* 渐变分割线 */} {/* 内容区域 */} {viewMode === 'calendar' ? ( /* 日历视图 */ }> ) : ( /* 列表视图:我的计划 / 我的复盘 切换 */ 我的计划 ({plans.length}) 我的复盘 ({reviews.length}) {/* 计划列表面板 */} }> {/* 复盘列表面板 */} }> )} ); }; export default InvestmentPlanningCenter;