import { useState, useEffect } from 'react'; import { View, Text, ScrollView } from '@tarojs/components'; import Taro from '@tarojs/taro'; import * as pointsApi from '@/services/points'; import Loading from '@/components/Loading'; import EmptyState from '@/components/EmptyState'; import { useElderClass } from '../../hooks/useElderClass'; import './index.scss'; const STATUS_MAP: Record = { published: { label: '报名中', className: 'event-card__status--published' }, ongoing: { label: '进行中', className: 'event-card__status--ongoing' }, completed: { label: '已结束', className: 'event-card__status--completed' }, cancelled: { label: '已取消', className: 'event-card__status--cancelled' }, }; export default function EventsPage() { const modeClass = useElderClass(); const [events, setEvents] = useState([]); const [loading, setLoading] = useState(true); const [registering, setRegistering] = useState(null); useEffect(() => { loadEvents(); }, []); const loadEvents = async () => { setLoading(true); try { const res = await pointsApi.listOfflineEvents({ page: 1, page_size: 50, status: 'published' }); setEvents(res.data || []); } catch { Taro.showToast({ title: '加载失败', icon: 'none' }); } finally { setLoading(false); } }; const handleRegister = async (event: pointsApi.OfflineEvent) => { setRegistering(event.id); try { await pointsApi.registerEvent(event.id); Taro.showToast({ title: '报名成功', icon: 'success' }); loadEvents(); } catch (err: any) { const msg = err?.message || '报名失败'; Taro.showToast({ title: msg.substring(0, 20), icon: 'none' }); } finally { setRegistering(null); } }; const formatDate = (d: string) => { return new Date(d).toLocaleDateString('zh-CN', { year: 'numeric', month: 'long', day: 'numeric', }); }; if (loading) return ; return ( 线下活动 参加活动赢取积分 {events.length === 0 ? ( ) : ( {events.map((event) => { const st = STATUS_MAP[event.status] || { label: event.status, className: '' }; const isFull = event.max_participants != null && event.current_participants >= event.max_participants; const isRegistering = registering === event.id; return ( {st.label} +{event.points_reward} 积分 {event.title} {event.description && ( {event.description} )} {formatDate(event.event_date)} {event.location && ( {event.location} )} {event.current_participants}{event.max_participants ? `/${event.max_participants}` : ''} 人已报名 !isFull && !isRegistering && handleRegister(event)} > {isRegistering ? '报名中...' : isFull ? '已满' : '立即报名'} ); })} )} ); }