/** * 创建预测话题模态框 * 用户可以发起新的预测市场话题 */ import React, { useState } from 'react'; import { Modal, ModalOverlay, ModalContent, ModalHeader, ModalBody, ModalFooter, ModalCloseButton, Button, VStack, FormControl, FormLabel, Input, Textarea, Select, HStack, Text, Box, Icon, Alert, AlertIcon, useToast, } from '@chakra-ui/react'; import { Zap, Calendar, DollarSign } from 'lucide-react'; import { forumColors } from '@theme/forumTheme'; import { createTopic } from '@services/predictionMarketService'; import { getUserAccount, CREDIT_CONFIG } from '@services/creditSystemService'; import { useAuth } from '@contexts/AuthContext'; const CreatePredictionModal = ({ isOpen, onClose, onTopicCreated }) => { const toast = useToast(); const { user } = useAuth(); // 表单状态 const [formData, setFormData] = useState({ title: '', description: '', category: 'stock', deadline_days: 7, }); const [isSubmitting, setIsSubmitting] = useState(false); // 获取用户余额 const userAccount = user ? getUserAccount(user.id) : null; // 处理表单变化 const handleChange = (field, value) => { setFormData((prev) => ({ ...prev, [field]: value })); }; // 提交表单 const handleSubmit = async () => { try { setIsSubmitting(true); // 验证 if (!formData.title.trim()) { toast({ title: '请填写话题标题', status: 'warning', duration: 3000, }); return; } if (!formData.description.trim()) { toast({ title: '请填写话题描述', status: 'warning', duration: 3000, }); return; } // 检查余额 if (userAccount.balance < CREDIT_CONFIG.CREATE_TOPIC_COST) { toast({ title: '积分不足', description: `创建话题需要${CREDIT_CONFIG.CREATE_TOPIC_COST}积分`, status: 'error', duration: 3000, }); return; } // 计算截止时间 const deadline = new Date(); deadline.setDate(deadline.getDate() + parseInt(formData.deadline_days)); const settlement_date = new Date(deadline); settlement_date.setDate(settlement_date.getDate() + 1); // 创建话题 const newTopic = createTopic({ author_id: user.id, author_name: user.name || user.username, author_avatar: user.avatar, title: formData.title, description: formData.description, category: formData.category, deadline: deadline.toISOString(), settlement_date: settlement_date.toISOString(), }); toast({ title: '创建成功!', description: `话题已发布,扣除${CREDIT_CONFIG.CREATE_TOPIC_COST}积分`, status: 'success', duration: 3000, }); // 重置表单 setFormData({ title: '', description: '', category: 'stock', deadline_days: 7, }); // 通知父组件 if (onTopicCreated) { onTopicCreated(newTopic); } onClose(); } catch (error) { console.error('创建话题失败:', error); toast({ title: '创建失败', description: error.message, status: 'error', duration: 3000, }); } finally { setIsSubmitting(false); } }; return ( 发起预测话题 {/* 提示信息 */} 创建预测话题 • 创建费用:{CREDIT_CONFIG.CREATE_TOPIC_COST}积分(进入奖池) • 作者不能参与自己发起的话题 • 截止后由作者提交结果进行结算 {/* 话题标题 */} 话题标题 handleChange('title', e.target.value)} bg={forumColors.background.main} border="1px solid" borderColor={forumColors.border.default} color={forumColors.text.primary} _placeholder={{ color: forumColors.text.tertiary }} _hover={{ borderColor: forumColors.border.light }} _focus={{ borderColor: forumColors.border.gold, boxShadow: `0 0 0 1px ${forumColors.border.goldGlow}`, }} /> {/* 话题描述 */} 话题描述