aboutsummaryrefslogtreecommitdiff
path: root/src/lib/List/Anime
diff options
context:
space:
mode:
authorFuwn <[email protected]>2026-06-04 09:28:32 +0000
committerFuwn <[email protected]>2026-06-04 09:28:32 +0000
commitf34de9760850489d8f08eddb9bd33a41beda4771 (patch)
tree949f6b91e65980d0c2ff28141120d42261ad1696 /src/lib/List/Anime
parentfix(security): allow vercel.live and loosen font-src in CSP (diff)
downloaddue.moe-f34de9760850489d8f08eddb9bd33a41beda4771.tar.xz
due.moe-f34de9760850489d8f08eddb9bd33a41beda4771.zip
fix(lists): tick count down when media leaves a listHEADmain
On revalidation the {#await} branch swaps and remounts CleanAnimeList, resetting NumberTicker's tween to 0 so it always counted up. Persist the last displayed count in AnimeListTemplate (which survives the remount) and feed it as the ticker's start, so the count animates in the real direction: down when an item leaves due/upcoming, up when one arrives.
Diffstat (limited to 'src/lib/List/Anime')
-rw-r--r--src/lib/List/Anime/AnimeListTemplate.svelte3
-rw-r--r--src/lib/List/Anime/CleanAnimeList.svelte19
2 files changed, 19 insertions, 3 deletions
diff --git a/src/lib/List/Anime/AnimeListTemplate.svelte b/src/lib/List/Anime/AnimeListTemplate.svelte
index ae7ee1f1..5d769640 100644
--- a/src/lib/List/Anime/AnimeListTemplate.svelte
+++ b/src/lib/List/Anime/AnimeListTemplate.svelte
@@ -34,6 +34,7 @@ export let limit: number | undefined = undefined;
let lastUpdatedMedia = -1;
let previousAnimeList: Media[];
+let previousCount: number | undefined;
let pendingUpdate: number | null = null;
let lastListSize = 8;
@@ -74,6 +75,7 @@ onMount(async () => {
{notYetReleased}
{upcoming}
bind:previousAnimeList
+ bind:previousCount
bind:pendingUpdate
{dummy}
{disableFilter}
@@ -97,6 +99,7 @@ onMount(async () => {
{notYetReleased}
{upcoming}
bind:previousAnimeList
+ bind:previousCount
bind:pendingUpdate
{dummy}
{disableFilter}
diff --git a/src/lib/List/Anime/CleanAnimeList.svelte b/src/lib/List/Anime/CleanAnimeList.svelte
index 0bc88489..f2077d20 100644
--- a/src/lib/List/Anime/CleanAnimeList.svelte
+++ b/src/lib/List/Anime/CleanAnimeList.svelte
@@ -30,6 +30,7 @@ export let endTime: number;
export let lastUpdatedMedia: number;
export let completed = false;
export let previousAnimeList: Media[];
+export let previousCount: number | undefined = undefined;
export let pendingUpdate: number | null;
export let upcoming = false;
export let notYetReleased = false;
@@ -37,6 +38,12 @@ export let dummy = false;
export let disableFilter = false;
export let limit: number | undefined = undefined;
+// This list remounts on every revalidation (the {#await} branch swaps),
+// which resets the count ticker's tween. Snapshot the count the user last
+// saw so the ticker animates from it — ticking down when an item leaves,
+// up when one arrives — instead of always counting up from zero.
+const startCount = previousCount;
+
let showRoulette = false;
let airingRefreshTimeout: ReturnType<typeof setTimeout> | undefined;
let scheduledAiringAt: number | null = null;
@@ -111,6 +118,13 @@ $: filteredMedia =
? media
: media.filter((m) => m.mediaListEntry?.customLists?.[selectedList]);
+$: displayedCount =
+ $settings.displayTotalDueEpisodes || $settings.displayTotalEpisodes
+ ? totalEpisodeDueCount
+ : filteredMedia.length;
+
+$: previousCount = displayedCount;
+
$: if (browser && !dummy && media && previousAnimeList !== media)
previousAnimeList = media;
@@ -241,9 +255,8 @@ const increment = (anime: Media, progress: number) => {
<ListTitle
time={endTime / 1000}
- count={$settings.displayTotalDueEpisodes || $settings.displayTotalEpisodes
- ? totalEpisodeDueCount
- : filteredMedia.length}
+ count={displayedCount}
+ start={startCount ?? 0}
{title}
hideTime={dummy}
hideCount={dummy || media.length === 0}