update pay promo
This commit is contained in:
@@ -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: 交易热度 */}
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user