aboutsummaryrefslogtreecommitdiff
path: root/src/routes/+layout.svelte
diff options
context:
space:
mode:
Diffstat (limited to 'src/routes/+layout.svelte')
-rw-r--r--src/routes/+layout.svelte288
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>