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 (
Welcome to Recomaze
Here's how Recomaze makes {brand} money
One loop, five steps. Not more traffic:{' '}
the traffic that brings your ideal customers
. It starts with your Company ID, defined once, read by everything.
How do you want to run it?
Four ways to get set up. Pick the one that fits how you work.
setModal('invite')}
onAgency={() => setModal('agency')}
/>
{modal === 'invite' && (
setModal(null)}
onDone={() => navigate('/dashboard')}
sending={inviteSending}
sent={inviteSent}
sentTo={inviteSentTo}
/>
)}
{modal === 'agency' && (
setModal(null)}
onNoCode={() => setModal(null)}
applying={redeemApplying}
error={redeemError}
/>
)}
);
};
export default OnboardingChain;