diff --git a/src/views/Concept/ConceptTimelineModal.js b/src/views/Concept/ConceptTimelineModal.js index a44049f1..214206e4 100644 --- a/src/views/Concept/ConceptTimelineModal.js +++ b/src/views/Concept/ConceptTimelineModal.js @@ -1,5 +1,6 @@ import React, { useState, useEffect } from 'react'; import { logger } from '../../utils/logger'; +import { useConceptTimelineEvents } from './hooks/useConceptTimelineEvents'; import { Modal, ModalOverlay, @@ -64,6 +65,17 @@ const ConceptTimelineModal = ({ conceptId }) => { const toast = useToast(); + + // 🎯 PostHog 事件追踪 + const { + trackDateToggled, + trackNewsClicked, + trackNewsDetailOpened, + trackReportClicked, + trackReportDetailOpened, + trackModalClosed, + } = useConceptTimelineEvents({ conceptName, conceptId, isOpen }); + const [timelineData, setTimelineData] = useState([]); const [loading, setLoading] = useState(true); const [expandedDates, setExpandedDates] = useState({}); @@ -318,6 +330,11 @@ const ConceptTimelineModal = ({ // 切换日期展开状态 const toggleDateExpand = (date) => { + const willExpand = !expandedDates[date]; + + // 🎯 追踪日期展开/折叠 + trackDateToggled(date, willExpand); + setExpandedDates(prev => ({ ...prev, [date]: !prev[date] @@ -728,6 +745,10 @@ const ConceptTimelineModal = ({ leftIcon={} onClick={() => { if (event.type === 'news') { + // 🎯 追踪新闻点击和详情打开 + trackNewsClicked(event, date); + trackNewsDetailOpened(event); + setSelectedNews({ title: event.title, content: event.content, @@ -737,6 +758,10 @@ const ConceptTimelineModal = ({ }); setIsNewsModalOpen(true); } else if (event.type === 'report') { + // 🎯 追踪研报点击和详情打开 + trackReportClicked(event, date); + trackReportDetailOpened(event); + setSelectedReport({ title: event.title, content: event.content, diff --git a/src/views/Concept/components/ConceptStatsPanel.js b/src/views/Concept/components/ConceptStatsPanel.js index 23117993..68a93935 100644 --- a/src/views/Concept/components/ConceptStatsPanel.js +++ b/src/views/Concept/components/ConceptStatsPanel.js @@ -1,5 +1,6 @@ import React, { useState, useEffect } from 'react'; import { logger } from '../../../utils/logger'; +import { useConceptStatsEvents } from '../hooks/useConceptStatsEvents'; import { Box, SimpleGrid, @@ -54,6 +55,15 @@ const ConceptStatsPanel = ({ apiBaseUrl, onConceptClick }) => { ? '/concept-api' : 'http://111.198.58.126:16801'; + // 🎯 PostHog 事件追踪 + const { + trackTabChanged, + trackTimeRangeChanged, + trackCustomDateRangeSet, + trackRankItemClicked, + trackDataRefreshed, + } = useConceptStatsEvents(); + const [statsData, setStatsData] = useState({}); const [loading, setLoading] = useState(true); const [activeTab, setActiveTab] = useState(0); @@ -180,10 +190,18 @@ const ConceptStatsPanel = ({ apiBaseUrl, onConceptClick }) => { setCustomEndDate(today.toISOString().split('T')[0]); setCustomStartDate(weekAgo.toISOString().split('T')[0]); + + // 🎯 追踪切换到自定义范围 + trackTimeRangeChanged(0, true); } else { setUseCustomRange(false); - setTimeRange(parseInt(newRange)); - fetchStatsData(parseInt(newRange)); + const days = parseInt(newRange); + setTimeRange(days); + + // 🎯 追踪时间范围变化 + trackTimeRangeChanged(days, false); + + fetchStatsData(days); } }; @@ -199,6 +217,10 @@ const ConceptStatsPanel = ({ apiBaseUrl, onConceptClick }) => { }); return; } + + // 🎯 追踪自定义日期范围设置 + trackCustomDateRangeSet(customStartDate, customEndDate); + fetchStatsData(null, customStartDate, customEndDate); } }; @@ -848,7 +870,17 @@ const ConceptStatsPanel = ({ apiBaseUrl, onConceptClick }) => { {/* 主内容卡片 */} - + { + const tabNames = ['涨幅榜', '跌幅榜', '活跃榜', '波动榜', '连涨榜']; + // 🎯 追踪Tab切换 + trackTabChanged(index, tabNames[index]); + setActiveTab(index); + }} + variant="unstyled" + size="sm" + >