import type { FunctionComponent } from "react"; import { Suspense, useEffect } from "react"; import type { BlitzPage, GetServerSideProps } from "blitz"; import { getSession, Routes, useMutation, useRouter } from "blitz"; import clsx from "clsx"; import { useForm } from "react-hook-form"; import db from "db"; import setTwilioApiFields from "../../mutations/set-twilio-api-fields"; import OnboardingLayout from "../../components/onboarding-layout"; import useCurrentCustomer from "../../../core/hooks/use-current-customer"; type Form = { twilioAccountSid: string; twilioAuthToken: string; }; const StepTwo: BlitzPage = () => { const { register, handleSubmit, setValue, formState: { isSubmitting }, } = useForm
(); const router = useRouter(); const { customer } = useCurrentCustomer(); const [setTwilioApiFieldsMutation] = useMutation(setTwilioApiFields); useEffect(() => { setValue("twilioAuthToken", customer?.authToken ?? ""); setValue("twilioAccountSid", customer?.accountSid ?? ""); }, [setValue, customer?.authToken, customer?.accountSid]); const onSubmit = handleSubmit(async ({ twilioAccountSid, twilioAuthToken }) => { if (isSubmitting) { return; } await setTwilioApiFieldsMutation({ twilioAccountSid, twilioAuthToken, }); await router.push(Routes.StepThree()); }); return (
); }; StepTwo.getLayout = (page) => { return ( {page} ); }; const StepTwoLayout: FunctionComponent = ({ children }) => { const { customer } = useCurrentCustomer(); const initialAuthToken = customer?.authToken ?? ""; const initialAccountSid = customer?.accountSid ?? ""; const hasTwilioCredentials = initialAccountSid.length > 0 && initialAuthToken.length > 0; return ( {children} ); }; StepTwo.authenticate = { redirectTo: Routes.SignIn() }; export const getServerSideProps: GetServerSideProps = async ({ req, res }) => { const session = await getSession(req, res); if (!session.userId) { await session.$revoke(); return { redirect: { destination: Routes.Home().pathname, permanent: false, }, }; } const phoneNumber = await db.phoneNumber.findFirst({ where: { customerId: session.userId } }); if (phoneNumber) { await session.$setPublicData({ hasCompletedOnboarding: true }); return { redirect: { destination: Routes.Messages().pathname, permanent: false, }, }; } return { props: {} }; }; export default StepTwo;