import { useState, useEffect } from 'react' import { api } from '../api' export default function WeekView() { const [week, setWeek] = useState(null) const [loading, setLoading] = useState(true) useEffect(() => { load() }, []) async function load() { try { setWeek(await api.week()) } catch (err) { console.error(err) } finally { setLoading(false) } } if (loading) return
Loading...
if (!week) return
Failed to load
const days = ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun'] const pct = week.weekly_target > 0 ? Math.min(100, Math.round((week.total_points_earned / week.weekly_target) * 100)) : 0 const today = new Date().toISOString().split('T')[0] return (

This Week

{/* Summary hero */}
Weekly Total
{week.total_points_earned}
/ {week.weekly_target} pts
{week.hit_weekly_target && (
🏆 Target hit! +{week.weekly_bonus_earned} bonus
)}
{week.active_days}
active days
{week.gate_passed_days}
rewards earned
{/* Daily breakdown */}
Daily Breakdown
{week.daily_breakdown.map((day, i) => { const dayPct = day.daily_minimum > 0 ? Math.min(100, Math.round((day.points_earned / day.daily_minimum) * 100)) : 0 const isToday = day.date === today return (
{days[i]}
0 ? 'var(--amber)' : 'transparent', }} />
{day.points_earned}
{day.gate_passed ? '✅' : day.points_earned > 0 ? '🟡' : '⬜'}
) })}
) }