update pay promo

This commit is contained in:
2026-02-03 14:42:37 +08:00
parent 61bbcef58c
commit 85fd94b676
4 changed files with 136 additions and 4 deletions

View File

@@ -38,7 +38,7 @@ import {
selectFourRowEventsWithLoading selectFourRowEventsWithLoading
} from '@store/slices/communityDataSlice'; } from '@store/slices/communityDataSlice';
import { usePagination } from './hooks/usePagination'; 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 { PROFESSIONAL_COLORS } from '@constants/professionalTheme';
import { debounce } from '@utils/debounce'; import { debounce } from '@utils/debounce';
import { useDevice } from '@hooks/useDevice'; import { useDevice } from '@hooks/useDevice';
@@ -389,6 +389,67 @@ const [currentMode, setCurrentMode] = useState('vertical');
}; };
}, [debouncedRefresh]); }, [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 状态,显示空数据提示 // 监听 error 状态,显示空数据提示
useEffect(() => { useEffect(() => {
if (error && error.includes('暂无更多数据')) { if (error && error.includes('暂无更多数据')) {

View File

@@ -48,3 +48,44 @@ export const TOAST_CONFIG = {
* - 太长(如 5000ms→ 用户感知延迟过高 * - 太长(如 5000ms→ 用户感知延迟过高
*/ */
export const REFRESH_DEBOUNCE_DELAY = 2000; 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);
};

View File

@@ -81,7 +81,8 @@ const VerticalModeLayout = React.memo(({
gap={gap} gap={gap}
position="relative" position="relative"
transition="all 0.3s ease-in-out" transition="all 0.3s ease-in-out"
h="100%" h={{ base: 'auto', lg: 'calc(100vh - 280px)' }}
minH={{ base: '500px', lg: '600px' }}
overflow="hidden" overflow="hidden"
> >
{/* 左侧:事件列表 - 独立滚动 */} {/* 左侧:事件列表 - 独立滚动 */}
@@ -167,8 +168,24 @@ const VerticalModeLayout = React.memo(({
flex={rightFlex} flex={rightFlex}
minHeight={0} minHeight={0}
position="relative" position="relative"
overflow="hidden" overflow="auto"
h="100%" 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)',
},
}}
> >
{/* 详情面板 */} {/* 详情面板 */}
<EventDetailScrollPanel <EventDetailScrollPanel

View File

@@ -1,7 +1,7 @@
// src/views/Community/components/EventCard/atoms/EventEngagement.js // src/views/Community/components/EventCard/atoms/EventEngagement.js
// 事件互动组件 - 显示浏览量、关注量和看多/看空投票 // 事件互动组件 - 显示浏览量、关注量和看多/看空投票
import React, { useState, useCallback } from 'react'; import React, { useState, useCallback, useEffect } from 'react';
import { import {
HStack, HStack,
Box, Box,
@@ -47,6 +47,19 @@ const EventEngagement = ({
const [localBearish, setLocalBearish] = useState(bearishCount); const [localBearish, setLocalBearish] = useState(bearishCount);
const [isVoting, setIsVoting] = useState(false); const [isVoting, setIsVoting] = useState(false);
// ⚡ 同步 props 变化到本地状态(当父组件刷新数据时)
useEffect(() => {
setLocalVote(userVote);
}, [userVote]);
useEffect(() => {
setLocalBullish(bullishCount);
}, [bullishCount]);
useEffect(() => {
setLocalBearish(bearishCount);
}, [bearishCount]);
// 尺寸配置 // 尺寸配置
const sizeConfig = { const sizeConfig = {
xs: { fontSize: '10px', iconSize: 12, spacing: 1.5, pillPx: 2, pillPy: 0.5 }, xs: { fontSize: '10px', iconSize: 12, spacing: 1.5, pillPx: 2, pillPy: 0.5 },