diff --git a/src/routes/(app)/matches/+page.server.ts b/src/routes/(app)/matches/+page.server.ts
index da7e814..59bfa1c 100644
--- a/src/routes/(app)/matches/+page.server.ts
+++ b/src/routes/(app)/matches/+page.server.ts
@@ -11,36 +11,44 @@ import type { PageServerLoad, Actions } from './$types';
export const load: PageServerLoad = async ({ locals }) => {
requireAuth(locals);
- const [matches, teams, mappools, userTeamMemberships] = await Promise.all([
- db.query.match.findMany({
- with: { participants: { with: { team: true } }, mappool: { with: { slots: true } } },
- orderBy: desc(match.createdAt),
- limit: 50
- }),
- db.query.team.findMany({
- with: { members: true },
- orderBy: (t, { asc }) => [asc(t.name)]
- }),
- db.query.mappool.findMany({
- with: { slots: true },
- orderBy: (m, { desc }) => [desc(m.createdAt)]
- }),
- db.query.teamMember.findMany({
- where: eq(teamMember.userId, locals.user!.id),
- with: { team: true }
- })
- ]);
+ const matches = await db.query.match.findMany({
+ with: { participants: { with: { team: true } }, mappool: { with: { slots: true } } },
+ orderBy: desc(match.createdAt),
+ limit: 50
+ });
return {
matches,
- teams: teams.map((t) => ({ ...t, memberCount: t.members.length })),
- mappools,
- userTeams: userTeamMemberships.map((m) => m.team),
canCreateMatch: hasRole(locals.user!.role, 'referee')
};
};
export const actions: Actions = {
+ loadCreateFormData: async ({ locals }) => {
+ requireAuth(locals);
+
+ const [teams, mappools, userTeamMemberships] = await Promise.all([
+ db.query.team.findMany({
+ with: { members: true },
+ orderBy: (t, { asc }) => [asc(t.name)]
+ }),
+ db.query.mappool.findMany({
+ with: { slots: true },
+ orderBy: (m, { desc }) => [desc(m.createdAt)]
+ }),
+ db.query.teamMember.findMany({
+ where: eq(teamMember.userId, locals.user!.id),
+ with: { team: true }
+ })
+ ]);
+
+ return {
+ teams: teams.map((t) => ({ ...t, memberCount: t.members.length })),
+ mappools,
+ userTeams: userTeamMemberships.map((m) => m.team)
+ };
+ },
+
createMatch: async ({ request, locals }) => {
// Only referees and admins can create matches manually
requireRole(locals, 'referee', 'Only referees and admins can create matches');
diff --git a/src/routes/(app)/matches/+page.svelte b/src/routes/(app)/matches/+page.svelte
index 9432825..0ba385c 100644
--- a/src/routes/(app)/matches/+page.svelte
+++ b/src/routes/(app)/matches/+page.svelte
@@ -9,6 +9,8 @@
let createError = $state('');
let inviteError = $state('');
let inviteSuccess = $state(false);
+ let formDataLoading = $state(false);
+ let formData = $state(null);
// Challenge form state
let selectedCreatorTeamId = $state('');
@@ -18,10 +20,25 @@
let useCustomBo = $state(false);
let opponentSearch = $state('');
- const personalTeam = $derived((data as any).userTeams?.find((t: any) => t.isPersonal));
- const nonPersonalUserTeams = $derived(
- (data as any).userTeams?.filter((t: any) => !t.isPersonal) ?? []
- );
+ // Load form data when create/invite modals open
+ $effect(async () => {
+ if ((showCreate || showInvite) && !formData && !formDataLoading) {
+ formDataLoading = true;
+ const formData_elem = new FormData();
+ const response = await fetch('?/loadCreateFormData', {
+ method: 'POST',
+ body: formData_elem
+ });
+ const result = await response.json();
+ if (result.data) {
+ formData = result.data;
+ }
+ formDataLoading = false;
+ }
+ });
+
+ const personalTeam = $derived((formData ?? data).userTeams?.find((t: any) => t.isPersonal));
+ const nonPersonalUserTeams = $derived((formData ?? data).userTeams?.filter((t: any) => !t.isPersonal) ?? []);
const hasMultipleTeams = $derived(nonPersonalUserTeams.length > 0);
// Auto-select personal team by default
@@ -31,8 +48,8 @@
}
});
- const selectedCreatorTeam = $derived(data.teams.find((t: any) => t.id === selectedCreatorTeamId));
- const selectedInvitedTeam = $derived(data.teams.find((t: any) => t.id === selectedInvitedTeamId));
+ const selectedCreatorTeam = $derived((formData ?? data).teams.find((t: any) => t.id === selectedCreatorTeamId));
+ const selectedInvitedTeam = $derived((formData ?? data).teams.find((t: any) => t.id === selectedInvitedTeamId));
const creatorIsPersonal = $derived(selectedCreatorTeam?.isPersonal ?? true);
const creatorMaxSize = $derived(selectedCreatorTeam?.memberCount ?? 1);
@@ -42,7 +59,7 @@
// Filter opponent teams for search
const filteredOpponentTeams = $derived(
- data.teams.filter((t: any) => {
+ (formData ?? data).teams.filter((t: any) => {
if (t.id === selectedCreatorTeamId) return false;
if (!opponentSearch) return true;
return t.name.toLowerCase().includes(opponentSearch.toLowerCase());
@@ -141,26 +158,22 @@
- {#if (data as any).userTeams?.length > 0}
+ {#if (formData ?? data).userTeams?.length > 0}
{/if}
{#if data.canCreateMatch}
{/if}