"use client";
import { Database } from "supabase/database.types";
import { BlockProps } 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) {
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),
},
),
);