From edc38bb6a5fd0bb575d25f3b611846c4eb610d52 Mon Sep 17 00:00:00 2001 From: Yusur Princeps Date: Sat, 20 Dec 2025 20:52:51 +0100 Subject: [PATCH 1/3] add /about/ --- package.json | 2 +- src/routes/about/+page.svelte | 13 +++++++++++++ src/routes/about/+page.ts | 19 +++++++++++++++++++ 3 files changed, 33 insertions(+), 1 deletion(-) create mode 100644 src/routes/about/+page.svelte create mode 100644 src/routes/about/+page.ts diff --git a/package.json b/package.json index b99b0e4..81c8ec3 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "@yusurko/vigil", "private": true, - "version": "0.1.0-dev49", + "version": "0.1.0-dev50", "type": "module", "scripts": { "dev": "vite dev", diff --git a/src/routes/about/+page.svelte b/src/routes/about/+page.svelte new file mode 100644 index 0000000..2759739 --- /dev/null +++ b/src/routes/about/+page.svelte @@ -0,0 +1,13 @@ + + +
+

About

+ + +
\ No newline at end of file diff --git a/src/routes/about/+page.ts b/src/routes/about/+page.ts new file mode 100644 index 0000000..82092be --- /dev/null +++ b/src/routes/about/+page.ts @@ -0,0 +1,19 @@ +import { backend } from '$lib/backend.js'; +import { error } from '@sveltejs/kit'; + + + +export async function load(event) { + + const resp = await backend.withEvent(event).fetch('about/about'); + + if(resp.status === 404) { + error(404); + } + + const respJ = await resp.json(); + + const { content } = respJ; + + return { content }; +} \ No newline at end of file From db37df4151067b4268c5a0b59193c89f8316440a Mon Sep 17 00:00:00 2001 From: Yusur Princeps Date: Thu, 25 Dec 2025 16:32:20 +0100 Subject: [PATCH 2/3] improve loading ux --- package.json | 2 +- src/lib/globals.svelte.ts | 13 ++++++++++--- src/routes/+layout.svelte | 2 +- src/routes/+page.svelte | 6 +++++- 4 files changed, 17 insertions(+), 6 deletions(-) diff --git a/package.json b/package.json index 81c8ec3..8f71d78 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "@yusurko/vigil", "private": true, - "version": "0.1.0-dev50", + "version": "0.1.0-dev51", "type": "module", "scripts": { "dev": "vite dev", diff --git a/src/lib/globals.svelte.ts b/src/lib/globals.svelte.ts index 51f1744..1af19c9 100644 --- a/src/lib/globals.svelte.ts +++ b/src/lib/globals.svelte.ts @@ -4,14 +4,16 @@ import { RiListOrdered } from "svelte-remixicon"; let health : { app_name: string, version: string, post_count: number, - user_count: number, me: null | UserEntry, color_theme: number + user_count: number, me: null | UserEntry, color_theme: number, + loaded: boolean } = $state({ - app_name: 'app_name', + app_name: 'Freak', version: "?.?", post_count: NaN, user_count: NaN, me: null, - color_theme: 0 + color_theme: 0, + loaded: false }); @@ -21,6 +23,7 @@ export function setHealth ({ name, version, post_count, user_count, color_theme health.post_count = post_count; health.user_count = user_count; health.color_theme = color_theme; + health.loaded = true; } export function setMe (me: UserEntry | null) { @@ -60,4 +63,8 @@ export function randomChoice(list: T[]): T { export function getColorThemeCode (): number { return health.color_theme; +} + +export function isLoaded(): boolean { + return health.loaded; } \ No newline at end of file diff --git a/src/routes/+layout.svelte b/src/routes/+layout.svelte index 162929a..86142f8 100644 --- a/src/routes/+layout.svelte +++ b/src/routes/+layout.svelte @@ -27,7 +27,7 @@ let colorThemeCls = $derived(`color-scheme-${colorScheme} color-theme-${colorThe - + {#if data} {/if} diff --git a/src/routes/+page.svelte b/src/routes/+page.svelte index 62912a1..5b3120b 100644 --- a/src/routes/+page.svelte +++ b/src/routes/+page.svelte @@ -3,7 +3,7 @@ import type { GuildEntry, PostEntry } from "$lib/backend"; import Centered from "$lib/Centered.svelte"; import Feed from "$lib/Feed.svelte"; - import { activePostCount, activeUserCount, appName, getMe } from "$lib/globals.svelte"; + import { activePostCount, activeUserCount, appName, getMe, isLoaded } from "$lib/globals.svelte"; import HomeMenu from "$lib/HomeMenu.svelte"; import SLayout from "$lib/SLayout.svelte"; @@ -46,6 +46,10 @@ {/if} {/snippet} +{:else if !isLoaded()} + +

{appName()} is now loading…

+
{:else}

{appName()} is a social media platform made by people like you.
From 2260afd5f13cc1143e02c3d41f9a5ab2a34d9bfe Mon Sep 17 00:00:00 2001 From: Yusur Princeps Date: Wed, 11 Mar 2026 13:36:07 +0100 Subject: [PATCH 3/3] add /explore/ --- package.json | 2 +- src/lib/HomeMenu.svelte | 5 ++- src/routes/+page.svelte | 1 + src/routes/+page.ts | 2 +- src/routes/[x+40][name]/+page.svelte | 1 - src/routes/[x+40][name]/+page.ts | 2 +- src/routes/explore/+page.svelte | 50 ++++++++++++++++++++++++++ src/routes/explore/+page.ts | 53 ++++++++++++++++++++++++++++ 8 files changed, 111 insertions(+), 5 deletions(-) create mode 100644 src/routes/explore/+page.svelte create mode 100644 src/routes/explore/+page.ts diff --git a/package.json b/package.json index 8f71d78..fccf4cb 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "@yusurko/vigil", "private": true, - "version": "0.1.0-dev51", + "version": "0.1.0-dev62", "type": "module", "scripts": { "dev": "vite dev", diff --git a/src/lib/HomeMenu.svelte b/src/lib/HomeMenu.svelte index 36e2669..35f359a 100644 --- a/src/lib/HomeMenu.svelte +++ b/src/lib/HomeMenu.svelte @@ -1,5 +1,5 @@ + + + + + {#snippet left()} + + {/snippet} + + {#snippet right()} + {#if top_guilds} + +

    + {#each top_guilds as gu} +
  • + +{gu.name} - + {gu.post_count ?? 0} posts - + {gu.subscriber_count ?? 0} subscribers +
  • + {/each} +
+ + {/if} + {/snippet} + + + diff --git a/src/routes/explore/+page.ts b/src/routes/explore/+page.ts new file mode 100644 index 0000000..978dd28 --- /dev/null +++ b/src/routes/explore/+page.ts @@ -0,0 +1,53 @@ +import { backend, type GuildEntry, type PostEntry } from '$lib/backend.js'; +import { getMe, sleep } from '$lib/globals.svelte.js'; +import type { LoadEvent } from '@sveltejs/kit'; + + +async function loadFeed (event: LoadEvent): Promise { + const resp = await backend.withEvent(event).fetch('explore/feed'); + + if ([200].indexOf(resp.status) < 0) { + console.error(`fetch feed returned status ${resp.status}`); + return null; + } + try { + const respJ = await resp.json(); + + const { feed } : { feed: PostEntry[] } = respJ; + + return feed; + } catch (e) { + return null; + } +} + +async function loadTopGuilds (event: LoadEvent): Promise { + const resp = await backend.withEvent(event).fetch('top/guilds'); + + if ([200].indexOf(resp.status) < 0) { + console.error(`fetch top_guilds returned status ${resp.status}`); + return null; + } + try { + const respJ = await resp.json(); + + const { has: top_guilds } : { has: GuildEntry[] } = respJ; + return top_guilds; + } catch (e) { + return null; + } +} + +export async function load(event): Promise<{feed: PostEntry[] | null, top_guilds?: GuildEntry[] | null}> { + + let feed = null; + let me = getMe(); + let top_guilds = null; + + if (me) { + feed = await loadFeed(event); + top_guilds = await loadTopGuilds(event); + } + + return { feed, top_guilds }; +}