diff --git a/src/routes/(app)/[username]/+page.server.ts b/src/routes/(app)/[username]/+page.server.ts index e4216f1c..e229f86c 100644 --- a/src/routes/(app)/[username]/+page.server.ts +++ b/src/routes/(app)/[username]/+page.server.ts @@ -8,27 +8,12 @@ export const load: PageServerLoad = async ({ params, url, depends, locals }) => 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 userAdapter.getFavorites({ 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 userAdapter.getProfile(username, page) const parties = items.map((p) => parseParty(p)) - return { user, items: parties, page, total, totalPages, perPage, tab, isOwner } + return { user, items: parties, page, total, totalPages, perPage, isOwner } } catch (e: any) { throw error(e?.status || 502, e?.message || 'Failed to load profile') } diff --git a/src/routes/(app)/[username]/+page.svelte b/src/routes/(app)/[username]/+page.svelte index dfea628d..414d2a91 100644 --- a/src/routes/(app)/[username]/+page.svelte +++ b/src/routes/(app)/[username]/+page.svelte @@ -3,76 +3,42 @@ import { createInfiniteQuery } from '@tanstack/svelte-query' import ExploreGrid from '$lib/components/explore/ExploreGrid.svelte' import ProfileHeader from '$lib/components/profile/ProfileHeader.svelte' - import { userQueries, type FavoritesPageResult } from '$lib/api/queries/user.queries' + import { userQueries } from '$lib/api/queries/user.queries' import { crewStore } from '$lib/stores/crew.store.svelte' import { IsInViewport } from 'runed' import Icon from '$lib/components/Icon.svelte' import Button from '$lib/components/ui/Button.svelte' - const { data } = $props() as { data: PageData } - const tab = $derived(data.tab || 'teams') + const { data }: { data: PageData } = $props() const isOwner = $derived(data.isOwner || false) - const activeTab = $derived<'teams' | 'favorites'>(tab === 'favorites' ? 'favorites' : 'teams') // Crew info for invite functionality const viewerCrewRole = $derived(crewStore.membership?.role ?? null) const viewerCrewId = $derived(crewStore.crew?.id ?? null) - // Note: Type assertion needed because favorites and parties queries have different - // result structures (items vs results) but we handle both in the items $derived - const getQueryOptions = () => { - const isFavorites = tab === 'favorites' && isOwner - - if (isFavorites) { - return { - ...userQueries.favorites(), - initialData: data.items - ? { - pages: [ - { - items: data.items, - page: data.page || 1, - totalPages: data.totalPages, - total: data.total, - perPage: data.perPage || 20 - } - ], - pageParams: [1] + const partiesQuery = createInfiniteQuery(() => ({ + ...userQueries.parties(data.user?.username ?? ''), + enabled: !!data.user?.username, + initialData: data.items + ? { + pages: [ + { + results: data.items, + page: data.page || 1, + totalPages: data.totalPages ?? 1, + total: data.total ?? data.items.length, + perPage: data.perPage || 20 } - : undefined, - initialDataUpdatedAt: 0 - } - } - - return { - ...userQueries.parties(data.user?.username ?? ''), - enabled: !!data.user?.username, - initialData: data.items - ? { - pages: [ - { - results: data.items, - page: data.page || 1, - totalPages: data.totalPages, - total: data.total, - perPage: data.perPage || 20 - } - ], - pageParams: [1] - } - : undefined, - initialDataUpdatedAt: 0 - } - } - const partiesQuery = createInfiniteQuery(getQueryOptions as () => ReturnType) + ], + pageParams: [1] + } + : undefined, + initialDataUpdatedAt: 0 + })) const items = $derived(() => { if (!partiesQuery.data?.pages) return data.items || [] - const isFavorites = tab === 'favorites' && isOwner - if (isFavorites) { - return partiesQuery.data.pages.flatMap((page) => (page as any).items ?? []) - } - return partiesQuery.data.pages.flatMap((page) => (page as any).results ?? []) + return partiesQuery.data.pages.flatMap((page) => page.results ?? []) }) const isEmpty = $derived(!partiesQuery.isLoading && items().length === 0) @@ -96,12 +62,20 @@ }) + + {data.user.username}'s Teams | Hensei + +
-

Loading {tab}...

+

Loading teams...

{:else if partiesQuery.isError}
-

Failed to load {tab}: {partiesQuery.error?.message || 'Unknown error'}

+

Failed to load teams: {partiesQuery.error?.message || 'Unknown error'}

{:else if isEmpty}
-

{tab === 'favorites' ? 'No favorite teams yet' : 'No teams found'}

+

No teams found

{:else}
@@ -139,7 +113,7 @@ {#if !partiesQuery.hasNextPage && items().length > 0}
-

You've seen all {tab === 'favorites' ? 'favorites' : 'teams'}!

+

You've seen all teams!

{/if}
diff --git a/src/routes/(app)/[username]/favorites/+page.server.ts b/src/routes/(app)/[username]/favorites/+page.server.ts new file mode 100644 index 00000000..909e42c5 --- /dev/null +++ b/src/routes/(app)/[username]/favorites/+page.server.ts @@ -0,0 +1,21 @@ +import type { PageServerLoad } from './$types' +import { error, redirect } from '@sveltejs/kit' +import { userAdapter } from '$lib/api/adapters/user.adapter' + +export const load: PageServerLoad = async ({ params, locals }) => { + const username = params.username + const isOwner = locals.session?.account?.username === username + + // Only the owner can view their favorites + if (!isOwner) { + throw redirect(302, `/${username}`) + } + + try { + // Just get the user info - favorites are fetched client-side + const { user } = await userAdapter.getProfile(username, 1) + return { user, isOwner } + } catch (e: any) { + throw error(e?.status || 502, e?.message || 'Failed to load profile') + } +} diff --git a/src/routes/(app)/[username]/favorites/+page.svelte b/src/routes/(app)/[username]/favorites/+page.svelte new file mode 100644 index 00000000..f98ef1be --- /dev/null +++ b/src/routes/(app)/[username]/favorites/+page.svelte @@ -0,0 +1,167 @@ + + + + + + {data.user.username}'s Favorites | Hensei + + +
+ + + {#if favoritesQuery.isLoading} +
+ +

Loading favorites...

+
+ {:else if favoritesQuery.isError} +
+ +

Failed to load favorites: {favoritesQuery.error?.message || 'Unknown error'}

+ +
+ {:else if isEmpty} +
+

No favorite teams yet

+
+ {:else} +
+ + + {#if showSentinel} +
+ {/if} + + {#if favoritesQuery.isFetchingNextPage} +
+ + Loading more... +
+ {/if} + + {#if !favoritesQuery.hasNextPage && items().length > 0} +
+

You've seen all favorites!

+
+ {/if} +
+ {/if} +
+ +