import { trpc } from "@rallly/backend"; import { useRouter } from "next/router"; import { useTranslation } from "next-i18next"; import React from "react"; import { usePostHog } from "@/utils/posthog"; import { Button } from "./button"; import { NewEventData, PollDetailsData, PollDetailsForm, PollOptionsData, PollOptionsForm, UserDetailsData, UserDetailsForm, } from "./forms"; import Steps from "./steps"; import { useUser } from "./user-provider"; type StepName = "eventDetails" | "options" | "userDetails"; const required = (v: T | undefined): T => { if (!v) { throw new Error("Required value is missing"); } return v; }; export interface CreatePollPageProps { title?: string; location?: string; description?: string; view?: "week" | "month"; } const Page: React.FunctionComponent = () => { const { t } = useTranslation("app"); const router = useRouter(); const session = useUser(); const steps: StepName[] = React.useMemo( () => session.user.isGuest ? ["eventDetails", "options", "userDetails"] : ["eventDetails", "options"], [session.user.isGuest], ); const [formData, setFormData] = React.useState({ currentStep: 0, }); React.useEffect(() => { const newStep = Math.min(steps.length - 1, formData.currentStep); if (newStep !== formData.currentStep) { setFormData((prevData) => ({ ...prevData, currentStep: newStep, })); } }, [formData.currentStep, steps.length]); const currentStepIndex = formData?.currentStep ?? 0; const currentStepName = steps[currentStepIndex]; const [isRedirecting, setIsRedirecting] = React.useState(false); const posthog = usePostHog(); const createPoll = trpc.polls.create.useMutation({ onSuccess: (res) => { setIsRedirecting(true); posthog?.capture("created poll", { pollId: res.id, numberOfOptions: formData.options?.options?.length, optionsView: formData?.options?.view, }); router.replace(`/admin/${res.urlId}`); }, }); const isBusy = isRedirecting || createPoll.isLoading; const handleSubmit = async ( data: PollDetailsData | PollOptionsData | UserDetailsData, ) => { if (currentStepIndex < steps.length - 1) { setFormData({ ...formData, currentStep: currentStepIndex + 1, [currentStepName]: data, }); } else { // last step const title = required(formData?.eventDetails?.title); await createPoll.mutateAsync({ title: title, location: formData?.eventDetails?.location, description: formData?.eventDetails?.description, user: session.user.isGuest ? { name: required(formData?.userDetails?.name), email: required(formData?.userDetails?.contact), } : undefined, timeZone: formData?.options?.timeZone, options: required(formData?.options?.options).map((option) => ({ startDate: option.type === "date" ? option.date : option.start, endDate: option.type === "timeSlot" ? option.end : undefined, })), }); } }; const handleChange = ( data: Partial, ) => { setFormData({ ...formData, currentStep: currentStepIndex, [currentStepName]: data, }); }; return (

{t("createNew")}

{(() => { switch (currentStepName) { case "eventDetails": return ( ); case "options": return ( ); case "userDetails": return ( ); } })()}
{currentStepIndex > 0 ? ( ) : null}
); }; export default Page;