diff --git a/src/routes/event/[id]/+page.server.ts b/src/routes/event/[id]/+page.server.ts index 06149ae..dbc13bb 100644 --- a/src/routes/event/[id]/+page.server.ts +++ b/src/routes/event/[id]/+page.server.ts @@ -69,6 +69,7 @@ export const actions: Actions = { const formData = await request.formData(); const name = formData.get('newAttendeeName') as string; + const numberOfGuests = parseInt(formData.get('numberOfGuests') as string) || 0; const userId = cookies.get('cactoideUserId'); if (!name?.trim() || !userId) { @@ -82,27 +83,48 @@ export const actions: Actions = { return fail(404, { error: 'Event not found' }); } + // Get current RSVPs + const currentRSVPs = await database.select().from(rsvps).where(eq(rsvps.eventId, eventId)); + + // Calculate total attendees (including guests) + const totalAttendees = currentRSVPs.length + numberOfGuests; + // Check if event is full (for limited type events) if (eventData.type === 'limited' && eventData.attendeeLimit) { - const currentRSVPs = await database.select().from(rsvps).where(eq(rsvps.eventId, eventId)); - if (currentRSVPs.length >= eventData.attendeeLimit) { - return fail(400, { error: 'Event is full' }); + if (totalAttendees > eventData.attendeeLimit) { + return fail(400, { + error: `Event capacity exceeded. You're trying to add ${numberOfGuests + 1} attendees (including yourself), but only ${eventData.attendeeLimit - currentRSVPs.length} spots remain.` + }); } } // Check if name is already in the list - const existingRSVPs = await database.select().from(rsvps).where(eq(rsvps.eventId, eventId)); - if (existingRSVPs.some((rsvp) => rsvp.name.toLowerCase() === name.toLowerCase())) { + if (currentRSVPs.some((rsvp) => rsvp.name.toLowerCase() === name.toLowerCase())) { return fail(400, { error: 'Name already exists for this event' }); } - // Add RSVP to database - await database.insert(rsvps).values({ - eventId: eventId, - name: name.trim(), - userId: userId, - createdAt: new Date() - }); + // Prepare RSVPs to insert + const rsvpsToInsert = [ + { + eventId: eventId, + name: name.trim(), + userId: userId, + createdAt: new Date() + } + ]; + + // Add guest entries + for (let i = 1; i <= numberOfGuests; i++) { + rsvpsToInsert.push({ + eventId: eventId, + name: `${name.trim()}'s Guest #${i}`, + userId: userId, + createdAt: new Date() + }); + } + + // Insert all RSVPs + await database.insert(rsvps).values(rsvpsToInsert); return { success: true, type: 'add' }; } catch (err) { diff --git a/src/routes/event/[id]/+page.svelte b/src/routes/event/[id]/+page.svelte index c9aafee..f785ebe 100644 --- a/src/routes/event/[id]/+page.svelte +++ b/src/routes/event/[id]/+page.svelte @@ -14,6 +14,8 @@ let isAddingRSVP = false; let error = ''; let success = ''; + let addGuests = false; + let numberOfGuests = 1; // Use server-side data $: event = data.event; @@ -22,7 +24,7 @@ // Handle form errors from server $: if (form?.error) { - error = form.error; + error = String(form.error); success = ''; } @@ -31,6 +33,8 @@ success = 'RSVP added successfully!'; error = ''; newAttendeeName = ''; + addGuests = false; + numberOfGuests = 1; } const eventId = $page.params.id; @@ -179,7 +183,7 @@ return async ({ result, update }) => { isAddingRSVP = false; if (result.type === 'failure') { - error = result.data?.error || 'Failed to add RSVP'; + error = String(result.data?.error || 'Failed to add RSVP'); } update(); }; @@ -203,9 +207,48 @@ /> + +
+ Guests will be added as "{newAttendeeName || 'Your Name'}'s Guest #1", "{newAttendeeName || + 'Your Name'}'s Guest #2", etc. +
+