"use client"; import { useSmoker, useToaster } from "components/Toast"; import { RSVP_Status, RSVPButtons, State, useRSVPNameState } from "."; import { createContext, useContext, useState } from "react"; import { useRSVPData } from "components/PageSWRDataProvider"; import { confirmPhoneAuthToken } from "actions/phone_auth/confirm_phone_auth_token"; import { submitRSVP } from "actions/phone_rsvp_to_event"; import { countryCodes } from "src/constants/countryCodes"; import { Checkbox } from "components/Checkbox"; import { ButtonPrimary, ButtonTertiary } from "components/Buttons"; import { Separator } from "components/Layout"; import { createPhoneAuthToken } from "actions/phone_auth/request_phone_auth_token"; import { Input, InputWithLabel } from "components/Input"; import { RequestHeadersContext } from "components/Providers/RequestHeadersProvider"; import { Popover } from "components/Popover"; import { theme } from "tailwind.config"; import { InfoSmall } from "components/Icons/InfoSmall"; export function ContactDetailsForm(props: { status: RSVP_Status; entityID: string; setState: (s: State) => void; setStatus: (s: RSVP_Status) => void; }) { let { status, entityID, setState, setStatus } = props; let focusWithinStyles = "focus-within:border-tertiary focus-within:outline-solid focus-within:outline-2 focus-within:outline-tertiary focus-within:outline-offset-1"; let toaster = useToaster(); let { data, mutate } = useRSVPData(); let [contactFormState, setContactFormState] = useState< { state: "details" } | { state: "confirm"; token: string } >({ state: "details" }); let { name, setName } = useRSVPNameState(); let [plus_ones, setPlusOnes] = useState( data?.rsvps?.find( (rsvp) => data.authToken && rsvp.entity === props.entityID && data.authToken.country_code === rsvp.country_code && data.authToken.phone_number === rsvp.phone_number, )?.plus_ones || 0, ); let requestHeaders = useContext(RequestHeadersContext); const [formState, setFormState] = useState({ country_code: countryCodes.find((c) => c[1].toUpperCase() === (requestHeaders.country || "US"))?.[2] || "1", phone_number: "", confirmationCode: "", }); let submit = async ( token: Awaited>, ) => { try { await submitRSVP({ status, name: name, entity: entityID, plus_ones, }); } catch (e) { //handle failed confirm return false; } mutate({ authToken: token, rsvps: [ ...(data?.rsvps || []).filter((r) => r.entity !== entityID), { name: name, status, plus_ones, entity: entityID, phone_number: token.phone_number, country_code: token.country_code, }, ], }); props.setState({ state: "default" }); return true; }; return contactFormState.state === "details" ? ( <>
{ e.preventDefault(); if (data?.authToken) { submit(data.authToken); toaster({ content: (
{status === "GOING" ? "Yay! You're Going!" : status === "MAYBE" ? "You're a Maybe" : "Sorry you can't make it D:"}
), type: "success", }); } else { let tokenId = await createPhoneAuthToken(formState); setContactFormState({ state: "confirm", token: tokenId }); } }} >
{formState.country_code !== "1" ? ( <> Messages to non-US/Canada numbers will be sent via{" "} WhatsApp ) : null}
setPlusOnes(parseInt(e.currentTarget.value))} onKeyDown={(e) => { if (e.key === "Backspace" && !e.currentTarget.value) e.preventDefault(); }} />

{ setState({ state: "default" }); }} > Back RSVP as{" "} {status === "GOING" ? "Going" : status === "MAYBE" ? "Maybe" : "Can't Go"}
) : ( setFormState((state) => ({ ...state, confirmationCode: value })) } /> ); } const ConfirmationForm = (props: { country_code: string; phoneNumber: string; value: string; token: string; status: RSVP_Status; submit: ( token: Awaited>, ) => Promise; onChange: (v: string) => void; }) => { let smoker = useSmoker(); let toaster = useToaster(); return (
{ e.preventDefault(); let rect = document .getElementById("rsvp-code-confirm-button") ?.getBoundingClientRect(); try { let token = await confirmPhoneAuthToken(props.token, props.value); props.submit(token); toaster({ content: (
{props.status === "GOING" ? "Yay! You're Going!" : props.status === "MAYBE" ? "You're a Maybe" : "Sorry you can't make it D:"}
), type: "success", }); } catch (error) { smoker({ alignOnMobile: "left", error: true, text: "invalid code!", position: { x: rect ? rect.left + (rect.right - rect.left) / 2 : 0, y: rect ? rect.top + 26 : 0, }, }); return; } }} > Confirm
); }; const ConsentPopover = (props: { country_code: string }) => { return ( }>
By RSVPing I to consent to receive {props.country_code === "1" ? "" : " WhatsApp"} messages from the event host, via Leaflet!
); };