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 (
);
}
return (
);
}
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;
}
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.value}
))}
);
}
function GraphVisualization({ data }: { data: GraphDataPoint[] }) {
if (!data || data.length === 0) {
return (
);
}
// 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) => (
))}
);
}
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 */}
{/* 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
))}
);
}