From 85fd94b67671c75ce150050c45827e667b7779ca Mon Sep 17 00:00:00 2001 From: zzlgreat Date: Tue, 3 Feb 2026 14:42:37 +0800 Subject: [PATCH] update pay promo --- .../components/DynamicNews/DynamicNewsCard.js | 63 ++++++++++++++++++- .../components/DynamicNews/constants.js | 41 ++++++++++++ .../DynamicNews/layouts/VerticalModeLayout.js | 21 ++++++- .../EventCard/atoms/EventEngagement.js | 15 ++++- 4 files changed, 136 insertions(+), 4 deletions(-) diff --git a/src/views/Community/components/DynamicNews/DynamicNewsCard.js b/src/views/Community/components/DynamicNews/DynamicNewsCard.js index f39b22ae..bd2ec9f1 100644 --- a/src/views/Community/components/DynamicNews/DynamicNewsCard.js +++ b/src/views/Community/components/DynamicNews/DynamicNewsCard.js @@ -38,7 +38,7 @@ import { selectFourRowEventsWithLoading } from '@store/slices/communityDataSlice'; import { usePagination } from './hooks/usePagination'; -import { PAGINATION_CONFIG, DISPLAY_MODES, REFRESH_DEBOUNCE_DELAY } from './constants'; +import { PAGINATION_CONFIG, DISPLAY_MODES, REFRESH_DEBOUNCE_DELAY, AUTO_REFRESH_INTERVAL, isTradingTime } from './constants'; import { PROFESSIONAL_COLORS } from '@constants/professionalTheme'; import { debounce } from '@utils/debounce'; import { useDevice } from '@hooks/useDevice'; @@ -389,6 +389,67 @@ const [currentMode, setCurrentMode] = useState('vertical'); }; }, [debouncedRefresh]); + /** + * ⚡【盘中自动刷新】在交易时间内每分钟自动刷新列表 + * + * 工作流程: + * 1. 检查是否在交易时间(周一至周五 9:30-11:30, 13:00-15:00) + * 2. 如果在交易时间,设置定时器每分钟刷新 + * 3. 每次定时器触发时,再次检查是否仍在交易时间 + * 4. 组件卸载时清理定时器 + */ + useEffect(() => { + let intervalId = null; + + const startAutoRefresh = () => { + // 先检查一次是否需要启动 + if (isTradingTime()) { + console.log('[DynamicNewsCard] ⏰ 盘中时间,启动自动刷新(每分钟)'); + intervalId = setInterval(() => { + // 每次触发时再次检查交易时间 + if (isTradingTime()) { + console.log('[DynamicNewsCard] 🔄 盘中自动刷新触发'); + // 只在纵向模式第1页或主线模式顶部时刷新 + if (mode === 'vertical' && currentPage === 1) { + handlePageChange(1, true); + } else if (mode === 'mainline') { + const scrollPos = mainlineRef.current?.getScrollPosition(); + if (scrollPos?.isNearTop) { + handlePageChange(1); + } + } + } else { + // 不在交易时间,清除定时器 + console.log('[DynamicNewsCard] ⏹️ 已离开盘中时间,停止自动刷新'); + if (intervalId) { + clearInterval(intervalId); + intervalId = null; + } + } + }, AUTO_REFRESH_INTERVAL); + } + }; + + // 初始启动 + startAutoRefresh(); + + // 每分钟检查一次是否需要启动(如果之前不在交易时间,可能现在进入交易时间了) + const checkIntervalId = setInterval(() => { + if (!intervalId && isTradingTime()) { + startAutoRefresh(); + } + }, 60000); + + // 清理 + return () => { + if (intervalId) { + clearInterval(intervalId); + } + clearInterval(checkIntervalId); + console.log('[DynamicNewsCard] 🧹 清理盘中自动刷新定时器'); + }; + }, [mode, currentPage, handlePageChange]); + // 监听 error 状态,显示空数据提示 useEffect(() => { if (error && error.includes('暂无更多数据')) { diff --git a/src/views/Community/components/DynamicNews/constants.js b/src/views/Community/components/DynamicNews/constants.js index 6d00d90b..5022a3bd 100644 --- a/src/views/Community/components/DynamicNews/constants.js +++ b/src/views/Community/components/DynamicNews/constants.js @@ -48,3 +48,44 @@ export const TOAST_CONFIG = { * - 太长(如 5000ms)→ 用户感知延迟过高 */ export const REFRESH_DEBOUNCE_DELAY = 2000; + +// ========== 盘中自动刷新配置 ========== +/** + * 盘中自动刷新间隔(毫秒) + * + * 作用:在交易时间内定时刷新列表,保持行情数据实时性 + * + * 交易时间:周一至周五 9:30-11:30 和 13:00-15:00 + * + * 推荐值:60000ms (1 分钟) + * - 太短(如 30s)→ API 压力大,用户体验干扰 + * - 太长(如 5min)→ 数据时效性降低 + */ +export const AUTO_REFRESH_INTERVAL = 60000; + +/** + * 判断当前是否在交易时间内 + * @returns {boolean} 是否在交易时间 + */ +export const isTradingTime = () => { + const now = new Date(); + const day = now.getDay(); // 0=周日, 1-5=周一至周五, 6=周六 + + // 周末不是交易时间 + if (day === 0 || day === 6) return false; + + const hours = now.getHours(); + const minutes = now.getMinutes(); + const totalMinutes = hours * 60 + minutes; + + // 上午盘:9:30 - 11:30 (570 - 690 分钟) + const morningStart = 9 * 60 + 30; // 9:30 + const morningEnd = 11 * 60 + 30; // 11:30 + + // 下午盘:13:00 - 15:00 (780 - 900 分钟) + const afternoonStart = 13 * 60; // 13:00 + const afternoonEnd = 15 * 60; // 15:00 + + return (totalMinutes >= morningStart && totalMinutes <= morningEnd) || + (totalMinutes >= afternoonStart && totalMinutes <= afternoonEnd); +}; diff --git a/src/views/Community/components/DynamicNews/layouts/VerticalModeLayout.js b/src/views/Community/components/DynamicNews/layouts/VerticalModeLayout.js index 803129e4..fd175db4 100644 --- a/src/views/Community/components/DynamicNews/layouts/VerticalModeLayout.js +++ b/src/views/Community/components/DynamicNews/layouts/VerticalModeLayout.js @@ -81,7 +81,8 @@ const VerticalModeLayout = React.memo(({ gap={gap} position="relative" transition="all 0.3s ease-in-out" - h="100%" + h={{ base: 'auto', lg: 'calc(100vh - 280px)' }} + minH={{ base: '500px', lg: '600px' }} overflow="hidden" > {/* 左侧:事件列表 - 独立滚动 */} @@ -167,8 +168,24 @@ const VerticalModeLayout = React.memo(({ flex={rightFlex} minHeight={0} position="relative" - overflow="hidden" + overflow="auto" h="100%" + css={{ + overscrollBehavior: 'contain', + '&::-webkit-scrollbar': { + width: '6px', + }, + '&::-webkit-scrollbar-track': { + background: 'transparent', + }, + '&::-webkit-scrollbar-thumb': { + background: 'rgba(136, 136, 136, 0.5)', + borderRadius: '3px', + }, + '&::-webkit-scrollbar-thumb:hover': { + background: 'rgba(136, 136, 136, 0.8)', + }, + }} > {/* 详情面板 */} { + setLocalVote(userVote); + }, [userVote]); + + useEffect(() => { + setLocalBullish(bullishCount); + }, [bullishCount]); + + useEffect(() => { + setLocalBearish(bearishCount); + }, [bearishCount]); + // 尺寸配置 const sizeConfig = { xs: { fontSize: '10px', iconSize: 12, spacing: 1.5, pillPx: 2, pillPy: 0.5 },