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}