feat(stats): replace per-day trends section with library summary

This commit is contained in:
2026-04-09 22:23:58 -07:00
parent 8d45102848
commit 0294671de1

View File

@@ -8,6 +8,7 @@ import {
filterHiddenAnimeData, filterHiddenAnimeData,
pruneHiddenAnime, pruneHiddenAnime,
} from './anime-visibility'; } from './anime-visibility';
import { LibrarySummarySection } from './LibrarySummarySection';
function SectionHeader({ children }: { children: React.ReactNode }) { function SectionHeader({ children }: { children: React.ReactNode }) {
return ( return (
@@ -113,12 +114,14 @@ export function TrendsTab() {
if (error) return <div className="text-ctp-red p-4">Error: {error}</div>; if (error) return <div className="text-ctp-red p-4">Error: {error}</div>;
if (!data) return null; if (!data) return null;
const librarySummaryAsPoints = data.librarySummary.map((row) => ({
epochDay: 0,
animeTitle: row.title,
value: row.watchTimeMin,
}));
const animeTitles = buildAnimeVisibilityOptions([ const animeTitles = buildAnimeVisibilityOptions([
data.animePerDay.episodes, librarySummaryAsPoints,
data.animePerDay.watchTime,
data.animePerDay.cards,
data.animePerDay.words,
data.animePerDay.lookups,
data.animeCumulative.episodes, data.animeCumulative.episodes,
data.animeCumulative.cards, data.animeCumulative.cards,
data.animeCumulative.words, data.animeCumulative.words,
@@ -126,24 +129,6 @@ export function TrendsTab() {
]); ]);
const activeHiddenAnime = pruneHiddenAnime(hiddenAnime, animeTitles); const activeHiddenAnime = pruneHiddenAnime(hiddenAnime, animeTitles);
const filteredEpisodesPerAnime = filterHiddenAnimeData(
data.animePerDay.episodes,
activeHiddenAnime,
);
const filteredWatchTimePerAnime = filterHiddenAnimeData(
data.animePerDay.watchTime,
activeHiddenAnime,
);
const filteredCardsPerAnime = filterHiddenAnimeData(data.animePerDay.cards, activeHiddenAnime);
const filteredWordsPerAnime = filterHiddenAnimeData(data.animePerDay.words, activeHiddenAnime);
const filteredLookupsPerAnime = filterHiddenAnimeData(
data.animePerDay.lookups,
activeHiddenAnime,
);
const filteredLookupsPerHundredPerAnime = filterHiddenAnimeData(
data.animePerDay.lookupsPerHundred,
activeHiddenAnime,
);
const filteredAnimeProgress = filterHiddenAnimeData( const filteredAnimeProgress = filterHiddenAnimeData(
data.animeCumulative.episodes, data.animeCumulative.episodes,
activeHiddenAnime, activeHiddenAnime,
@@ -221,7 +206,7 @@ export function TrendsTab() {
type="line" type="line"
/> />
<SectionHeader>Library Per Day</SectionHeader> <SectionHeader>Library Summary</SectionHeader>
<AnimeVisibilityFilter <AnimeVisibilityFilter
animeTitles={animeTitles} animeTitles={animeTitles}
hiddenAnime={activeHiddenAnime} hiddenAnime={activeHiddenAnime}
@@ -239,19 +224,7 @@ export function TrendsTab() {
}) })
} }
/> />
<StackedTrendChart title="Videos per Title" data={filteredEpisodesPerAnime} /> <LibrarySummarySection rows={data.librarySummary} hiddenTitles={activeHiddenAnime} />
<StackedTrendChart title="Watch Time per Title (min)" data={filteredWatchTimePerAnime} />
<StackedTrendChart
title="Cards Mined per Title"
data={filteredCardsPerAnime}
colorPalette={cardsMinedStackedColors}
/>
<StackedTrendChart title="Words Seen per Title" data={filteredWordsPerAnime} />
<StackedTrendChart title="Lookups per Title" data={filteredLookupsPerAnime} />
<StackedTrendChart
title="Lookups/100w per Title"
data={filteredLookupsPerHundredPerAnime}
/>
<SectionHeader>Library Cumulative</SectionHeader> <SectionHeader>Library Cumulative</SectionHeader>
<StackedTrendChart title="Watch Time Progress (min)" data={filteredWatchTimeProgress} /> <StackedTrendChart title="Watch Time Progress (min)" data={filteredWatchTimeProgress} />