update pay promo
This commit is contained in:
@@ -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('暂无更多数据')) {
|
||||||
|
|||||||
@@ -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);
|
||||||
|
};
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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 },
|
||||||
|
|||||||
Reference in New Issue
Block a user