Spaces:
Running
Running
| 'use client'; | |
| import { useGameStore } from '@/store/gameStore'; | |
| interface StockHeaderProps { | |
| cursorData?: any; | |
| } | |
| export default function StockHeader({ cursorData }: StockHeaderProps) { | |
| const { isRevealed, realCode, realName, allKlines, currentIndex } = useGameStore(); | |
| const currentKLine = allKlines[currentIndex]; | |
| if (!currentKLine) return <div className="h-20 bg-[#191B28] border-b border-[#2A2D3C]"></div>; | |
| // 优先使用光标数据,否则使用当前进度数据 | |
| const data = cursorData || currentKLine; | |
| const { open, high, low, close, volume, pct_chg, date, volume_ratio, turnover_rate } = data; | |
| // 如果是光标数据,可能没有 pct_chg,需要计算(相对于前一根K线,或者简化处理) | |
| // 这里简化处理:如果是光标数据,pct_chg 可能不准确,除非我们传入了完整对象 | |
| // 为了展示一致性,我们假设 data 包含了必要字段 | |
| // 注意:Chart 传回来的 cursorData 可能只包含 OHLCV,没有 pct_chg | |
| // 如果没有 pct_chg,我们可以根据 open/close 计算一个近似值,或者不显示涨跌幅 | |
| const isUp = close >= open; // 简化判断:阳线为红,阴线为绿 | |
| const colorClass = isUp ? 'text-[#FD1050]' : 'text-[#00F0F0]'; | |
| const change = close - open; // 这是一个近似值,实际上应该是 close - prevClose | |
| const changePercent = (change / open) * 100; // 近似涨跌幅 | |
| // 如果是真实数据(非光标),使用精确值 | |
| const displayChange = cursorData ? change : (close - (close / (1 + (pct_chg || 0) / 100))); | |
| const displayPercent = cursorData ? changePercent : pct_chg; | |
| // 日期显示 | |
| const displayDate = date || (cursorData?.time ? cursorData.time.toString() : '--'); | |
| // 日期显示格式化: 2026-02-23 -> 2026/02/23 | |
| const formattedDate = (displayDate && displayDate !== '--') ? displayDate.replace(/-/g, '/') : '--'; | |
| return ( | |
| <div className="bg-[#191B28] px-2 lg:px-6 py-1.5 lg:py-3 border-b border-[#2A2D3C] flex flex-col shadow-md z-10 gap-1 lg:gap-2"> | |
| {/* 第一行:股票名称、价格、日期、日K */} | |
| <div className="flex items-center justify-between w-full"> | |
| <div className="flex items-center gap-3 lg:gap-8"> | |
| {/* 股票名称代码 */} | |
| <div className="flex items-baseline gap-1.5"> | |
| <span className="text-base lg:text-2xl font-bold text-white tracking-tight"> | |
| {isRevealed ? realName : '盲盒股票'} | |
| </span> | |
| <span className="text-[10px] lg:text-sm text-gray-500 font-mono"> | |
| {isRevealed ? realCode : '******'} | |
| </span> | |
| </div> | |
| {/* 当前价格 & 涨跌幅 */} | |
| <div className="flex items-baseline gap-2"> | |
| <span className={`text-xl lg:text-4xl font-bold font-mono ${colorClass}`}> | |
| {close?.toFixed(2)} | |
| </span> | |
| <span className={`text-[10px] lg:text-lg font-mono ${colorClass}`}> | |
| {displayPercent ? (displayPercent > 0 ? '+' : '') + displayPercent.toFixed(2) + '%' : '--'} | |
| </span> | |
| </div> | |
| </div> | |
| {/* 日期 & 日K */} | |
| <div className="text-right flex items-center gap-3"> | |
| <span className="text-gray-300 font-mono text-xs lg:text-lg hidden xs:inline">{formattedDate}</span> | |
| <div className="flex items-center"> | |
| <span className="text-gray-500 text-[10px] lg:text-xs mr-1">日K:</span> | |
| <span className="text-white font-mono text-xs lg:text-lg"> | |
| {currentIndex + 1}<span className="text-gray-600 mx-0.5">/</span>{allKlines.length} | |
| </span> | |
| </div> | |
| </div> | |
| </div> | |
| {/* 第二行:今开、成交量、量比、换手率 */} | |
| <div className="flex flex-wrap items-center gap-x-3 lg:gap-x-6 text-[10px] lg:text-sm text-gray-400"> | |
| <span className="font-mono text-gray-300 mr-1 xs:hidden">{formattedDate}</span> | |
| <div className="flex items-center gap-1"> | |
| <span>今开</span> | |
| <span className={`font-mono ${open >= close ? 'text-[#00F0F0]' : 'text-[#FD1050]'}`}>{open?.toFixed(2)}</span> | |
| </div> | |
| <div className="flex items-center gap-1"> | |
| <span>成交量</span> | |
| <span className="text-yellow-400 font-mono"> | |
| {volume ? (volume >= 100000000 ? (volume / 100000000).toFixed(1) + '亿' : (volume / 10000).toFixed(1) + '万') : '--'} | |
| </span> | |
| </div> | |
| <div className="flex items-center gap-1"> | |
| <span>量比</span> | |
| <span className="text-purple-400 font-mono">{volume_ratio?.toFixed(2) || '--'}</span> | |
| </div> | |
| <div className="flex items-center gap-1"> | |
| <span>换手率</span> | |
| <span className="text-cyan-400 font-mono">{turnover_rate?.toFixed(2) || '--'}%</span> | |
| </div> | |
| </div> | |
| </div> | |
| ); | |
| } | |