import Head from 'next/head';
import { useState } from 'react';
import styled, { keyframes } from 'styled-components';
import { unescape } from 'html-escaper';
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 Modal from '../../components/Modal';
import { handleUmamiEvent } from '../../utils/handleUmamiEvent';
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;
}
`;
const ModalContentStyles = styled.div`
display: flex;
flex-direction: column;
align-items: center;
font-size: 2rem;
text-align: center;
`;
export default function SingleGroupPage({ group }) {
const { guests, note, statusUpdatable } = 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 [showModal, setShowModal] = useState(false);
const address = 'Central Park, New York, New York, USA';
const openModal = () => setShowModal(true);
const closeModal = () => setShowModal(false);
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 } = useForm(getInitialFormData);
if (!user || user.isLoggedIn === false) {
return
Loading...
; async function handleSubmit(groupId) { const keys = Object.keys(inputs); const guestData = []; keys.forEach((key) => { 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), }); console.log('res.message', res.message); if (res.message === 'SUCCESS') { handleUmamiEvent('RSVP SUCCESS', 'success-rsvp'); setMessage( `Successfully submitted your RSVP${ body.guests.length > 1 ? 's' : '' }. Don't forget to save the date!!` ); openModal(); } else { handleUmamiEvent('RSVP FAILURE', 'failure-rsvp'); 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 ({address}
Error: {errorMsg}
} {errorMsg && errorCount > 3 && (Error: {errorMsg}
} {errorMsg && errorCount > 3 && ({message}
Saturday, June 25, 2022 at 5:00 PM