update pay function

This commit is contained in:
2025-11-29 14:07:55 +08:00
parent 1676d69917
commit d14be2081d
5 changed files with 68 additions and 38 deletions

View File

@@ -683,15 +683,6 @@ const [currentMode, setCurrentMode] = useState('vertical');
</ModalContent> </ModalContent>
</Modal> </Modal>
)} )}
{/* 右侧分页控制器仅在纵向模式显示H5 放不下时折行 */}
{mode === 'vertical' && totalPages > 1 && (
<PaginationControl
currentPage={currentPage}
totalPages={totalPages}
onPageChange={handlePageChangeWithScroll}
/>
)}
</Card> </Card>
); );
}); });

View File

@@ -141,6 +141,9 @@ const EventScrollList = React.memo(({
onToggleFollow={onToggleFollow} onToggleFollow={onToggleFollow}
getTimelineBoxStyle={getTimelineBoxStyle} getTimelineBoxStyle={getTimelineBoxStyle}
borderColor={borderColor} borderColor={borderColor}
currentPage={currentPage}
totalPages={totalPages}
onPageChange={onPageChange}
/> />
</Box> </Box>
); );

View File

@@ -15,6 +15,7 @@ import { InfoIcon } from '@chakra-ui/icons';
import HorizontalDynamicNewsEventCard from '../EventCard/HorizontalDynamicNewsEventCard'; import HorizontalDynamicNewsEventCard from '../EventCard/HorizontalDynamicNewsEventCard';
import EventDetailScrollPanel from './EventDetailScrollPanel'; import EventDetailScrollPanel from './EventDetailScrollPanel';
import EventDetailModal from '../EventDetailModal'; import EventDetailModal from '../EventDetailModal';
import PaginationControl from './PaginationControl';
/** /**
* 纵向分栏模式布局 * 纵向分栏模式布局
@@ -28,6 +29,9 @@ import EventDetailModal from '../EventDetailModal';
* @param {Function} onToggleFollow - 关注按钮回调 * @param {Function} onToggleFollow - 关注按钮回调
* @param {Function} getTimelineBoxStyle - 时间线样式获取函数 * @param {Function} getTimelineBoxStyle - 时间线样式获取函数
* @param {string} borderColor - 边框颜色 * @param {string} borderColor - 边框颜色
* @param {number} currentPage - 当前页码
* @param {number} totalPages - 总页数
* @param {Function} onPageChange - 页码改变回调
*/ */
const VerticalModeLayout = React.memo(({ const VerticalModeLayout = React.memo(({
display = 'flex', display = 'flex',
@@ -38,6 +42,9 @@ const VerticalModeLayout = React.memo(({
onToggleFollow, onToggleFollow,
getTimelineBoxStyle, getTimelineBoxStyle,
borderColor, borderColor,
currentPage = 1,
totalPages = 1,
onPageChange,
}) => { }) => {
// 详情面板重置 key预留用于未来功能 // 详情面板重置 key预留用于未来功能
const [detailPanelKey] = useState(0); const [detailPanelKey] = useState(0);
@@ -137,6 +144,17 @@ const VerticalModeLayout = React.memo(({
</VStack> </VStack>
</Center> </Center>
)} )}
{/* 分页控制器 - 放在事件列表下方 */}
{totalPages > 1 && onPageChange && (
<Box pt={3} pb={1}>
<PaginationControl
currentPage={currentPage}
totalPages={totalPages}
onPageChange={onPageChange}
/>
</Box>
)}
</Box> </Box>
{/* 右侧:事件详情 - 独立滚动 - 移动端隐藏 */} {/* 右侧:事件详情 - 独立滚动 - 移动端隐藏 */}

View File

@@ -75,7 +75,9 @@ const DynamicNewsDetailPanel = ({ event, showHeader = true }) => {
featureName: '' featureName: ''
}); });
// 使用 Hook 获取实时数据(禁用自动加载,改为手动触发) // 使用 Hook 获取实时数据
// - autoLoad: false - 禁用自动加载所有数据,改为手动触发
// - autoLoadQuotes: false - 禁用自动加载行情,延迟到展开时加载(减少请求)
const { const {
stocks, stocks,
quotes, quotes,
@@ -85,8 +87,9 @@ const DynamicNewsDetailPanel = ({ event, showHeader = true }) => {
loading, loading,
loadStocksData, loadStocksData,
loadHistoricalData, loadHistoricalData,
loadChainAnalysis loadChainAnalysis,
} = useEventStocks(event?.id, event?.created_at, { autoLoad: false }); refreshQuotes
} = useEventStocks(event?.id, event?.created_at, { autoLoad: false, autoLoadQuotes: false });
// 🎯 加载事件详情(增加浏览量)- 与 EventDetailModal 保持一致 // 🎯 加载事件详情(增加浏览量)- 与 EventDetailModal 保持一致
const loadEventDetail = useCallback(async () => { const loadEventDetail = useCallback(async () => {
@@ -119,12 +122,14 @@ const DynamicNewsDetailPanel = ({ event, showHeader = true }) => {
const canAccessTransmission = hasAccess('max'); const canAccessTransmission = hasAccess('max');
// 子区块折叠状态管理 + 加载追踪 // 子区块折叠状态管理 + 加载追踪
// 初始值为 false由 useEffect 根据权限动态设置 // 相关股票默认折叠,只显示数量吸引点击
const [isStocksOpen, setIsStocksOpen] = useState(false); const [isStocksOpen, setIsStocksOpen] = useState(false);
const [hasLoadedStocks, setHasLoadedStocks] = useState(false); const [hasLoadedStocks, setHasLoadedStocks] = useState(false); // 股票列表是否已加载(获取数量)
const [hasLoadedQuotes, setHasLoadedQuotes] = useState(false); // 行情数据是否已加载
const [isConceptsOpen, setIsConceptsOpen] = useState(false); const [isConceptsOpen, setIsConceptsOpen] = useState(false);
// 历史事件默认折叠,但预加载数量
const [isHistoricalOpen, setIsHistoricalOpen] = useState(false); const [isHistoricalOpen, setIsHistoricalOpen] = useState(false);
const [hasLoadedHistorical, setHasLoadedHistorical] = useState(false); const [hasLoadedHistorical, setHasLoadedHistorical] = useState(false);
@@ -159,34 +164,41 @@ const DynamicNewsDetailPanel = ({ event, showHeader = true }) => {
}); });
}, []); }, []);
// 相关股票 - 展开时加载(需要 PRO 权限) // 相关股票 - 展开时加载行情(需要 PRO 权限)
// 股票列表在事件切换时预加载(显示数量),行情在展开时才加载
const handleStocksToggle = useCallback(() => { const handleStocksToggle = useCallback(() => {
const newState = !isStocksOpen; const newState = !isStocksOpen;
setIsStocksOpen(newState); setIsStocksOpen(newState);
if (newState && !hasLoadedStocks) { // 展开时加载行情数据(如果还没加载过)
console.log('%c📊 [相关股票] 首次展开,加载股票数据', 'color: #10B981; font-weight: bold;', { eventId: event?.id }); if (newState && !hasLoadedQuotes && stocks.length > 0) {
loadStocksData(); console.log('%c📈 [相关股票] 首次展开,加载行情数据', 'color: #10B981; font-weight: bold;', {
setHasLoadedStocks(true); eventId: event?.id,
stockCount: stocks.length
});
refreshQuotes();
setHasLoadedQuotes(true);
} }
}, [isStocksOpen, hasLoadedStocks, loadStocksData, event?.id]); }, [isStocksOpen, hasLoadedQuotes, stocks.length, refreshQuotes, event?.id]);
// 相关概念 - 展开/收起(无需加载) // 相关概念 - 展开/收起(无需加载)
const handleConceptsToggle = useCallback(() => { const handleConceptsToggle = useCallback(() => {
setIsConceptsOpen(!isConceptsOpen); setIsConceptsOpen(!isConceptsOpen);
}, [isConceptsOpen]); }, [isConceptsOpen]);
// 历史事件对比 - 展开时加载 // 历史事件对比 - 数据已预加载,只需切换展开状态
const handleHistoricalToggle = useCallback(() => { const handleHistoricalToggle = useCallback(() => {
const newState = !isHistoricalOpen; const newState = !isHistoricalOpen;
setIsHistoricalOpen(newState); setIsHistoricalOpen(newState);
if (newState && !hasLoadedHistorical) { // 数据已在事件切换时预加载,这里只需展开
console.log('%c📜 [历史事件] 首次展开,加载历史事件数据', 'color: #3B82F6; font-weight: bold;', { eventId: event?.id }); if (newState) {
loadHistoricalData(); console.log('%c📜 [历史事件] 展开(数据已预加载)', 'color: #3B82F6; font-weight: bold;', {
setHasLoadedHistorical(true); eventId: event?.id,
count: historicalEvents?.length || 0
});
} }
}, [isHistoricalOpen, hasLoadedHistorical, loadHistoricalData, event?.id]); }, [isHistoricalOpen, event?.id, historicalEvents?.length]);
// 传导链分析 - 展开时加载 // 传导链分析 - 展开时加载
const handleTransmissionToggle = useCallback(() => { const handleTransmissionToggle = useCallback(() => {
@@ -209,24 +221,29 @@ const DynamicNewsDetailPanel = ({ event, showHeader = true }) => {
// 重置所有加载状态 // 重置所有加载状态
setHasLoadedStocks(false); setHasLoadedStocks(false);
setHasLoadedQuotes(false); // 重置行情加载状态
setHasLoadedHistorical(false); setHasLoadedHistorical(false);
setHasLoadedTransmission(false); setHasLoadedTransmission(false);
// 相关股票默认展开(有权限时 // 相关股票默认折叠,但预加载股票列表(显示数量吸引点击
setIsStocksOpen(false);
if (canAccessStocks) { if (canAccessStocks) {
setIsStocksOpen(true); console.log('%c📊 [相关股票] 事件切换,预加载股票列表(获取数量)', 'color: #10B981; font-weight: bold;', { eventId: event?.id });
// 立即加载股票数据
console.log('%c📊 [相关股票] 事件切换,加载股票数据', 'color: #10B981; font-weight: bold;', { eventId: event?.id });
loadStocksData(); loadStocksData();
setHasLoadedStocks(true); setHasLoadedStocks(true);
} else { }
setIsStocksOpen(false);
// 历史事件默认折叠,但预加载数据(显示数量吸引点击)
setIsHistoricalOpen(false);
if (canAccessHistorical) {
console.log('%c📜 [历史事件] 事件切换,预加载历史事件(获取数量)', 'color: #3B82F6; font-weight: bold;', { eventId: event?.id });
loadHistoricalData();
setHasLoadedHistorical(true);
} }
setIsConceptsOpen(false); setIsConceptsOpen(false);
setIsHistoricalOpen(false);
setIsTransmissionOpen(false); setIsTransmissionOpen(false);
}, [event?.id, canAccessStocks, userTier, loadStocksData, loadEventDetail]); }, [event?.id, canAccessStocks, canAccessHistorical, userTier, loadStocksData, loadHistoricalData, loadEventDetail]);
// 切换关注状态 // 切换关注状态
const handleToggleFollow = useCallback(async () => { const handleToggleFollow = useCallback(async () => {

View File

@@ -19,9 +19,10 @@ import { logger } from '../../../../../utils/logger';
* @param {string} eventTime - 事件时间 * @param {string} eventTime - 事件时间
* @param {Object} options - 配置选项 * @param {Object} options - 配置选项
* @param {boolean} options.autoLoad - 是否自动加载数据默认true * @param {boolean} options.autoLoad - 是否自动加载数据默认true
* @param {boolean} options.autoLoadQuotes - 是否自动加载行情数据默认true设为false可延迟到展开时加载
* @returns {Object} 事件数据和加载状态 * @returns {Object} 事件数据和加载状态
*/ */
export const useEventStocks = (eventId, eventTime, { autoLoad = true } = {}) => { export const useEventStocks = (eventId, eventTime, { autoLoad = true, autoLoadQuotes = true } = {}) => {
const dispatch = useDispatch(); const dispatch = useDispatch();
// 从 Redux 获取数据 // 从 Redux 获取数据
@@ -122,12 +123,12 @@ export const useEventStocks = (eventId, eventTime, { autoLoad = true } = {}) =>
} }
}, [eventId, autoLoad, loadAllData]); // 添加 loadAllData 依赖 }, [eventId, autoLoad, loadAllData]); // 添加 loadAllData 依赖
// 自动加载行情数据 // 自动加载行情数据(可通过 autoLoadQuotes 参数控制)
useEffect(() => { useEffect(() => {
if (stocks.length > 0) { if (stocks.length > 0 && autoLoadQuotes) {
refreshQuotes(); refreshQuotes();
} }
}, [stocks.length, eventId]); // 注意:这里不依赖 refreshQuotes避免重复请求 }, [stocks.length, eventId, autoLoadQuotes]); // 注意:这里不依赖 refreshQuotes避免重复请求
// 计算股票行情合并数据 // 计算股票行情合并数据
const stocksWithQuotes = useMemo(() => { const stocksWithQuotes = useMemo(() => {