Files
vf_react/src/components/SubscriptionUpgradeModal.js
2025-10-11 12:02:01 +08:00

176 lines
5.4 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import React from 'react';
import {
Modal,
ModalOverlay,
ModalContent,
ModalHeader,
ModalFooter,
ModalBody,
ModalCloseButton,
Button,
VStack,
HStack,
Text,
Badge,
Box,
useColorModeValue,
Icon,
Divider
} from '@chakra-ui/react';
import { FaCrown, FaLock, FaStar, FaRocket } from 'react-icons/fa';
const SubscriptionUpgradeModal = ({
isOpen,
onClose,
requiredLevel = 'pro',
featureName = '功能',
currentLevel = 'free'
}) => {
const bgColor = useColorModeValue('white', 'gray.800');
const borderColor = useColorModeValue('gray.200', 'gray.600');
const textColor = useColorModeValue('gray.600', 'gray.300');
// 订阅级别信息
const subscriptionLevels = {
free: {
name: '免费版',
icon: FaLock,
color: 'gray',
features: ['基础事件浏览', '有限历史事件查看']
},
pro: {
name: 'Pro版',
icon: FaStar,
color: 'blue',
features: ['相关标的分析', '相关概念分析', '完整历史事件']
},
max: {
name: 'Max版',
icon: FaCrown,
color: 'purple',
features: ['传导链分析', '高级分析工具', '实时数据推送', '所有Pro版功能']
}
};
const currentLevelInfo = subscriptionLevels[currentLevel] || subscriptionLevels.free;
const requiredLevelInfo = subscriptionLevels[requiredLevel] || subscriptionLevels.pro;
const handleUpgrade = () => {
// 跳转到订阅页面
window.location.href = 'https://valuefrontier.cn/home/pages/account/subscription';
};
return (
<Modal isOpen={isOpen} onClose={onClose} size="lg" isCentered>
<ModalOverlay />
<ModalContent bg={bgColor}>
<ModalHeader borderBottomWidth="1px" borderColor={borderColor}>
<HStack spacing={3}>
<Icon as={FaLock} color="red.500" boxSize={6} />
<VStack align="start" spacing={0}>
<Text fontSize="lg" fontWeight="bold">
需要{requiredLevelInfo.name}订阅
</Text>
<Text fontSize="sm" color={textColor}>
当前功能需要更高权限
</Text>
</VStack>
</HStack>
</ModalHeader>
<ModalCloseButton />
<ModalBody py={6}>
<VStack spacing={6} align="stretch">
{/* 功能说明 */}
<Box>
<Text fontWeight="semibold" mb={2}>
您正在尝试访问
</Text>
<Box
p={3}
bg={useColorModeValue('blue.50', 'blue.900')}
borderRadius="md"
borderLeft="4px solid"
borderColor="blue.500"
>
<Text fontSize="md" fontWeight="medium">
{featureName}
</Text>
</Box>
</Box>
<Divider />
{/* 当前订阅状态 */}
<Box>
<HStack justify="space-between" mb={3}>
<Text fontWeight="semibold">当前订阅</Text>
<Badge colorScheme={currentLevelInfo.color}>
{currentLevelInfo.name}
</Badge>
</HStack>
<VStack align="start" spacing={1}>
{currentLevelInfo.features.map((feature, index) => (
<HStack key={index} spacing={2}>
<Icon as={currentLevelInfo.icon} color={`${currentLevelInfo.color}.500`} boxSize={3} />
<Text fontSize="sm" color={textColor}>{feature}</Text>
</HStack>
))}
</VStack>
</Box>
{/* 所需订阅状态 */}
<Box>
<HStack justify="space-between" mb={3}>
<Text fontWeight="semibold">所需订阅</Text>
<Badge colorScheme={requiredLevelInfo.color} variant="solid">
{requiredLevelInfo.name}
</Badge>
</HStack>
<VStack align="start" spacing={1}>
{requiredLevelInfo.features.map((feature, index) => (
<HStack key={index} spacing={2}>
<Icon as={requiredLevelInfo.icon} color={`${requiredLevelInfo.color}.500`} boxSize={3} />
<Text fontSize="sm" color={textColor}>{feature}</Text>
</HStack>
))}
</VStack>
</Box>
{/* 升级提示 */}
<Box
p={3}
bg={useColorModeValue('yellow.50', 'yellow.900')}
borderRadius="md"
>
<HStack spacing={2}>
<Icon as={FaRocket} color="yellow.600" />
<Text fontSize="sm" color={useColorModeValue('yellow.800', 'yellow.200')}>
升级到{requiredLevelInfo.name}即可解锁此功能
</Text>
</HStack>
</Box>
</VStack>
</ModalBody>
<ModalFooter borderTopWidth="1px" borderColor={borderColor}>
<HStack spacing={3}>
<Button variant="outline" onClick={onClose}>
稍后再说
</Button>
<Button
colorScheme={requiredLevelInfo.color}
leftIcon={<Icon as={FaCrown} />}
onClick={handleUpgrade}
>
立即升级
</Button>
</HStack>
</ModalFooter>
</ModalContent>
</Modal>
);
};
export default SubscriptionUpgradeModal;