import Head from 'next/head'; import { useState } from 'react'; import styled, { keyframes } from 'styled-components'; import GuestRSVP from '../../components/GuestRSVP'; import Layout from '../../components/Layout'; import useForm from '../../lib/useForm'; import useUser from '../../lib/useUser'; import fetchJson from '../../lib/fetchJson'; import Group from '../../models/Group'; import Guest from '../../models/Guest'; import connectDb from '../../utils/db'; import { CalendarIcon, MapIcon } from '../../lib/svgs'; import useModal from '../../lib/useModal'; import Modal from '../../components/Modal'; const RSVPGroupStyles = styled.div` h2 { margin: 2rem 0; } `; const loadingFrame = keyframes` from { background-position: 0 0; } to { background-position: 100% 100%; } `; const FormStyles = styled.form` display: grid; gap: 2rem; margin-top: 3rem; &::before, &::after { height: 10px; content: ''; display: block; border-radius: 4px; background-image: linear-gradient( to right, var(--primary) 0%, var(--lightViolet) 50%, var(--primary) 100% ); } &[aria-busy='true']::before, &[aria-busy='true']::after { background-size: 50% auto; animation: ${loadingFrame} 0.5s linear infinite; } label { display: grid; gap: 1rem; } input, textarea, select { width: 100%; padding: 1rem; border: 1px solid var(--primary); &:focus { outline: 0; border-color: var(--lightViolet); } } button[type='submit'], input[type='submit'] { width: 100%; font-size: 2rem; font-weight: 600; padding: 1.2rem 1.2rem; } hr { display: block; max-width: 100%; height: 0; max-height: 0; border: solid; width: 100%; border-width: thin 0 0 0; transition: inherit; border-color: var(--lightShade); color: var(--lightShade); margin: 2.5rem 0; } button:disabled { background: var(--lightGray); } fieldset { border-radius: 4px; &[disabled] { opacity: 0.5; } } `; const AddressStyles = styled.div` button { background: none; color: var(--primary); padding: 0; } `; const QuestionStyles = styled.div` display: grid; grid-template-columns: 1fr auto; align-items: center; gap: 0.5rem; @media (max-width: 600px) { grid-template-columns: auto; } `; const ErrorContactStyles = styled.p` font-weight: bold; a { text-decoration: underline; } `; export default function SingleGroupPage({ group }) { const { guests, note } = group; const { user } = useUser({ redirectTo: '/login' }); const [errorMsg, setErrorMsg] = useState(''); const [errorCount, setErrorCount] = useState(0); const [message, setMessage] = useState(''); const [loading, setLoading] = useState(false); const [groupHasPlusOne, setGroupHasPlusOne] = useState(false); const { isVisible, toggleModal } = useModal(); const address = 'Central Park, New York, New York, USA'; function getInitialFormData() { const initial = {}; for (const guest of guests) { const guestData = { rsvpStatus: guest?.rsvpStatus || '', dietaryNotes: guest?.dietaryNotes || '', songRequests: guest?.songRequests || '', hasPlusOne: guest?.hasPlusOne || false, plusOne: guest?.plusOne || false, plusOneFirstName: guest?.plusOneFirstName || '', plusOneLastName: guest?.plusOneLastName || '', }; initial[guest.id] = guestData; if (guest.hasPlusOne) { setGroupHasPlusOne(true); } } initial.note = note || ''; return initial; } const { inputs, handleChange, clearForm, resetForm } = useForm( getInitialFormData ); if (!user || user.isLoggedIn === false) { return Loading...; } if (group?.guests?.length === 0) return

Loading...

; async function handleSubmit(groupId) { const keys = Object.keys(inputs); const guestData = []; // console.log(JSON.stringify(inputs)); keys.forEach((key, index) => { if (key !== 'note') { guestData.push({ id: key, ...inputs[key], }); } }); const body = { groupId, note: inputs.note, guests: guestData, }; try { const res = await fetchJson('/api/group', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify(body), }); if (res.message === 'SUCCESS') { setMessage( `Successfully submited your RSVP${ body.guests.length > 1 ? 's' : '' }. Don't forget to save the date!!` ); toggleModal(); } else { setErrorCount(errorCount + 1); setErrorMsg('Unable to RSVP Your Group'); } } catch (error) { // console.error('An unexpected error happened:', error); setErrorCount(errorCount + 1); setErrorMsg(error.data.message); } } return (
N & N | RSVP

Wedding SAYING I DO

{' '} Monday, June 3rd, 2030 at 5:00 PM

{' '} Wedding Location

{address}

{ e.preventDefault(); setLoading(true); await handleSubmit(group.id); setLoading(false); }} aria-busy={loading} disabled={loading} > {errorMsg &&

Error: {errorMsg}

} {errorMsg && errorCount > 3 && ( Support contact:{' '} name@example.com )}
RSVP Invitation {group.guests.map((guest) => ( ))}
Do you {groupHasPlusOne ? 'or your plus one ' : ''}have any dietary restrictions?
{group.guests.map((guest) => !guest.isPlusOne ? (

{guest.firstName} {guest.lastName} :