diff --git a/src/data/RouterEvents.ts b/src/data/RouterEvents.ts new file mode 100644 index 0000000..7e6ecdf --- /dev/null +++ b/src/data/RouterEvents.ts @@ -0,0 +1,42 @@ +import { navigating, page } from '$app/stores'; +import { derived, type Readable } from 'svelte/store'; + +export interface RouterEvent { + // URL of the current page or the page we are navigating to. + target_url: URL; + // Are we navigating? + navigating: boolean; +} + +function makeStore(): Readable { + // This stuff will run both client side and server side. + + if (typeof location === 'undefined') { + // `location` does not exist on the server. + // Return a derived store based on `page` for SSR. + // Server will never navigate so this is fine. + return derived(page, $page => { + return { navigating: false, target_url: $page.url }; + }); + } else { + // On client. + let current = new URL(location); + + // Return store that responds to navigation events. + // The `navigating` store immediately "pushes" `null`. + // This in turn causes this derived store to immediately "push" the current URL. + return derived(navigating, $nav => { + let navigating = false; + // $nav is null when navigation finishes. + if ($nav != null && $nav.to != null) { + current = $nav.to.url; + navigating = true; + } + + return { navigating, target_url: current }; + }); + } +} + +// Do not subscribe to it outside of components! +export default makeStore(); diff --git a/src/lib/components/atoms/NavButton.svelte b/src/lib/components/atoms/NavButton.svelte index 5447b11..9c2ea36 100644 --- a/src/lib/components/atoms/NavButton.svelte +++ b/src/lib/components/atoms/NavButton.svelte @@ -1,21 +1,10 @@ -
  • +
  • diff --git a/src/routes/+layout.svelte b/src/routes/+layout.svelte index 0dc7fc4..4716fb9 100644 --- a/src/routes/+layout.svelte +++ b/src/routes/+layout.svelte @@ -1,31 +1,21 @@ @@ -42,7 +32,7 @@ -{#if is_navigating} +{#if $show_loading_animation} {:else}