| Commit message (Collapse) | Author | Age | Files | Lines |
| |
|
|
|
|
| |
The optimistic local bump mutated anime.mediaListEntry.progress before
the API call read it, so the GraphQL mutation's own +1 landed on the
already-incremented value and advanced progress by two.
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
Adds optional namespaces (common, errors, commandPalette, headTitle,
notifications, schedule, events, home, reader, routes, badgePreview,
badgeWall) and extends existing ones (settings.*, lists.*, tools.*,
user.*, hololive.*) on the Locale interface. New fields are optional
so japanese.ts can omit them; svelte-i18n's fallbackLocale handles
the runtime miss.
HeadTitle gains an optional routeKey prop for type-safe lookup.
defaultActions becomes a factory so the command palette re-reads
locale on language toggle. The existing JP feedback translation
in routes/settings is preserved via japanese.ts.
Out of scope (kept hardcoded): service-worker.ts, app.html,
Landing*.svelte, tools.ts registry, Easter Event 2025 pages.
|
| |
|
|
|
|
|
|
|
|
| |
Before DueAnimeList/UpcomingAnimeList's onMount assigns the promise,
{#await undefined} fell through to {:then media=undefined}, which
cleanMedia turned into an empty array and the list rendered "No anime
to display". The auto-snapshot then captured [] into previousAnimeList,
making every subsequent pending state skip the skeleton. Gate the await
on animeLists being defined so the placeholder shows until the fetch
actually starts.
|
| |
|
|
|
|
|
|
| |
New 'Dry-run mutations' toggle in the Debug settings panel blocks
outgoing list updates (the + button) and skips the post-mutation
refresh so optimistic UI changes persist locally for testing. The
mutation gate sits in incrementMediaProgress; CleanAnimeList only
revalidates when the request actually went out.
|
| |
|
|
|
|
|
|
|
| |
Click + on a Due item now bumps progress locally and drops the row
if the bump catches the user up, with no upfront refresh. The mutation
fires in the background and triggers a single revalidate on response.
Also snapshot the resolved media to previousAnimeList on every render,
so refreshes from any path (countdown, interval, manual, post-increment)
show the prior list during pending instead of a placeholder.
|
| |
|
|
|
|
|
|
| |
Countdown timeout in CleanAnimeList and keyCacher interval in
DueAnimeList only reassigned their own animeLists, so an episode
airing on Upcoming never propagated to Due (and vice versa) until
a manual refresh. Bump revalidateAnime instead, so both panels
refresh through the shared reactive path.
|
| |
|
|
|
|
| |
Showing "0" in the list title next to a "No anime/manga to display"
empty-state message duplicates information. Treat an empty media list
the same as dummy mode and suppress the count.
|
| |
|
|
|
|
|
|
| |
If a user's persisted filter references a custom list that no longer
exists on any media (renamed or deleted on AniList), the select falls
back to showing "All" but the underlying state still filters to an
empty set. Detect the stale value and reset it, clearing the StateBin
entry so the fix survives a reload.
|
| |
|
|
|
|
| |
Rouletting a single item is deterministic, so the affordance adds
nothing. Require at least two items before showing the button on both
anime and manga lists.
|
| |
|
|
|
|
| |
If every custom list contains every displayed media item, each option
yields the same result, so the picker is noise. Gate the select on a
reactive check that any list excludes at least one item.
|
| |
|
|
|
|
|
|
|
| |
Replaces one-shot boolean revalidateAnime with a counter store so
multiple components can subscribe without race conditions. Adds
revalidateManga store and reactive refresh blocks to DueAnimeList
and MangaListTemplate. Extracts shared invalidateListCaches function
used by both the command palette action and the debug settings button.
Renames palette item to "Refresh" and debug button to "Invalidate".
|
| | |
|
| | |
|
| | |
|
| | |
|
| | |
|
| | |
|
| | |
|
| | |
|
| | |
|
| | |
|
| | |
|
| | |
|
| | |
|
| | |
|
| | |
|
| | |
|
| | |
|
| | |
|
| | |
|
| | |
|
| | |
|
| | |
|
| | |
|
| | |
|
| | |
|
| | |
|
| | |
|
| | |
|
| | |
|
| | |
|
| | |
|
| | |
|
| | |
|
| | |
|
| | |
|
| | |
|
| | |
|
| | |
|
| | |
|