import { useState } from 'react';
import { LoadingState, SegmentedControl } from '../components';
import { Link } from 'react-router-dom';
import { useGetHome } from '../generated/anthoLumeAPIV1';
import type { LeaderboardData, LeaderboardEntry, UserStreak } from '../generated/model';
import ReadingHistoryGraph from '../components/ReadingHistoryGraph';
import { formatNumber, formatDuration } from '../utils/formatters';
import { dataForStatus } from '../utils/apiResponses';
interface InfoCardProps {
title: string;
size: string | number;
link?: string;
}
function InfoCard({ title, size, link }: InfoCardProps) {
const content = (
);
if (link) {
return (
{content}
);
}
return {content}
;
}
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'}
{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;
}
type TimePeriod = 'all' | 'year' | 'month' | 'week';
function LeaderboardCard({ name, data }: LeaderboardCardProps) {
const [selectedPeriod, setSelectedPeriod] = useState('all');
const formatValue = (value: number): string => {
switch (name) {
case 'WPM':
return `${value.toFixed(2)} WPM`;
case 'Duration':
return formatDuration(value);
case 'Words':
return formatNumber(value);
default:
return value.toString();
}
};
const currentData = data[selectedPeriod];
return (
{name} Leaderboard
className="flex items-center gap-2 text-xs"
ariaLabel={`${name} leaderboard period`}
value={selectedPeriod}
onChange={setSelectedPeriod}
buttonClassName="cursor-pointer"
activeClassName="text-content"
inactiveClassName="text-content-subtle hover:text-content"
options={[
{ value: 'all', label: 'all' },
{ value: 'year', label: 'year' },
{ value: 'month', label: 'month' },
{ value: 'week', label: 'week' },
]}
/>
{currentData?.length === 0 ? (
N/A
) : (
{currentData[0]?.user_id || 'N/A'}
)}
{currentData?.slice(0, 3).map((item: LeaderboardEntry, index: number) => (
0 ? 'border-t border-border' : ''}`}
>
{formatValue(item.value)}
))}
);
}
export default function HomePage() {
const { data: homeData, isLoading: homeLoading } = useGetHome();
const homeResponse = dataForStatus(homeData, 200);
const dbInfo = homeResponse?.database_info;
const streaks = homeResponse?.streaks?.streaks;
const graphData = homeResponse?.graph_data?.graph_data;
const userStats = homeResponse?.user_statistics;
if (homeLoading) {
return ;
}
return (
{streaks?.map((streak: UserStreak) => (
))}
);
}