"use client"; import { Database } from "supabase/database.types"; import { BlockProps, BlockLayout } from "components/Blocks/Block"; import { useState } from "react"; import { submitRSVP } from "actions/phone_rsvp_to_event"; import { useRSVPData } from "components/PageSWRDataProvider"; import { useEntitySetContext } from "components/EntitySetProvider"; import { ButtonSecondary } from "components/Buttons"; import { create } from "zustand"; import { combine, createJSONStorage, persist } from "zustand/middleware"; import { useUIState } from "src/useUIState"; import { theme } from "tailwind.config"; import { useToaster } from "components/Toast"; import { ContactDetailsForm } from "./ContactDetailsForm"; import styles from "./RSVPBackground.module.css"; import { Attendees } from "./Atendees"; import { SendUpdateButton } from "./SendUpdate"; export type RSVP_Status = Database["public"]["Enums"]["rsvp_status"]; let Statuses = ["GOING", "NOT_GOING", "MAYBE"]; export type State = | { state: "default"; } | { state: "contact_details"; status: RSVP_Status }; export function RSVPBlock( props: BlockProps & { areYouSure?: boolean; setAreYouSure?: (value: boolean) => void; }, ) { let isSelected = useUIState((s) => s.selectedBlocks.find((b) => b.value === props.entityID), ); return ( ); } function RSVPForm(props: { entityID: string }) { let [state, setState] = useState({ state: "default" }); let { permissions } = useEntitySetContext(); let { data, mutate } = useRSVPData(); let setStatus = (status: RSVP_Status) => { setState({ status, state: "contact_details" }); }; let [editing, setEditting] = useState(false); let rsvpStatus = data?.rsvps?.find( (rsvp) => data.authToken && rsvp.entity === props.entityID && data.authToken.country_code === rsvp.country_code && data.authToken.phone_number === rsvp.phone_number, )?.status; // IF YOU HAVE ALREADY RSVP'D if (rsvpStatus && !editing) return ( <> {permissions.write && } { setEditting(true); }} />
); // IF YOU HAVEN'T RSVP'D if (state.state === "default") return ( <> {permissions.write && } ); // IF YOU ARE CURRENTLY CONFIRMING YOUR CONTACT DETAILS if (state.state === "contact_details") return ( <> { if (newState.state === "default" && editing) setEditting(false); setState(newState); }} entityID={props.entityID} /> ); } export const RSVPButtons = (props: { setStatus: (status: RSVP_Status) => void; status: RSVP_Status | undefined; }) => { return (
props.setStatus("MAYBE")} > Maybe props.setStatus("GOING")} > Going! props.setStatus("NOT_GOING")} > Can't Go
); }; function YourRSVPStatus(props: { entityID: string; compact?: boolean; setEditting: (e: boolean) => void; }) { let { data, mutate } = useRSVPData(); let { name } = useRSVPNameState(); let toaster = useToaster(); let existingRSVP = data?.rsvps?.find( (rsvp) => data.authToken && rsvp.entity === props.entityID && data.authToken.phone_number === rsvp.phone_number, ); let rsvpStatus = existingRSVP?.status; let updateStatus = async (status: RSVP_Status) => { if (!data?.authToken) return; await submitRSVP({ status, name: name, entity: props.entityID, plus_ones: existingRSVP?.plus_ones || 0, }); mutate({ authToken: data.authToken, rsvps: [ ...(data?.rsvps || []).filter((r) => r.entity !== props.entityID), { name: name, status, entity: props.entityID, phone_number: data.authToken.phone_number, country_code: data.authToken.country_code, plus_ones: existingRSVP?.plus_ones || 0, }, ], }); }; return (
{rsvpStatus !== undefined && { GOING: `You're Going!`, MAYBE: "You're a Maybe", NOT_GOING: "Can't Make It", }[rsvpStatus]}
{existingRSVP?.plus_ones && existingRSVP?.plus_ones > 0 ? (
+{existingRSVP?.plus_ones}
) : null}
); } const RSVPBackground = () => { return (
); }; export let useRSVPNameState = create( persist( combine({ name: "" }, (set) => ({ setName: (name: string) => set({ name }), })), { name: "rsvp-name", storage: createJSONStorage(() => localStorage), }, ), );