mirror of
https://github.com/ksyasuda/SubMiner.git
synced 2026-03-20 12:11:28 -07:00
- Add note ID resolution through merge redirects in stats API - Build Anki note previews using configured field names - Add session event helpers for merged note dedup and stable request keys - Refactor SessionDetail to prevent redundant note info requests - Add session event popover and API client tests
47 lines
1.7 KiB
TypeScript
47 lines
1.7 KiB
TypeScript
import { todayLocalDay } from '../../lib/formatters';
|
|
import type { DailyRollup } from '../../types/stats';
|
|
|
|
interface QuickStatsProps {
|
|
rollups: DailyRollup[];
|
|
}
|
|
|
|
export function QuickStats({ rollups }: QuickStatsProps) {
|
|
const daysWithActivity = new Set(
|
|
rollups.filter((r) => r.totalActiveMin > 0).map((r) => r.rollupDayOrMonth),
|
|
);
|
|
const today = todayLocalDay();
|
|
const streakStart = daysWithActivity.has(today) ? today : today - 1;
|
|
let streak = 0;
|
|
for (let d = streakStart; daysWithActivity.has(d); d--) {
|
|
streak++;
|
|
}
|
|
|
|
const weekStart = today - 6;
|
|
const weekRollups = rollups.filter((r) => r.rollupDayOrMonth >= weekStart);
|
|
const weekMinutes = weekRollups.reduce((sum, r) => sum + r.totalActiveMin, 0);
|
|
const weekCards = weekRollups.reduce((sum, r) => sum + r.totalCards, 0);
|
|
const avgMinPerDay = Math.round(weekMinutes / 7);
|
|
|
|
return (
|
|
<div className="bg-ctp-surface0 border border-ctp-surface1 rounded-lg p-4">
|
|
<h3 className="text-sm font-semibold text-ctp-text mb-3">Quick Stats</h3>
|
|
<div className="space-y-2 text-sm">
|
|
<div className="flex justify-between">
|
|
<span className="text-ctp-subtext0">Streak</span>
|
|
<span className="text-ctp-peach font-medium">
|
|
{streak} day{streak !== 1 ? 's' : ''}
|
|
</span>
|
|
</div>
|
|
<div className="flex justify-between">
|
|
<span className="text-ctp-subtext0">Avg/day this week</span>
|
|
<span className="text-ctp-text">{avgMinPerDay}m</span>
|
|
</div>
|
|
<div className="flex justify-between">
|
|
<span className="text-ctp-subtext0">Cards this week</span>
|
|
<span className="text-ctp-cards-mined font-medium">{weekCards}</span>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
);
|
|
}
|