/** * StockQuoteCard - 股票行情卡片组件 * * 展示股票的实时行情、关键指标和主力动态 */ import React from 'react'; import { Box, Card, CardBody, Flex, HStack, VStack, Text, Badge, Progress, Skeleton, IconButton, Tooltip, Divider, Link, Icon, } from '@chakra-ui/react'; import { Share2, Calendar, Coins, MapPin, Globe } from 'lucide-react'; import { formatRegisteredCapital, formatDate } from '../CompanyOverview/utils'; import FavoriteButton from '@components/FavoriteButton'; import type { StockQuoteCardProps } from './types'; /** * 格式化价格显示 */ const formatPrice = (price: number): string => { return price.toLocaleString('zh-CN', { minimumFractionDigits: 2, maximumFractionDigits: 2, }); }; /** * 格式化涨跌幅显示 */ const formatChangePercent = (percent: number): string => { const sign = percent >= 0 ? '+' : ''; return `${sign}${percent.toFixed(2)}%`; }; /** * 格式化主力净流入显示 */ const formatNetInflow = (value: number): string => { const sign = value >= 0 ? '+' : ''; return `${sign}${value.toFixed(2)}亿`; }; const StockQuoteCard: React.FC = ({ data, isLoading = false, isInWatchlist = false, isWatchlistLoading = false, onWatchlistToggle, onShare, basicInfo, }) => { // 处理分享点击 const handleShare = () => { onShare?.(); }; // 黑金主题颜色配置 const cardBg = '#1A202C'; const borderColor = '#C9A961'; const labelColor = '#C9A961'; const valueColor = '#F4D03F'; const sectionTitleColor = '#F4D03F'; // 涨跌颜色(红涨绿跌) const upColor = '#F44336'; // 涨 - 红色 const downColor = '#4CAF50'; // 跌 - 绿色 // 加载中或无数据时显示骨架屏 if (isLoading || !data) { return ( ); } const priceColor = data.changePercent >= 0 ? upColor : downColor; const inflowColor = data.mainNetInflow >= 0 ? upColor : downColor; return ( {/* 顶部:股票名称 + 关注/分享按钮 + 更新时间 */} {/* 左侧:股票名称 + 行业标签 + 指数标签 */} {/* 股票名称 - 突出显示 */} {data.name} ({data.code}) {/* 行业标签 */} {(data.industryL1 || data.industry) && ( {data.industryL1 && data.industry ? `${data.industryL1} · ${data.industry}` : data.industry || data.industryL1} )} {/* 指数标签 */} {data.indexTags?.length > 0 && ( {data.indexTags.join('、')} )} {/* 右侧:关注 + 分享 + 时间 */} {})} colorScheme="gold" size="sm" /> } variant="ghost" color={labelColor} size="sm" onClick={handleShare} _hover={{ bg: 'whiteAlpha.100' }} /> {data.updateTime?.split(' ')[1] || '--:--'} {/* 1:2 布局 */} {/* 左栏:价格信息 (flex=1) */} {formatPrice(data.currentPrice)} = 0 ? upColor : downColor} color="#FFFFFF" fontSize="20px" fontWeight="bold" px={3} py={1} borderRadius="md" > {formatChangePercent(data.changePercent)} {/* 次要行情:今开 | 昨收 | 最高 | 最低 */} 今开: {formatPrice(data.todayOpen)} | 昨收: {formatPrice(data.yesterdayClose)} | 最高: {formatPrice(data.todayHigh)} | 最低: {formatPrice(data.todayLow)} {/* 右栏:关键指标 + 主力动态 (flex=2) */} {/* 关键指标 */} 关键指标 市盈率(PE): {data.pe.toFixed(2)} 市净率(PB): {data.pb.toFixed(2)} 流通市值: {data.marketCap} 52周波动: {formatPrice(data.week52Low)}-{formatPrice(data.week52High)} {/* 主力动态 */} 主力动态 主力净流入: {formatNetInflow(data.mainNetInflow)} 机构持仓: {data.institutionHolding.toFixed(2)}% {/* 买卖比例条 */} div': { bg: upColor }, }} bg={downColor} borderRadius="full" /> 买入{data.buyRatio}% 卖出{data.sellRatio}% {/* 公司信息区块 - 1:2 布局 */} {basicInfo && ( <> {/* 左侧:公司关键属性 (flex=1) */} 成立: {formatDate(basicInfo.establish_date)} 注册资本: {formatRegisteredCapital(basicInfo.reg_capital)} 所在地: {basicInfo.province} {basicInfo.city} {basicInfo.website ? ( 访问官网 ) : ( 暂无官网 )} {/* 右侧:公司简介 (flex=2) */} 公司简介: {basicInfo.company_intro || '暂无'} )} ); }; export default StockQuoteCard;