From 8bdaf94d9dd0582315eeedb3d04210d3fd3acfa6 Mon Sep 17 00:00:00 2001 From: Fuwn Date: Sun, 27 Aug 2023 22:06:13 -0700 Subject: feat(anime): allow sort by days left --- src/lib/List/Due/AnimeList.svelte | 24 ++++++++++++++++-------- src/routes/settings/+page.svelte | 13 +++++++++++++ src/stores/sortByDifference.ts | 14 ++++++++++++++ 3 files changed, 43 insertions(+), 8 deletions(-) create mode 100644 src/stores/sortByDifference.ts diff --git a/src/lib/List/Due/AnimeList.svelte b/src/lib/List/Due/AnimeList.svelte index a9f347a9..506107f8 100644 --- a/src/lib/List/Due/AnimeList.svelte +++ b/src/lib/List/Due/AnimeList.svelte @@ -4,6 +4,7 @@ import { onMount } from 'svelte'; import anime from '../../../stores/anime'; import animeLastPrune from '../../../stores/mangaLastPrune'; + import sortByDifference from '../../../stores/sortByDifference'; export let user: AniListAuthorisation; export let identity: UserIdentity; @@ -44,16 +45,23 @@ } finalMedia.sort((a: Media, b: Media) => { - const difference = (anime: Media) => { + if ($sortByDifference === 'false') { + const difference = (anime: Media) => { + return ( + (anime.nextAiringEpisode?.episode === -1 + ? 99999 + : anime.nextAiringEpisode?.episode || -1) - + (anime['mediaListEntry'] || { progress: 0 })['progress'] + ); + }; + + return difference(a) - difference(b); + } else { return ( - (anime.nextAiringEpisode?.episode === -1 - ? 99999 - : anime.nextAiringEpisode?.episode || -1) - - (anime['mediaListEntry'] || { progress: 0 })['progress'] + (a.nextAiringEpisode?.timeUntilAiring || 9999) - + (b.nextAiringEpisode?.timeUntilAiring || 9999) ); - }; - - return difference(a) - difference(b); + } }); finalMedia = finalMedia.filter((item, index, array) => { diff --git a/src/routes/settings/+page.svelte b/src/routes/settings/+page.svelte index f50208b5..874d3804 100644 --- a/src/routes/settings/+page.svelte +++ b/src/routes/settings/+page.svelte @@ -6,6 +6,7 @@ import cacheMangaMinutes from '../../stores/cacheMangaMinutes'; import cacheMinutes from '../../stores/cacheMinutes'; import roundDownChapters from '../../stores/roundDownChapters'; + import sortByDifference from '../../stores/sortByDifference'; export let data; @@ -73,6 +74,18 @@ >{mangaClosed ? 'Expand' : 'Close'} manga panel by default +
  • + + $sortByDifference === 'true' + ? sortByDifference.set('false') + : sortByDifference.set('true')} + >Sort anime by {@html $sortByDifference === 'true' + ? 'difference between last watched and next episode' + : 'days left until next episode'} +
  • Re-cache ALL unresolved manga
  • diff --git a/src/stores/sortByDifference.ts b/src/stores/sortByDifference.ts new file mode 100644 index 00000000..1a26371e --- /dev/null +++ b/src/stores/sortByDifference.ts @@ -0,0 +1,14 @@ +import { browser } from '$app/environment'; +import { writable } from 'svelte/store'; + +const sortByDifference = writable( + browser ? localStorage.getItem('sortByDifference') ?? 'true' : 'true' +); + +sortByDifference.subscribe((value) => { + if (browser) { + localStorage.setItem('sortByDifference', value); + } +}); + +export default sortByDifference; -- cgit v1.2.3