import type { FunctionComponent } from "react"; import { Suspense, useEffect, useState } 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 { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; import { faQuestionCircle } from "@fortawesome/pro-solid-svg-icons"; import db from "db"; import setTwilioApiFields from "../../mutations/set-twilio-api-fields"; import OnboardingLayout from "../../components/onboarding-layout"; import HelpModal from "../../components/help-modal"; import useCurrentUser from "../../../core/hooks/use-current-user"; type Form = { twilioAccountSid: string; twilioAuthToken: string; }; const StepTwo: BlitzPage = () => { const { register, handleSubmit, setValue, formState: { isSubmitting }, } = useForm
(); const router = useRouter(); const { organization } = useCurrentUser(); const [setTwilioApiFieldsMutation] = useMutation(setTwilioApiFields); const [isHelpModalOpen, setIsHelpModalOpen] = useState(false); useEffect(() => { setValue("twilioAuthToken", organization?.twilioAuthToken ?? ""); setValue("twilioAccountSid", organization?.twilioAccountSid ?? ""); }, [setValue, organization?.twilioAuthToken, organization?.twilioAccountSid]); const onSubmit = handleSubmit(async ({ twilioAccountSid, twilioAuthToken }) => { if (isSubmitting) { return; } await setTwilioApiFieldsMutation({ twilioAccountSid, twilioAuthToken, }); await router.push(Routes.StepThree()); }); return ( <>
Shellphone needs some informations about your Twilio account to securely use your phone numbers.
setIsHelpModalOpen(false)} isHelpModalOpen={isHelpModalOpen} /> ); }; StepTwo.getLayout = (page) => { return ( {page} ); }; const StepTwoLayout: FunctionComponent = ({ children }) => { const { organization } = useCurrentUser(); const initialAuthToken = organization?.twilioAuthToken ?? ""; const initialAccountSid = organization?.twilioAccountSid ?? ""; 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: { organizationId: session.orgId } }); if (phoneNumber) { await session.$setPublicData({ hasCompletedOnboarding: true }); return { redirect: { destination: Routes.Messages().pathname, permanent: false, }, }; } return { props: {} }; }; export default StepTwo;