'use client'; import { useEffect, useState } from 'react'; import api from '@/lib/api'; import { FlameIcon, StarIcon, ClockIcon, ActivityIcon, TargetIcon } from '@/components/ui/Icons'; interface RoutineStats { routine_id: string; routine_name: string; period_days: number; total_sessions: number; completed: number; aborted: number; completion_rate_percent: number; avg_duration_minutes: number; total_time_minutes: number; } interface Streak { routine_id: string; routine_name: string; current_streak: number; longest_streak: number; last_completed_date?: string; } interface WeeklySummary { total_completed: number; total_time_minutes: number; routines_started: number; routines: { routine_id: string; name: string; completed_this_week: number; }[]; } export default function StatsPage() { const [routines, setRoutines] = useState<{ id: string; name: string }[]>([]); const [selectedRoutine, setSelectedRoutine] = useState(''); const [routineStats, setRoutineStats] = useState(null); const [streaks, setStreaks] = useState([]); const [weeklySummary, setWeeklySummary] = useState(null); const [isLoading, setIsLoading] = useState(true); useEffect(() => { const fetchData = async () => { try { const [routinesData, streaksData, summaryData] = await Promise.all([ api.routines.list(), api.stats.getStreaks(), api.stats.getWeeklySummary(), ]); setRoutines(routinesData); setStreaks(streaksData); setWeeklySummary(summaryData); if (routinesData.length > 0) { setSelectedRoutine(routinesData[0].id); } } catch (err) { console.error('Failed to fetch stats:', err); } finally { setIsLoading(false); } }; fetchData(); }, []); useEffect(() => { const fetchRoutineStats = async () => { if (!selectedRoutine) return; try { const stats = await api.routines.getStats(selectedRoutine, 30); setRoutineStats(stats); } catch (err) { console.error('Failed to fetch routine stats:', err); } }; fetchRoutineStats(); }, [selectedRoutine]); const formatTime = (minutes: number) => { if (minutes < 60) return `${minutes}m`; const hours = Math.floor(minutes / 60); const mins = minutes % 60; return mins > 0 ? `${hours}h ${mins}m` : `${hours}h`; }; if (isLoading) { return (
); } return (

Stats

{/* Weekly Summary */} {weeklySummary && (

{weeklySummary.total_completed}

Completed

{formatTime(weeklySummary.total_time_minutes)}

Time

{weeklySummary.routines_started}

Started

)} {/* Streaks */} {streaks.length > 0 && (

Streaks

{streaks.map((streak) => (

{streak.routine_name}

Last: {streak.last_completed_date ? new Date(streak.last_completed_date).toLocaleDateString() : 'Never'}

{streak.current_streak}

day streak

))}
)} {/* Per-Routine Stats */} {routines.length > 0 && (

Routine Stats

{routineStats && (

{routineStats.completion_rate_percent}%

Completion Rate

{formatTime(routineStats.avg_duration_minutes)}

Avg Duration

{routineStats.completed}

Completed

{routineStats.total_sessions}

Total Sessions

)}
)}
); }