feat: UI调整

This commit is contained in:
zdl
2025-12-10 10:09:24 +08:00
parent 9423094af2
commit 3382dd1036
9 changed files with 200 additions and 108 deletions

View File

@@ -16,8 +16,12 @@ import {
Badge,
Progress,
Skeleton,
IconButton,
Tooltip,
} from '@chakra-ui/react';
import { Share2 } from 'lucide-react';
import FavoriteButton from '@components/FavoriteButton';
import type { StockQuoteCardProps } from './types';
import { mockStockQuoteData } from './mockData';
@@ -50,7 +54,16 @@ const formatNetInflow = (value: number): string => {
const StockQuoteCard: React.FC<StockQuoteCardProps> = ({
data = mockStockQuoteData,
isLoading = false,
isInWatchlist = false,
isWatchlistLoading = false,
onWatchlistToggle,
onShare,
}) => {
// 处理分享点击
const handleShare = () => {
onShare?.();
};
// 黑金主题颜色配置
const cardBg = '#1A202C';
const borderColor = '#C9A961';
@@ -77,31 +90,47 @@ const StockQuoteCard: React.FC<StockQuoteCardProps> = ({
return (
<Card bg={cardBg} shadow="sm" borderWidth="1px" borderColor={borderColor}>
<CardBody>
{/* 顶部:股票名称 + 更新时间 */}
<Flex justify="space-between" align="center">
<HStack spacing={3}>
<Text fontSize="24px" fontWeight="bold" color={valueColor}>
{data.name}
{/* 顶部:股票名称 + 关注/分享按钮 + 更新时间 */}
<Flex justify="space-between" align="center" mb={4}>
{/* 左侧:名称(代码) | 指数标签 */}
<HStack spacing={2}>
<Text fontSize="22px" fontWeight="bold" color={valueColor}>
{data.name}{data.code}
</Text>
{data.indexTags.length > 0 && (
<>
<Text color={labelColor} fontSize="22px" fontWeight="light">|</Text>
<Text fontSize="16px" color={labelColor}>
{data.indexTags.join('、')}
</Text>
</>
)}
</HStack>
{/* 右侧:关注 + 分享 + 时间 */}
<HStack spacing={3}>
<FavoriteButton
isFavorite={isInWatchlist}
isLoading={isWatchlistLoading}
onClick={onWatchlistToggle || (() => {})}
colorScheme="gold"
size="sm"
/>
<Tooltip label="分享" placement="top">
<IconButton
aria-label="分享"
icon={<Share2 size={18} />}
variant="ghost"
color={labelColor}
size="sm"
onClick={handleShare}
_hover={{ bg: 'whiteAlpha.100' }}
/>
</Tooltip>
<Text fontSize="14px" color={labelColor}>
{data.updateTime.split(' ')[1]}
</Text>
<Text fontSize="24px" fontWeight="bold" color={labelColor}>
({data.code})
</Text>
{data.indexTags.map((tag) => (
<Badge
key={tag}
variant="outline"
borderColor={borderColor}
color={labelColor}
fontSize="14px"
px={2}
>
{tag}
</Badge>
))}
</HStack>
<Text fontSize="14px" color={labelColor}>
{data.updateTime}
</Text>
</Flex>
{/* 三栏布局 */}
@@ -124,19 +153,35 @@ const StockQuoteCard: React.FC<StockQuoteCardProps> = ({
{formatChangePercent(data.changePercent)}
</Badge>
</HStack>
<HStack spacing={6} fontSize="14px">
{/* 次要行情:今开 | 昨收 | 最高 | 最低 */}
<HStack spacing={4} fontSize="14px" flexWrap="wrap">
<Text color={labelColor}>
<Text as="span" color={valueColor} fontWeight="bold" fontSize="16px">
<Text as="span" color={valueColor} fontWeight="bold">
{formatPrice(data.todayOpen)}
</Text>
</Text>
<Text color={borderColor}>|</Text>
<Text color={labelColor}>
<Text as="span" color={valueColor} fontWeight="bold" fontSize="16px">
<Text as="span" color={valueColor} fontWeight="bold">
{formatPrice(data.yesterdayClose)}
</Text>
</Text>
<Text color={borderColor}>|</Text>
<Text color={labelColor}>
<Text as="span" color={upColor} fontWeight="bold">
{formatPrice(data.todayHigh)}
</Text>
</Text>
<Text color={borderColor}>|</Text>
<Text color={labelColor}>
<Text as="span" color={downColor} fontWeight="bold">
{formatPrice(data.todayLow)}
</Text>
</Text>
</HStack>
</Box>

View File

@@ -14,6 +14,8 @@ export const mockStockQuoteData: StockQuoteCardData = {
changePercent: 3.65,
todayOpen: 2156.0,
yesterdayClose: 2101.0,
todayHigh: 2185.0,
todayLow: 2150.0,
// 关键指标
pe: 38.62,
@@ -30,4 +32,7 @@ export const mockStockQuoteData: StockQuoteCardData = {
// 更新时间
updateTime: '2025-12-03 14:30:25',
// 自选状态
isFavorite: false,
};

View File

@@ -16,6 +16,8 @@ export interface StockQuoteCardData {
changePercent: number; // 涨跌幅(百分比,如 3.65 表示 +3.65%
todayOpen: number; // 今开
yesterdayClose: number; // 昨收
todayHigh: number; // 今日最高
todayLow: number; // 今日最低
// 关键指标
pe: number; // 市盈率
@@ -32,6 +34,9 @@ export interface StockQuoteCardData {
// 更新时间
updateTime: string; // 格式YYYY-MM-DD HH:mm:ss
// 自选状态
isFavorite?: boolean; // 是否已加入自选
}
/**
@@ -40,4 +45,10 @@ export interface StockQuoteCardData {
export interface StockQuoteCardProps {
data?: StockQuoteCardData;
isLoading?: boolean;
// 自选股相关(与 WatchlistButton 接口保持一致)
isInWatchlist?: boolean; // 是否在自选股中
isWatchlistLoading?: boolean; // 自选股操作加载中
onWatchlistToggle?: () => void; // 自选股切换回调
// 分享
onShare?: () => void; // 分享回调
}