diff options
Diffstat (limited to 'src/routes/+layout.svelte')
| -rw-r--r-- | src/routes/+layout.svelte | 288 |
1 files changed, 157 insertions, 131 deletions
diff --git a/src/routes/+layout.svelte b/src/routes/+layout.svelte index 5826f40c..99cf8341 100644 --- a/src/routes/+layout.svelte +++ b/src/routes/+layout.svelte @@ -1,163 +1,189 @@ <script lang="ts"> -import Spacer from '$lib/Layout/Spacer.svelte'; -import type { SubsPleaseEpisode } from '$lib/Media/Anime/Airing/Subtitled/subsPlease'; -import { env } from '$env/dynamic/public'; -import { userIdentity as getUserIdentity } from '$lib/Data/AniList/identity'; -import { onDestroy, onMount } from 'svelte'; -import userIdentity from '$stores/identity'; -import settings from '$stores/settings'; -import { browser } from '$app/environment'; -import HeadTitle from '$lib/Home/HeadTitle.svelte'; -import '../app.css'; -import { readable, type Readable } from 'svelte/store'; -import { navigating } from '$app/stores'; -import NotificationsProvider from '$lib/Notification/NotificationsProvider.svelte'; -import Root from '$lib/Home/Root.svelte'; -import root from '$lib/Utility/root'; -import { addMessages, init, locale as i18nLocale, locales } from 'svelte-i18n'; -import english from '$lib/Locale/english'; -import japanese from '$lib/Locale/japanese'; -import type { LocaleDictionary } from '$lib/Locale/layout'; -import locale from '$stores/locale'; -import Skeleton from '$lib/Loading/Skeleton.svelte'; -import subsPlease from '$stores/subsPlease'; -import Dropdown from '$lib/Layout/Dropdown.svelte'; -import { injectSpeedInsights } from '@vercel/speed-insights/sveltekit'; -import subtitles from '$lib/Data/Static/subtitles.json'; -import settingsSyncPulled from '$stores/settingsSyncPulled'; -import settingsSyncTimes from '$stores/settingsSyncTimes'; -import Announcement from '$lib/Announcement.svelte'; -import Message from '$lib/Loading/Message.svelte'; -import { requestNotifications } from '$lib/Utility/notifications'; -import { database as userDatabase } from '$lib/Database/IDB/user'; -import CommandPalette from '$lib/CommandPalette/CommandPalette.svelte'; -import { defaultActions } from '$lib/CommandPalette/actions'; -import { toolsAsCommandPaletteActions } from '$lib/Tools/tools'; -import localforage from 'localforage'; -import { dev } from '$app/environment'; -import { injectAnalytics } from '@vercel/analytics/sveltekit'; -import type { LayoutData } from './$types'; +import Spacer from "$lib/Layout/Spacer.svelte"; +import type { SubsPleaseEpisode } from "$lib/Media/Anime/Airing/Subtitled/subsPlease"; +import { env } from "$env/dynamic/public"; +import { userIdentity as getUserIdentity } from "$lib/Data/AniList/identity"; +import { onDestroy, onMount } from "svelte"; +import userIdentity from "$stores/identity"; +import settings from "$stores/settings"; +import { browser } from "$app/environment"; +import HeadTitle from "$lib/Home/HeadTitle.svelte"; +import "../app.css"; +import { readable, type Readable } from "svelte/store"; +import { navigating } from "$app/stores"; +import NotificationsProvider from "$lib/Notification/NotificationsProvider.svelte"; +import Root from "$lib/Home/Root.svelte"; +import root from "$lib/Utility/root"; +import { addMessages, init, locale as i18nLocale, locales } from "svelte-i18n"; +import english from "$lib/Locale/english"; +import japanese from "$lib/Locale/japanese"; +import type { LocaleDictionary } from "$lib/Locale/layout"; +import locale from "$stores/locale"; +import Skeleton from "$lib/Loading/Skeleton.svelte"; +import subsPlease from "$stores/subsPlease"; +import Dropdown from "$lib/Layout/Dropdown.svelte"; +import { injectSpeedInsights } from "@vercel/speed-insights/sveltekit"; +import subtitles from "$lib/Data/Static/subtitles.json"; +import settingsSyncPulled from "$stores/settingsSyncPulled"; +import settingsSyncTimes from "$stores/settingsSyncTimes"; +import Announcement from "$lib/Announcement.svelte"; +import Message from "$lib/Loading/Message.svelte"; +import { requestNotifications } from "$lib/Utility/notifications"; +import { database as userDatabase } from "$lib/Database/IDB/user"; +import CommandPalette from "$lib/CommandPalette/CommandPalette.svelte"; +import { defaultActions } from "$lib/CommandPalette/actions"; +import { toolsAsCommandPaletteActions } from "$lib/Tools/tools"; +import localforage from "localforage"; +import { dev } from "$app/environment"; +import { injectAnalytics } from "@vercel/analytics/sveltekit"; +import type { LayoutData } from "./$types"; injectSpeedInsights(); -injectAnalytics({ mode: dev ? 'development' : 'production' }); +injectAnalytics({ mode: dev ? "development" : "production" }); export let data: LayoutData; let isHeaderVisible = true; let previousScrollPosition = 0; -let notificationInterval: ReturnType<typeof setInterval> | undefined = undefined; +let notificationInterval: ReturnType<typeof setInterval> | undefined = + undefined; -addMessages('en', english as unknown as LocaleDictionary); -addMessages('ja', japanese as unknown as LocaleDictionary); -init({ fallbackLocale: 'en', initialLocale: $settings.displayLanguage }); +addMessages("en", english as unknown as LocaleDictionary); +addMessages("ja", japanese as unknown as LocaleDictionary); +init({ fallbackLocale: "en", initialLocale: $settings.displayLanguage }); $: i18nLocale.set($settings.displayLanguage); -const navigationOrder = ['/', '/completed', '/schedule', '/updates', '/tools', '/settings']; +const navigationOrder = [ + "/", + "/completed", + "/schedule", + "/updates", + "/tools", + "/settings", +]; const previousPage: Readable<string | null> = readable(null, (set) => { - const unsubscribe = navigating.subscribe(($navigating) => { - if ($navigating && $navigating.from) set($navigating.from.url.pathname as unknown as null); - }); + const unsubscribe = navigating.subscribe(($navigating) => { + if ($navigating && $navigating.from) + set($navigating.from.url.pathname as unknown as null); + }); - return () => unsubscribe(); + return () => unsubscribe(); }); -$: way = data.url.includes('/user') - ? 200 - : $previousPage && $previousPage.includes('/user') - ? -200 - : navigationOrder.indexOf(data.url) > navigationOrder.indexOf($previousPage ?? '/') - ? 200 - : -200; +$: way = data.url.includes("/user") + ? 200 + : $previousPage && $previousPage.includes("/user") + ? -200 + : navigationOrder.indexOf(data.url) > + navigationOrder.indexOf($previousPage ?? "/") + ? 200 + : -200; const handleScroll = () => { - const currentScrollPosition = window.scrollY; + const currentScrollPosition = window.scrollY; - isHeaderVisible = currentScrollPosition <= 100 || currentScrollPosition < previousScrollPosition; - previousScrollPosition = currentScrollPosition; + isHeaderVisible = + currentScrollPosition <= 100 || + currentScrollPosition < previousScrollPosition; + previousScrollPosition = currentScrollPosition; }; onMount(async () => { - if (browser) { - if (await localforage.getItem('redirect')) { - window.location.href = (await localforage.getItem('redirect')) ?? '/'; - - await localforage.removeItem('redirect'); - } - - window.addEventListener('scroll', handleScroll); - - if ((await localforage.getItem('commit')) !== data.commit) { - await localforage.removeItem('identity'); - await localforage.removeItem('anime'); - await localforage.removeItem('manga'); - await localforage.removeItem('anime'); - await localforage.removeItem('manga'); - await localforage.removeItem('lastPruneTimes'); - await localforage.setItem('commit', data.commit); - } - } - - settings.get(); - - if (data.user !== undefined && $userIdentity.id === -2) - getUserIdentity(data.user).then((h) => userIdentity.set(h)); - - if ($settings.settingsSync && $userIdentity.id !== -2) - fetch(root(`/api/configuration?id=${$userIdentity.id}`)).then((response) => { - if (response.ok) - response.json().then((data) => { - if (data && data.configuration) { - console.log('Pulled remote configuration'); - settings.set(data.configuration); - settingsSyncPulled.set(true); - settingsSyncTimes.set({ - lastPull: new Date(), - lastPush: new Date(data.updated_at + 'Z') - }); - } - }); - }); - - await userDatabase.users.where('id').below(0).delete(); - - if (!(await userDatabase.users.get($userIdentity.id)) && $userIdentity.id > 0) - await userDatabase.users.put({ - id: $userIdentity.id, - user: data.user, - lastNotificationID: null - }); - - if ($settings.displayAniListNotifications && data.user !== undefined) - if ('Notification' in window && navigator.serviceWorker) requestNotifications(); + if (browser) { + if (await localforage.getItem("redirect")) { + window.location.href = (await localforage.getItem("redirect")) ?? "/"; + + await localforage.removeItem("redirect"); + } + + window.addEventListener("scroll", handleScroll); + + if ((await localforage.getItem("commit")) !== data.commit) { + await localforage.removeItem("identity"); + await localforage.removeItem("anime"); + await localforage.removeItem("manga"); + await localforage.removeItem("anime"); + await localforage.removeItem("manga"); + await localforage.removeItem("lastPruneTimes"); + await localforage.setItem("commit", data.commit); + } + } + + settings.get(); + + if (data.user !== undefined && $userIdentity.id === -2) + getUserIdentity(data.user).then((h) => userIdentity.set(h)); + + if ($settings.settingsSync && $userIdentity.id !== -2) + fetch(root(`/api/configuration?id=${$userIdentity.id}`)).then( + (response) => { + if (response.ok) + response.json().then((data) => { + if (data && data.configuration) { + console.log("Pulled remote configuration"); + settings.set(data.configuration); + settingsSyncPulled.set(true); + settingsSyncTimes.set({ + lastPull: new Date(), + lastPush: new Date(data.updated_at + "Z"), + }); + } + }); + }, + ); + + await userDatabase.users.where("id").below(0).delete(); + + if (!(await userDatabase.users.get($userIdentity.id)) && $userIdentity.id > 0) + await userDatabase.users.put({ + id: $userIdentity.id, + user: data.user, + lastNotificationID: null, + }); + + if ($settings.displayAniListNotifications && data.user !== undefined) + if ("Notification" in window && navigator.serviceWorker) + requestNotifications(); }); onDestroy(() => { - if (browser) window.removeEventListener('scroll', handleScroll); + if (browser) window.removeEventListener("scroll", handleScroll); - if (notificationInterval) clearInterval(notificationInterval); + if (notificationInterval) clearInterval(notificationInterval); }); $: { - if ((data.url === '/' || data.url === '/completed' || data.url === '/schedule') && !$subsPlease) - fetch(root(`/api/subsplease?tz=${Intl.DateTimeFormat().resolvedOptions().timeZone}`)) - .then((r) => r.json()) - .then((r) => { - for (const day in subtitles) { - if (!r.schedule[day]) r.schedule[day] = []; - - (subtitles[day as keyof typeof subtitles] as SubsPleaseEpisode[]).forEach((episode) => { - r.schedule[day].push({ - title: episode.title, - page: episode.page || '', - image_url: episode.image_url || '', - time: episode.time - }); - }); - } - - subsPlease.set(r); - }); + if ( + (data.url === "/" || + data.url === "/completed" || + data.url === "/schedule") && + !$subsPlease + ) + fetch( + root( + `/api/subsplease?tz=${Intl.DateTimeFormat().resolvedOptions().timeZone}`, + ), + ) + .then((r) => r.json()) + .then((r) => { + for (const day in subtitles) { + if (!r.schedule[day]) r.schedule[day] = []; + + ( + subtitles[day as keyof typeof subtitles] as SubsPleaseEpisode[] + ).forEach((episode) => { + r.schedule[day].push({ + title: episode.title, + page: episode.page || "", + image_url: episode.image_url || "", + time: episode.time, + }); + }); + } + + subsPlease.set(r); + }); } </script> |