import React, { useEffect, useState } from 'react'; import { useNavigate } from 'react-router-dom'; import { InviteModal } from '../components/onboarding-chain/invite-modal'; import { LoopChain } from '../components/onboarding-chain/loop-chain'; import { OnboardingTopBar } from '../components/onboarding-chain/onboarding-topbar'; import { PartnerCodeModal } from '../components/onboarding-chain/partner-code-modal'; import { SetupPaths } from '../components/onboarding-chain/setup-paths'; import { MONO, SANS } from '../components/signup-mirror/theme'; import { Spinner } from '../components/ui/Spinner'; import { useAppStateContext } from '../context/user.data.context'; import { useCopilot } from '../context/copilot.context'; import { recomaze_ai_personalization_env } from '../env'; import { isSignupMirrorUser } from '../lib/signup-mirror/access'; import { LOOP_STEPS, resolveBrandName, SETUP_CALL_URL, } from '../lib/onboarding-chain/content'; import { redeemPartnerCode, sendPartnerInvite, } from '../service/partner/partner.service'; import { completeSignupMirror } from '../service/payment/payment.service'; const LATE_DELAY = 1.62; const PageLoading = (): JSX.Element => (
); const OnboardingChain = (): JSX.Element => { const navigate = useNavigate(); const { token, clientId, user } = useAppStateContext(); const copilot = useCopilot(); const [modal, setModal] = useState(null); const [inviteSending, setInviteSending] = useState(false); const [inviteSent, setInviteSent] = useState(false); const [inviteSentTo, setInviteSentTo] = useState(''); const [redeemApplying, setRedeemApplying] = useState(false); const [redeemError, setRedeemError] = useState(undefined); useEffect(() => { if (!user) return; if (!isSignupMirrorUser(user)) { navigate('/dashboard', { replace: true }); return; } if (user.signup_mirror_completed_at) { navigate('/dashboard', { replace: true }); return; } if (user.launch_discount_status === 'ELIGIBLE') { navigate('/launch-discount', { replace: true }); } }, [user, navigate]); const brand = resolveBrandName( user?.name, user?.domain ?? recomaze_ai_personalization_env?.domain ); const complete = async (): Promise => { try { await completeSignupMirror(); } catch (error) { console.error(error); } }; const bookSetup = (): void => { window.open(SETUP_CALL_URL, '_blank', 'noopener,noreferrer'); }; const runYourself = async (): Promise => { await complete(); // Close the copilot so the numbered setup rail on /company-id isn't hidden // behind the auto-opened panel (it opens for every brand-new merchant). copilot.close(); navigate('/company-id'); }; const openCopilot = async (): Promise => { await complete(); copilot.open(); navigate('/dashboard'); }; const invite = async (email: string, message: string): Promise => { if (!token || inviteSending) return; setInviteSending(true); try { const res = await sendPartnerInvite({ email, message }); if (res?.success) { setInviteSentTo(res.sent_to ?? email); setInviteSent(true); await complete(); } } catch (inviteError) { console.error(inviteError); } finally { setInviteSending(false); } }; const redeem = async (code: string): Promise => { if (!token || redeemApplying) return; setRedeemApplying(true); setRedeemError(undefined); try { const res = await redeemPartnerCode({ code }); if (res?.success) { await complete(); navigate('/dashboard'); return; } setRedeemError(res?.reason ?? res?.error ?? "That code didn't work."); } catch (redeemErr) { console.error(redeemErr); setRedeemError("That code didn't work."); } finally { setRedeemApplying(false); } }; if (!token || !clientId) return ; return (
); }; export default OnboardingChain;