// src/views/Company/components/DynamicTracking/index.js
// 动态跟踪 - 独立一级 Tab 组件(包含新闻动态等二级 Tab)
// 优化:子组件懒加载,骨架屏即时反馈
import React, { useState, useEffect, useMemo, useCallback, memo, lazy } from 'react';
import { Card, CardBody } from '@chakra-ui/react';
import { Newspaper, Megaphone, Calendar, BarChart2 } from 'lucide-react';
import SubTabContainer from '@components/SubTabContainer';
import {
NewsPanelSkeleton,
AnnouncementsSkeleton,
DisclosureScheduleSkeleton,
ForecastPanelSkeleton,
} from './components/DynamicTrackingSkeleton';
// 懒加载子组件
const NewsPanel = lazy(() => import('./components/NewsPanel'));
const ForecastPanel = lazy(() => import('./components/ForecastPanel'));
const AnnouncementsPanel = lazy(() =>
import('../CompanyOverview/BasicInfoTab/components/AnnouncementsPanel')
);
const DisclosureSchedulePanel = lazy(() =>
import('../CompanyOverview/BasicInfoTab/components/DisclosureSchedulePanel')
);
// 二级 Tab 配置(带骨架屏 fallback)
const TRACKING_TABS = [
{
key: 'news',
name: '新闻动态',
icon: Newspaper,
component: NewsPanel,
fallback: ,
},
{
key: 'announcements',
name: '公司公告',
icon: Megaphone,
component: AnnouncementsPanel,
fallback: ,
},
{
key: 'disclosure',
name: '财报披露日程',
icon: Calendar,
component: DisclosureSchedulePanel,
fallback: ,
},
{
key: 'forecast',
name: '业绩预告',
icon: BarChart2,
component: ForecastPanel,
fallback: ,
},
];
/**
* 动态跟踪组件
*
* 功能:
* - 使用 SubTabContainer 实现二级导航(同步渲染,无 loading)
* - 子组件懒加载,减少初始包体积
* - 每个 Tab 有专属骨架屏,提供即时视觉反馈
*
* @param {Object} props
* @param {string} props.stockCode - 股票代码
*/
const DynamicTracking = memo(({ stockCode: propStockCode }) => {
const [stockCode, setStockCode] = useState(propStockCode || '000001');
const [activeTab, setActiveTab] = useState(0);
// 监听 props 中的 stockCode 变化
useEffect(() => {
if (propStockCode && propStockCode !== stockCode) {
setStockCode(propStockCode);
}
}, [propStockCode, stockCode]);
// 传递给子组件的 props
const componentProps = useMemo(
() => ({
stockCode,
}),
[stockCode]
);
// Tab 切换回调
const handleTabChange = useCallback((index) => {
setActiveTab(index);
}, []);
return (
);
});
DynamicTracking.displayName = 'DynamicTracking';
export default DynamicTracking;