import React, { useState, useEffect } from 'react' import { View, Text, ScrollView, Image } from '@tarojs/components' import Taro from '@tarojs/taro' import { getShopEvent, getRegistrationStatus, getEventStatusLabel } from '@/api/shop/shopEvent' import type { ShopEvent, RegistrationStatus, EventFormField } from '@/api/shop/shopEvent' definePageConfig({ navigationBarTitleText: '赛事详情' }) const EventDetailPage: React.FC = () => { const { id } = Taro.getCurrentInstance().router?.params || {} const [event, setEvent] = useState(null) const [regStatus, setRegStatus] = useState(null) const [loading, setLoading] = useState(true) useEffect(() => { if (id) { fetchDetail(Number(id)) fetchRegStatus(Number(id)) } }, [id]) const fetchDetail = async (eventId: number) => { try { const data = await getShopEvent(eventId) setEvent(data) } catch (err: any) { Taro.showToast({ title: err.message || '加载失败', icon: 'none' }) } finally { setLoading(false) } } const fetchRegStatus = async (eventId: number) => { try { const data = await getRegistrationStatus(eventId) setRegStatus(data) } catch { // 未登录时忽略 } } const formatDate = (dateStr: string) => { const d = new Date(dateStr) return `${d.getFullYear()}年${d.getMonth()+1}月${d.getDate()}日 ${String(d.getHours()).padStart(2,'0')}:${String(d.getMinutes()).padStart(2,'0')}` } const handleRegister = () => { if (!event) return Taro.navigateTo({ url: `/pages/event/register/index?id=${event.id}` }) } if (loading) { return ( 加载中... ) } if (!event) { return ( 赛事不存在 ) } const statusInfo = getEventStatusLabel(event.status as number) const isFull = event.maxParticipants > 0 && event.paidCount >= event.maxParticipants const alreadyPaid = regStatus?.registered && regStatus.payStatus === 1 const pendingPay = regStatus?.registered && regStatus.payStatus === 0 // 解析动态表单字段 let formFields: EventFormField[] = [] if (event.formFields) { if (Array.isArray(event.formFields)) { formFields = event.formFields } else { try { formFields = JSON.parse(event.formFields) } catch { formFields = [] } } } return ( {/* 封面 */} {event.image ? ( ) : ( 🏆 )} {/* 基本信息 */} {event.name} {statusInfo.label} 赛事时间 {formatDate(event.eventDate)} {event.location && ( 赛事地点 {event.location} )} 报名名额 {event.paidCount} / {event.maxParticipants > 0 ? event.maxParticipants : '不限'} {isFull && (已满)} 报名费用 0 ? 'text-orange-500 font-bold text-base' : 'text-green-500 font-bold'}> {event.entryFee > 0 ? `¥${event.entryFee}` : '免费'} {/* 报名须知 */} 报名须知 {formFields.length > 0 ? ( formFields.map(field => ( • 需{field.required === 1 ? '填写' : '选填'}{field.label} {field.type === 'select' || field.type === 'radio' ? `(${(field.options || []).join('/')})` : ''} )) ) : ( • 该赛事无需填写额外信息 )} {event.entryFee > 0 && • 缴费成功后报名生效,缴费失败不占名额} {/* 赛事描述 */} {event.description && ( 赛事详情 {event.description} )} {/* 底部操作栏 */} {alreadyPaid && ( ✓ 已报名 )} {pendingPay && ( Taro.navigateTo({ url: '/pages/event/my/index' })} > 待缴费 — 前往我的报名 )} {!regStatus?.registered && event.status === 1 && !isFull && ( {event.entryFee > 0 ? `立即报名 ¥${event.entryFee}` : '立即报名(免费)'} )} {!regStatus?.registered && event.status === 1 && isFull && ( 名额已满 )} {event.status !== 1 && !alreadyPaid && !pendingPay && ( {statusInfo.label} )} ) } export default EventDetailPage