/** * StockQuoteCard - 股票行情卡片组件 * * 深空 FUI 设计风格(Glassmorphism + Ash Thorp + James Turrell) * - 半透明玻璃态卡片,漂浮在深空中 * - 光影深度,弥散背景光 * - 极致圆角,科幻数据终端感 * * 保留原有所有功能: * - 股票头部(名称、代码、行业、对比、关注、分享) * - 价格显示(当前价、涨跌幅) * - 次要行情(今开、昨收、最高、最低) * - 关键指标(PE、市值、股本、换手率、52周) * - 主力动态(净流入、机构持仓、买卖比) * - 公司信息(成立、注册资本、所在地、官网、简介) */ import React from 'react'; import { Box, Flex, HStack, VStack, Text, Badge, IconButton, Tooltip, Skeleton, Progress, Link, Icon, useDisclosure, } from '@chakra-ui/react'; import { Share2, Calendar, Coins, MapPin, Globe } from 'lucide-react'; import FavoriteButton from '@components/FavoriteButton'; import { StockCompareModal, CompareStockInput } from './components'; import { useStockQuoteData, useStockCompare } from './hooks'; import { DEEP_SPACE_THEME, glassCardStyle, decorativeElements } from './components/theme'; import { formatPrice, formatChangePercent, formatNetInflow } from './components/formatters'; import { formatRegisteredCapital, formatDate } from '../CompanyOverview/utils'; import type { StockQuoteCardProps } from './types'; const T = DEEP_SPACE_THEME; /** * 装饰性光效组件 */ const GlowDecorations: React.FC = () => ( <> {/* 顶部金色光条 */} {/* 左上角光晕 */} {/* 右下角光晕 */} {/* 背景网格 */} ); /** * 加载骨架屏 */ const LoadingSkeleton: React.FC = () => ( {/* 头部骨架 */} {/* 价格骨架 */} {/* 内容骨架 */} ); /** * 玻璃态内嵌区块 */ interface GlassSectionProps { title: string; children: React.ReactNode; flex?: number | string; } const GlassSection: React.FC = ({ title, children, flex = 1 }) => ( {/* 区块顶部光条 */} {title} {children} ); /** * 指标行组件 */ interface MetricRowProps { label: string; value: string | number; valueColor?: string; highlight?: boolean; } const MetricRow: React.FC = ({ label, value, valueColor = T.textWhite, highlight = false, }) => ( {label} {value} ); const StockQuoteCard: React.FC = ({ stockCode, isInWatchlist = false, isWatchlistLoading = false, onWatchlistToggle, }) => { const { quoteData, basicInfo, isLoading } = useStockQuoteData(stockCode); const { currentStockInfo, compareStockInfo, isCompareLoading, handleCompare: triggerCompare, clearCompare, } = useStockCompare(stockCode); const { isOpen: isCompareModalOpen, onOpen: openCompareModal, onClose: closeCompareModal } = useDisclosure(); const handleCompare = (compareCode: string) => { triggerCompare(compareCode); openCompareModal(); }; const handleCloseCompare = () => { closeCompareModal(); clearCompare(); }; // 加载中 if (isLoading || !quoteData) { return ; } // 涨跌判断 const isUp = quoteData.changePercent >= 0; const priceColor = isUp ? T.upColor : T.downColor; const priceGlow = isUp ? T.upGlow : T.downGlow; const priceBg = isUp ? T.upColorMuted : T.downColorMuted; const inflowColor = (quoteData.mainNetInflow || 0) >= 0 ? T.upColor : T.downColor; return ( <> {/* 内容区域(在装饰层之上)*/} {/* ========== 头部区域 ========== */} {/* 左侧:股票名称 + 代码 + 行业 */} {quoteData.name} ({quoteData.code}) {/* 行业标签 */} {(quoteData.industryL1 || quoteData.industry) && ( {quoteData.industryL1 && quoteData.industry ? `${quoteData.industryL1} · ${quoteData.industry}` : quoteData.industry || quoteData.industryL1} )} {/* 指数标签 */} {quoteData.indexTags && quoteData.indexTags.length > 0 && ( {quoteData.indexTags.join('、')} )} {/* 右侧:操作按钮 */} {})} colorScheme="gold" size="sm" /> } variant="ghost" color={T.textSecondary} size="sm" borderRadius={T.radiusSM} _hover={{ bg: T.borderGlass, color: T.textPrimary }} /> {quoteData.updateTime?.split(' ')[1] || '--:--'} {/* ========== 价格区域 ========== */} {formatPrice(quoteData.currentPrice)} {formatChangePercent(quoteData.changePercent)} {/* ========== 次要行情 ========== */} 今开: {formatPrice(quoteData.todayOpen)} 昨收: {formatPrice(quoteData.yesterdayClose)} 最高: {formatPrice(quoteData.todayHigh)} 最低: {formatPrice(quoteData.todayLow)} {/* ========== 数据区块(Bento Grid)========== */} {/* 关键指标 */} 5 ? T.orange : T.textWhite} /> {/* 主力动态 */} {/* 买卖比例条 */} div': { bg: T.upColor, boxShadow: T.upGlow, }, }} bg={T.downColor} borderRadius="full" h="8px" /> 买入 {quoteData.buyRatio}% 卖出 {quoteData.sellRatio}% {/* ========== 公司信息 ========== */} {basicInfo && ( <> {/* 分隔线 */} {/* 公司属性 */} 成立: {formatDate(basicInfo.establish_date)} 注册资本: {formatRegisteredCapital(basicInfo.reg_capital)} 所在地: {basicInfo.province} {basicInfo.city} {basicInfo.website ? ( 访问官网 ) : ( 暂无官网 )} {/* 公司简介 */} 公司简介: {basicInfo.company_intro || '暂无'} )} {/* 股票对比弹窗 */} ); }; export default StockQuoteCard;