From ff64bc15623e2f130387defc16ff04ac44931e77 Mon Sep 17 00:00:00 2001 From: Justin Edmund Date: Thu, 11 Sep 2025 10:44:59 -0700 Subject: [PATCH] Add rudimentary routes --- src/routes/+layout.svelte | 18 +++++- src/routes/[username]/+page.server.ts | 27 ++++++++ src/routes/[username]/+page.svelte | 65 ++++++++++++++++++++ src/routes/collection/+page.svelte | 0 src/routes/me/+page.server.ts | 16 ++--- src/routes/teams/[shortcode]/+error.svelte | 21 +++++++ src/routes/teams/[shortcode]/+page.server.ts | 34 ++++++++++ src/routes/teams/[shortcode]/+page.svelte | 13 ++++ src/routes/teams/explore/+page.server.ts | 18 ++++++ src/routes/teams/explore/+page.svelte | 35 +++++++++++ src/routes/teams/new/+page.svelte | 1 + 11 files changed, 234 insertions(+), 14 deletions(-) create mode 100644 src/routes/[username]/+page.server.ts create mode 100644 src/routes/[username]/+page.svelte create mode 100644 src/routes/collection/+page.svelte create mode 100644 src/routes/teams/[shortcode]/+error.svelte create mode 100644 src/routes/teams/[shortcode]/+page.server.ts create mode 100644 src/routes/teams/[shortcode]/+page.svelte create mode 100644 src/routes/teams/explore/+page.server.ts create mode 100644 src/routes/teams/explore/+page.svelte create mode 100644 src/routes/teams/new/+page.svelte diff --git a/src/routes/+layout.svelte b/src/routes/+layout.svelte index ee4962e5..8e1788ac 100644 --- a/src/routes/+layout.svelte +++ b/src/routes/+layout.svelte @@ -1,14 +1,26 @@ -{@render children?.()} +
+ + {@render children?.()} +
diff --git a/src/routes/[username]/+page.server.ts b/src/routes/[username]/+page.server.ts new file mode 100644 index 00000000..67533914 --- /dev/null +++ b/src/routes/[username]/+page.server.ts @@ -0,0 +1,27 @@ +import type { PageServerLoad } from './$types' +import { error } from '@sveltejs/kit' +import { profile } from '$lib/api/resources/users' +import { parseParty } from '$lib/api/schemas/party' +import * as partiesApi from '$lib/api/resources/parties' + +export const load: PageServerLoad = async ({ fetch, params, url, depends, locals }) => { + depends('app:profile') + const username = params.username + const pageParam = url.searchParams.get('page') + const page = pageParam ? Math.max(1, parseInt(pageParam, 10) || 1) : 1 + const tab = url.searchParams.get('tab') === 'favorites' ? 'favorites' : 'teams' + const isOwner = locals.session?.account?.username === username + + try { + if (tab === 'favorites' && isOwner) { + const fav = await partiesApi.favorites(fetch as any, { page }) + return { user: { username } as any, items: fav.items, page: fav.page, total: fav.total, totalPages: fav.totalPages, perPage: fav.perPage, tab, isOwner } + } + + const { user, items, total, totalPages, perPage } = await profile(fetch as any, username, page) + const parties = items.map((p) => parseParty(p)) + return { user, items: parties, page, total, totalPages, perPage, tab, isOwner } + } catch (e: any) { + throw error(e?.status || 502, e?.message || 'Failed to load profile') + } +} diff --git a/src/routes/[username]/+page.svelte b/src/routes/[username]/+page.svelte new file mode 100644 index 00000000..9db59027 --- /dev/null +++ b/src/routes/[username]/+page.svelte @@ -0,0 +1,65 @@ + + +
+
+ {#if data.user?.avatar?.picture} + {`Avatar + {:else} + + {/if} +
+

@{data.user.username}

+ +
+
+ + + + +
+ + diff --git a/src/routes/collection/+page.svelte b/src/routes/collection/+page.svelte new file mode 100644 index 00000000..e69de29b diff --git a/src/routes/me/+page.server.ts b/src/routes/me/+page.server.ts index e9a76175..dcb2b66e 100644 --- a/src/routes/me/+page.server.ts +++ b/src/routes/me/+page.server.ts @@ -1,15 +1,9 @@ import type { PageServerLoad } from './$types' import { redirect } from '@sveltejs/kit' -export const load: PageServerLoad = async ({ parent }) => { - const { isAuthenticated, account, currentUser } = await parent() - - if (!isAuthenticated) { - throw redirect(302, '/login?next=/me') - } - - return { - account, - user: currentUser - } +export const load: PageServerLoad = async ({ locals }) => { + const username = locals.session?.account?.username + if (!username) throw redirect(302, '/auth/login') + throw redirect(302, `/${encodeURIComponent(username)}`) } + diff --git a/src/routes/teams/[shortcode]/+error.svelte b/src/routes/teams/[shortcode]/+error.svelte new file mode 100644 index 00000000..6e46c7a2 --- /dev/null +++ b/src/routes/teams/[shortcode]/+error.svelte @@ -0,0 +1,21 @@ + + +
+

{status === 404 ? 'Team Not Found' : 'Something went wrong'}

+

+ {status === 404 + ? 'We could not find a team with that code.' + : (error?.message || 'Please try again later.')} +

+
+ + + diff --git a/src/routes/teams/[shortcode]/+page.server.ts b/src/routes/teams/[shortcode]/+page.server.ts new file mode 100644 index 00000000..4b007774 --- /dev/null +++ b/src/routes/teams/[shortcode]/+page.server.ts @@ -0,0 +1,34 @@ +import type { PageServerLoad } from './$types' +import { error } from '@sveltejs/kit' +import { PartyService } from '$lib/services/party.service' + +export const load: PageServerLoad = async ({ fetch, params, parent }) => { + const { shortcode } = params + const partyService = new PartyService(fetch) + + try { + const party = await partyService.getByShortcode(shortcode) + + const parentData = await parent() + const authUserId = (parentData as any)?.user?.id + + const canEditServer = partyService.computeEditability( + party, + authUserId, + undefined, + undefined + ) + + return { + party, + canEditServer: canEditServer.canEdit, + authUserId + } + } catch (err: any) { + console.error('Error loading party:', err) + if (err?.issues) console.error('Validation errors:', err.issues) + if (err.status === 404) throw error(404, 'Team not found') + throw error(err.status || 500, err.message || 'Failed to load team') + } +} + diff --git a/src/routes/teams/[shortcode]/+page.svelte b/src/routes/teams/[shortcode]/+page.svelte new file mode 100644 index 00000000..5ac5cc77 --- /dev/null +++ b/src/routes/teams/[shortcode]/+page.svelte @@ -0,0 +1,13 @@ + + + + diff --git a/src/routes/teams/explore/+page.server.ts b/src/routes/teams/explore/+page.server.ts new file mode 100644 index 00000000..041d438a --- /dev/null +++ b/src/routes/teams/explore/+page.server.ts @@ -0,0 +1,18 @@ +import type { PageServerLoad } from './$types' +import { error } from '@sveltejs/kit' +import * as parties from '$lib/api/resources/parties' + +export const load: PageServerLoad = async ({ fetch, url, depends }) => { + depends('app:parties:list') + + const pageParam = url.searchParams.get('page') + const page = pageParam ? Math.max(1, parseInt(pageParam, 10) || 1) : 1 + + try { + const { items, total, totalPages, perPage } = await parties.list(fetch, { page }) + return { items, page, total, totalPages, perPage } + } catch (e: any) { + throw error(e?.status || 502, e?.message || 'Failed to load teams') + } +} + diff --git a/src/routes/teams/explore/+page.svelte b/src/routes/teams/explore/+page.svelte new file mode 100644 index 00000000..90f7de8b --- /dev/null +++ b/src/routes/teams/explore/+page.svelte @@ -0,0 +1,35 @@ + + +
+
+

Explore Teams

+
+ + + + +
+ + diff --git a/src/routes/teams/new/+page.svelte b/src/routes/teams/new/+page.svelte new file mode 100644 index 00000000..d107c24d --- /dev/null +++ b/src/routes/teams/new/+page.svelte @@ -0,0 +1 @@ +