import { Link } from 'react-router-dom'; import { useGetHome, useGetDocuments } from '../generated/anthoLumeAPIV1'; import type { GraphDataPoint, LeaderboardData } from '../generated/model'; interface InfoCardProps { title: string; size: string | number; link?: string; } function InfoCard({ title, size, link }: InfoCardProps) { if (link) { return (

{size}

{title}

); } return (

{size}

{title}

); } interface StreakCardProps { window: 'DAY' | 'WEEK'; currentStreak: number; currentStreakStartDate: string; currentStreakEndDate: string; maxStreak: number; maxStreakStartDate: string; maxStreakEndDate: string; } function StreakCard({ window, currentStreak, currentStreakStartDate, currentStreakEndDate, maxStreak, maxStreakStartDate, maxStreakEndDate, }: StreakCardProps) { return (

{window === 'WEEK' ? 'Weekly Read Streak' : 'Daily Read Streak'}

{currentStreak}

{window === 'WEEK' ? 'Current Weekly Streak' : 'Current Daily Streak'}

{currentStreakStartDate} ➞ {currentStreakEndDate}
{currentStreak}

{window === 'WEEK' ? 'Best Weekly Streak' : 'Best Daily Streak'}

{maxStreakStartDate} ➞ {maxStreakEndDate}
{maxStreak}
); } interface LeaderboardCardProps { name: string; data: LeaderboardData; } function LeaderboardCard({ name, data }: LeaderboardCardProps) { return (

{name} Leaderboard

all year month week
{/* All time data */}
{data.all.length === 0 ? (

N/A

) : (

{data.all[0]?.user_id || 'N/A'}

)}
{data.all.slice(0, 3).map((item: any, index: number) => (
0 ? 'border-t border-gray-200' : ''}`} >

{item.user_id}

{item.value}
))}
); } function GraphVisualization({ data }: { data: GraphDataPoint[] }) { if (!data || data.length === 0) { return (

No data available

); } // Simple bar visualization (could be enhanced with SVG bezier curve like SSR) const maxMinutes = Math.max(...data.map(d => d.minutes_read), 1); return (
{data.map((point, i) => (
{point.minutes_read} min
))}
); } export default function HomePage() { const { data: homeData, isLoading: homeLoading } = useGetHome(); const { data: docsData, isLoading: docsLoading } = useGetDocuments({ page: 1, limit: 9 }); const docs = docsData?.data?.documents; const dbInfo = homeData?.data?.database_info; const streaks = homeData?.data?.streaks?.streaks; const graphData = homeData?.data?.graph_data?.graph_data; const userStats = homeData?.data?.user_statistics; if (homeLoading || docsLoading) { return
Loading...
; } return (
{/* Daily Read Totals Graph */}

Daily Read Totals

{/* Info Cards */}
{/* Streak Cards */}
{streaks?.map((streak: any, index) => ( ))}
{/* Leaderboard Cards */}
{/* Recent Documents */}
{docs?.slice(0, 6).map((doc: any) => (

{doc.title}

{doc.author}

View Document
))}
); }