aboutsummaryrefslogtreecommitdiff
path: root/src/routes/completed
diff options
context:
space:
mode:
Diffstat (limited to 'src/routes/completed')
-rw-r--r--src/routes/completed/+page.svelte71
1 files changed, 60 insertions, 11 deletions
diff --git a/src/routes/completed/+page.svelte b/src/routes/completed/+page.svelte
index 96df8b90..220901bf 100644
--- a/src/routes/completed/+page.svelte
+++ b/src/routes/completed/+page.svelte
@@ -1,13 +1,11 @@
<script lang="ts">
+import type { Component } from "svelte";
import Spacer from "$lib/Layout/Spacer.svelte";
import { onDestroy, onMount } from "svelte";
import userIdentity from "$stores/identity.js";
import settings from "$stores/settings";
-import WatchingAnimeList from "$lib/List/Anime/CompletedAnimeList.svelte";
import ListTitle from "$lib/List/ListTitle.svelte";
-import MangaListTemplate from "$lib/List/Manga/MangaListTemplate.svelte";
import HeadTitle from "$lib/Home/HeadTitle.svelte";
-import LastActivity from "$lib/Home/LastActivity.svelte";
import { createHeightObserver } from "$lib/Utility/html.js";
import Skeleton from "$lib/Loading/Skeleton.svelte";
import locale from "$stores/locale.js";
@@ -15,14 +13,51 @@ import Landing from "$lib/Landing.svelte";
import stateBin from "$stores/stateBin.js";
import type { PageData } from "./$types";
-export let data: PageData;
+let { data }: { data: PageData } = $props();
+
+type UserProp = PageData["user"];
+type LastActivitySvelteComponent = Component<{
+ user: UserProp;
+}>;
+type WatchingAnimeListSvelteComponent = Component<{
+ user: UserProp;
+}>;
+type MangaListTemplateSvelteComponent = Component<{
+ user: UserProp;
+ displayUnresolved: boolean;
+ due: boolean;
+}>;
let removeHeightObserver: (() => void) | undefined;
+let LastActivityComponent: LastActivitySvelteComponent | null = $state(null);
+let WatchingAnimeListComponent: WatchingAnimeListSvelteComponent | null =
+ $state(null);
+let MangaListTemplateComponent: MangaListTemplateSvelteComponent | null =
+ $state(null);
+let completedSurfaceImport: Promise<void> | null = null;
+
+const loadCompletedSurface = () => {
+ if (data.user === undefined) return null;
+ if (completedSurfaceImport) return completedSurfaceImport;
+
+ completedSurfaceImport = Promise.all([
+ import("$lib/Home/LastActivity.svelte"),
+ import("$lib/List/Anime/CompletedAnimeList.svelte"),
+ import("$lib/List/Manga/MangaListTemplate.svelte"),
+ ]).then(([lastActivity, watchingAnimeList, mangaListTemplate]) => {
+ LastActivityComponent = lastActivity.default;
+ WatchingAnimeListComponent = watchingAnimeList.default;
+ MangaListTemplateComponent = mangaListTemplate.default;
+ });
+
+ return completedSurfaceImport;
+};
onMount(() => {
removeHeightObserver = createHeightObserver();
$stateBin.completedAnimeListOpen ??= true;
$stateBin.completedMangaListOpen ??= true;
+ void loadCompletedSurface();
});
onDestroy(() => removeHeightObserver?.());
@@ -30,7 +65,9 @@ onDestroy(() => removeHeightObserver?.());
<HeadTitle route="Completed" path="/completed" />
-<LastActivity user={data.user} />
+{#if LastActivityComponent}
+ <LastActivityComponent user={data.user} />
+{/if}
{#if data.user === undefined}
<div class="card">Please log in to view completed media.</div>
@@ -43,7 +80,13 @@ onDestroy(() => removeHeightObserver?.());
{#if !$settings.displayFiltersIncludeCompleted || !$settings.disableAnime}
<details bind:open={$stateBin.completedAnimeListOpen} class="list">
{#if $userIdentity.id !== -2}
- <WatchingAnimeList user={data.user} />
+ {#if WatchingAnimeListComponent}
+ <WatchingAnimeListComponent user={data.user} />
+ {:else}
+ <ListTitle title={$locale().lists.completed.anime} />
+
+ <Skeleton card={false} count={5} height="0.9rem" list />
+ {/if}
{:else}
<ListTitle title={$locale().lists.completed.anime} />
@@ -55,11 +98,17 @@ onDestroy(() => removeHeightObserver?.());
{#if !$settings.displayFiltersIncludeCompleted || !$settings.disableManga}
<details bind:open={$stateBin.completedMangaListOpen} class="list">
{#if $userIdentity.id !== -2}
- <MangaListTemplate
- user={data.user}
- displayUnresolved={$settings.displayUnresolved}
- due={false}
- />
+ {#if MangaListTemplateComponent}
+ <MangaListTemplateComponent
+ user={data.user}
+ displayUnresolved={$settings.displayUnresolved}
+ due={false}
+ />
+ {:else}
+ <ListTitle title={$locale().lists.completed.mangaAndLightNovels} />
+
+ <Skeleton card={false} count={5} height="0.9rem" list />
+ {/if}
{:else}
<ListTitle title={$locale().lists.completed.mangaAndLightNovels} />