import React, { useState, useEffect } from 'react' import { View, Text } from '@tarojs/components' import Taro from '@tarojs/taro' import { useUser } from '@/hooks/useUser' import { listShopSigninRecord, addShopSigninRecord } from '@/api/shop/shopSigninRecord' definePageConfig({ navigationBarTitleText: '每日签到', }) const SigninPage: React.FC = () => { const { user, isLoggedIn } = useUser() const [signedDates, setSignedDates] = useState([]) const [todaySigned, setTodaySigned] = useState(false) const [loading, setLoading] = useState(false) const today = new Date() const todayStr = today.toISOString().split('T')[0] // YYYY-MM-DD // 获取当月已签到日期 useEffect(() => { if (!isLoggedIn) { Taro.navigateTo({ url: '/passport/login' }) return } loadSignedRecords() }, [isLoggedIn]) const loadSignedRecords = async () => { try { const year = today.getFullYear() const month = today.getMonth() + 1 const data = await listShopSigninRecord({ userId: (user as any)?.userId, year, month, }) if (data && Array.isArray(data)) { const dates = data.map((record: any) => record.signinDate) setSignedDates(dates) setTodaySigned(dates.includes(todayStr)) } } catch (err) { console.error('加载签到记录失败', err) } } const handleSignin = async () => { if (todaySigned) { Taro.showToast({ title: '今日已签到', icon: 'none' }) return } if (loading) return setLoading(true) try { await addShopSigninRecord({ userId: (user as any)?.userId, signinDate: todayStr, }) Taro.showToast({ title: '签到成功 +5积分', icon: 'success' }) setTodaySigned(true) setSignedDates(prev => [...prev, todayStr]) } catch (err: any) { console.error('签到失败', err) Taro.showToast({ title: err.message || '签到失败', icon: 'none' }) } finally { setLoading(false) } } // 生成本周日期列表(用于UI显示) const getWeekDates = () => { const dates = [] for (let i = 6; i >= 0; i--) { const d = new Date(today) d.setDate(d.getDate() - i) dates.push(d) } return dates } const weekDates = getWeekDates() const getDayOfWeek = (date: Date) => { const days = ['日', '一', '二', '三', '四', '五', '六'] return days[date.getDay()] } return ( {/* 签到卡片 */} 每日签到 连续签到获得更多积分 {/* 本周签到 */} {weekDates.map((date, idx) => { const dateStr = date.toISOString().split('T')[0] const dayOfWeek = getDayOfWeek(date) const isSigned = signedDates.includes(dateStr) const isToday = dateStr === todayStr return ( 周{dayOfWeek} {date.getDate()} ) })} {loading ? '签到中...' : todaySigned ? '已签到' : '立即签到'} {/* 签到规则 */} 签到规则 1. 每日签到可获得 5 积分 2. 连续签到 7 天额外奖励 20 积分 3. 连续签到 30 天额外奖励 100 积分 4. 中断签到后连续天数重新计算 ) } export default SigninPage