diff --git a/src/lib/api/index.ts b/src/lib/api/index.ts index 913b821..ea339df 100644 --- a/src/lib/api/index.ts +++ b/src/lib/api/index.ts @@ -1,6 +1,7 @@ import {BASE_URL, client} from './client' import type { HunterLeaderboardResponse, + HunterSummaryResponse, HuntResponse, ItemResponse, LoginResponse, @@ -60,6 +61,9 @@ export const apiCreateTeam = (huntId: string, name: string) => export const apiGetTeam = (huntId: string, teamId: string) => client.get(`/hunt/${huntId}/team/${teamId}`) +export const apiGetTeamHunters = (huntId: string, teamId: string) => + client.get(`/hunt/${huntId}/team/${teamId}/hunter`) + // ── Items ───────────────────────────────────────────────────────────────────── export const apiGetItems = (huntId: string) => diff --git a/src/lib/api/types.ts b/src/lib/api/types.ts index 490aabb..c98b1bf 100644 --- a/src/lib/api/types.ts +++ b/src/lib/api/types.ts @@ -51,3 +51,8 @@ export interface HunterLeaderboardResponse { hunterName: string score: number } + +export interface HunterSummaryResponse { + id: string + name: string +} diff --git a/src/routes/hunter/HuntList.svelte b/src/routes/hunter/HuntList.svelte index b11f7de..00a6793 100644 --- a/src/routes/hunter/HuntList.svelte +++ b/src/routes/hunter/HuntList.svelte @@ -6,10 +6,11 @@ apiGetHunterTeam, apiGetOngoingHunts, apiGetUnstartedHunts, + apiGetTeamHunters, apiJoinTeam, apiListTeams, } from '../../lib/api/index' - import type {HuntResponse, TeamResponse} from '../../lib/api/types' + import type {HuntResponse, HunterSummaryResponse, TeamResponse} from '../../lib/api/types' import StatusBadge from '../../lib/components/StatusBadge.svelte' import LoadingSpinner from '../../lib/components/LoadingSpinner.svelte' @@ -53,6 +54,7 @@ let sheetHunt = $state(null) let sheetTeams = $state([]) + let sheetMembers = $state([]) let sheetLoading = $state(false) let newTeamName = $state('') let creatingTeam = $state(false) @@ -63,9 +65,20 @@ sheetHunt = hunt sheetError = '' newTeamName = '' + sheetMembers = [] sheetLoading = true try { - sheetTeams = await apiListTeams(hunt.id) + const myTeam = upcomingTeams[hunt.id] + if (myTeam) { + const [teams, members] = await Promise.all([ + apiListTeams(hunt.id), + apiGetTeamHunters(hunt.id, myTeam.id), + ]) + sheetTeams = teams + sheetMembers = members + } else { + sheetTeams = await apiListTeams(hunt.id) + } } catch (e: unknown) { sheetError = e instanceof Error ? e.message : 'Failed to load teams' } finally { @@ -237,10 +250,21 @@ {:else if myTeam} -
-

Your Team

-

{myTeam.name}

- +
+
+

Your Team

+

{myTeam.name}

+
+ {#if sheetMembers.length > 0} +
+

Members

+
+ {#each sheetMembers as member} +

{member.name}

+ {/each} +
+
+ {/if}
{:else} diff --git a/src/routes/hunter/HuntLobby.svelte b/src/routes/hunter/HuntLobby.svelte index 49ad3cf..e197767 100644 --- a/src/routes/hunter/HuntLobby.svelte +++ b/src/routes/hunter/HuntLobby.svelte @@ -8,13 +8,14 @@ apiGetHunterTeam, apiGetItemPhotos, apiGetItems, + apiGetTeamHunters, apiGetTeamItem, apiJoinTeam, apiListTeams, apiRemovePhoto, apiSubmitPhoto } from '../../lib/api/index' - import type {HuntResponse, ItemResponse, PhotoResponse, TeamItemResponse, TeamResponse} from '../../lib/api/types' + import type {HuntResponse, HunterSummaryResponse, ItemResponse, PhotoResponse, TeamItemResponse, TeamResponse} from '../../lib/api/types' import StatusBadge from '../../lib/components/StatusBadge.svelte' import AuthImage from '../../lib/components/AuthImage.svelte' import LoadingSpinner from '../../lib/components/LoadingSpinner.svelte' @@ -174,6 +175,21 @@ const submitted = $derived(Object.values(itemStatuses).filter(s => s.itemFoundStatus === 'SUBMITTED').length) const rejected = $derived(Object.values(itemStatuses).filter(s => s.itemFoundStatus === 'REJECTED').length) + let teamMembers = $state([]) + let teamMembersLoading = $state(false) + let teamMembersOpen = $state(false) + + async function openTeamMembers() { + if (!myTeam) return + teamMembersOpen = true + teamMembersLoading = true + try { + teamMembers = await apiGetTeamHunters(params.huntId, myTeam.id) + } finally { + teamMembersLoading = false + } + } + let searchQuery = $state('') let filterStatus = $state(null) let filterPoints = $state(null) @@ -228,7 +244,9 @@
{#if myTeam} -

Team: {myTeam.name}

+ {#if items.length > 0}
@@ -360,6 +378,31 @@ {/if}
+ +{#if teamMembersOpen && myTeam} + {@const team = myTeam} + +{/if} + {#if expandedPhoto} {@const photo = expandedPhoto}