update pay promo

This commit is contained in:
2026-02-03 16:35:16 +08:00
parent eb942bfc34
commit 5017d3b8aa
2 changed files with 49 additions and 6 deletions

View File

@@ -1,5 +1,5 @@
// StockSummaryCard 主组件
import React, { memo } from 'react';
import React, { memo, useMemo } from 'react';
import { SimpleGrid, HStack, Text, VStack } from '@chakra-ui/react';
import { Flame, Coins, DollarSign, Shield } from 'lucide-react';
import StockHeaderCard from './StockHeaderCard';
@@ -10,15 +10,35 @@ import { formatNumber, formatPercent } from '../../utils/formatUtils';
import { darkGoldTheme } from '../../constants';
import type { StockSummaryCardProps } from '../../types';
interface ExtendedStockSummaryCardProps extends StockSummaryCardProps {
realtimePrice?: number;
realtimeChangePercent?: number;
}
/**
* 股票概览卡片组件
* 4 列横向布局:股票信息 + 交易热度 + 估值安全 + 情绪风险
*/
const StockSummaryCard: React.FC<StockSummaryCardProps> = ({ summary }) => {
const StockSummaryCard: React.FC<ExtendedStockSummaryCardProps> = ({
summary,
realtimePrice,
realtimeChangePercent,
}) => {
if (!summary) return null;
const { latest_trade, latest_funding, latest_pledge } = summary;
// 使用实时数据优先,否则回退到日频数据
const displayPrice = useMemo(() => {
if (realtimePrice && realtimePrice > 0) return realtimePrice;
return latest_trade?.close || 0;
}, [realtimePrice, latest_trade?.close]);
const displayChangePercent = useMemo(() => {
if (realtimeChangePercent !== undefined && realtimeChangePercent !== null) return realtimeChangePercent;
return latest_trade?.change_percent || 0;
}, [realtimeChangePercent, latest_trade?.change_percent]);
// 计算状态
const turnoverStatus = latest_trade
? getTurnoverStatus(latest_trade.turnover_rate)
@@ -32,13 +52,13 @@ const StockSummaryCard: React.FC<StockSummaryCardProps> = ({ summary }) => {
return (
<SimpleGrid columns={{ base: 1, md: 2, lg: 4 }} spacing={3}>
{/* 卡片1: 股票信息 */}
{/* 卡片1: 股票信息 - 使用实时数据 */}
{latest_trade && (
<StockHeaderCard
stockName={summary.stock_name}
stockCode={summary.stock_code}
price={latest_trade.close}
changePercent={latest_trade.change_percent}
price={displayPrice}
changePercent={displayChangePercent}
/>
)}
{/* 卡片1: 交易热度 */}

View File

@@ -16,6 +16,9 @@ import { Unlock, ArrowUp, Star, Lock } from 'lucide-react';
import SubTabContainer from '@components/SubTabContainer';
import type { SubTabConfig } from '@components/SubTabContainer';
// 实时行情 Hook
import { useRealtimeQuote } from '@hooks/useRealtimeQuote';
// 内部模块导入
import { themes, DEFAULT_PERIOD } from './constants';
import { useMarketData } from './hooks/useMarketData';
@@ -67,6 +70,17 @@ const MarketDataView: React.FC<MarketDataViewProps> = ({ stockCode: propStockCod
loadDataByType,
} = useMarketData(stockCode, selectedPeriod);
// 获取实时行情数据
const subscribedCodes = useMemo(() => {
if (!stockCode) return [];
const baseCode = stockCode.split('.')[0];
const isShanghai = baseCode.startsWith('6') || baseCode.startsWith('5');
return [isShanghai ? `${baseCode}.SH` : `${baseCode}.SZ`];
}, [stockCode]);
const { quotes: realtimeQuotes } = useRealtimeQuote(subscribedCodes);
const realtimeQuote = subscribedCodes.length > 0 ? realtimeQuotes[subscribedCodes[0]] : null;
// Tab 切换时按需加载数据
const handleTabChange = useCallback((index: number) => {
setActiveTab(index);
@@ -138,7 +152,16 @@ const MarketDataView: React.FC<MarketDataViewProps> = ({ stockCode: propStockCod
<Container maxW="container.xl" py={4}>
<VStack align="stretch" spacing={4}>
{/* 股票概览 - 未加载时显示骨架屏占位,避免布局跳动 */}
{summary ? <StockSummaryCard summary={summary} theme={theme} /> : <SummaryCardSkeleton />}
{summary ? (
<StockSummaryCard
summary={summary}
theme={theme}
realtimePrice={realtimeQuote?.price}
realtimeChangePercent={realtimeQuote?.changePct}
/>
) : (
<SummaryCardSkeleton />
)}
{/* 交易数据 - 日K/分钟K线独立显示在 Tab 上方) */}
<TradeDataPanel