From d760761bba7368a4179e381b7156d9bd50f2fb3b Mon Sep 17 00:00:00 2001 From: ThaUnknown <6506529+ThaUnknown@users.noreply.github.com> Date: Tue, 19 Mar 2024 22:37:08 +0100 Subject: [PATCH] feat: cycling home screen banner #404 --- common/components/banner/Banner.svelte | 21 ++++- common/components/banner/FullBanner.svelte | 96 ++++++++++++++++------ common/views/Home/Home.svelte | 2 +- 3 files changed, 92 insertions(+), 27 deletions(-) diff --git a/common/components/banner/Banner.svelte b/common/components/banner/Banner.svelte index 81b97a8..23e507f 100644 --- a/common/components/banner/Banner.svelte +++ b/common/components/banner/Banner.svelte @@ -2,13 +2,32 @@ import FullBanner from './FullBanner.svelte' import SkeletonBanner from './SkeletonBanner.svelte' export let data + + /** + * Shuffles array in place. + * @template T + * @param {T[]} array items An array containing the items. + * @returns {T[]} + */ + function shuffle (array) { + let currentIndex = array.length + let randomIndex + + while (currentIndex > 0) { + randomIndex = Math.floor(Math.random() * currentIndex--); + + [array[currentIndex], array[randomIndex]] = [array[randomIndex], array[currentIndex]] + } + + return array + }
{#await data} {:then { data }} - + {/await}
diff --git a/common/components/banner/FullBanner.svelte b/common/components/banner/FullBanner.svelte index 810be6a..eb0d2bb 100644 --- a/common/components/banner/FullBanner.svelte +++ b/common/components/banner/FullBanner.svelte @@ -2,60 +2,83 @@ import { formatMap, setStatus, playMedia } from '@/modules/anime.js' import { anilistClient } from '@/modules/anilist.js' import { click } from '@/modules/click.js' - export let media + export let mediaList + + let current = mediaList[0] async function toggleStatus () { - if (!media.mediaListEntry) { + if (!current.mediaListEntry) { // add - const res = await setStatus('PLANNING', {}, media) - media.mediaListEntry = res.data.SaveMediaListEntry + const res = await setStatus('PLANNING', {}, current) + current.mediaListEntry = res.data.SaveMediaListEntry } else { // delete - anilistClient.delete({ id: media.mediaListEntry.id }) - media.mediaListEntry = undefined + anilistClient.delete({ id: current.mediaListEntry.id }) + current.mediaListEntry = undefined } } function toggleFavourite () { - anilistClient.favourite({ id: media.id }) - media.isFavourite = !media.isFavourite + anilistClient.favourite({ id: current.id }) + current.isFavourite = !current.isFavourite + } + + function currentIndex () { + return mediaList.indexOf(current) + } + + function schedule (index) { + return setTimeout(() => { + current = mediaList[index % mediaList.length] + timeout = schedule(index + 1) + }, 15000) + } + + let timeout = schedule(currentIndex() + 1) + + function setCurrent (media) { + clearTimeout(timeout) + current = media + timeout = schedule(currentIndex() + 1) } -banner +{#key current} + banner +{/key}