import React, { useState, useCallback } from "react"; import { loadConnectAndInitialize } from "@stripe/connect-js"; import { ConnectAccountOnboarding, ConnectComponentsProvider, } from "@stripe/react-connect-js"; import { stripeAPI } from "../services/api"; interface StripeConnectOnboardingProps { onComplete: () => void; onCancel: () => void; hasExistingAccount?: boolean; } const StripeConnectOnboarding: React.FC = ({ onComplete, onCancel, hasExistingAccount = false, }) => { const [loading, setLoading] = useState(false); const [error, setError] = useState(null); const [step, setStep] = useState<"start" | "creating" | "onboarding">( hasExistingAccount ? "onboarding" : "start" ); const [stripeConnectInstance, setStripeConnectInstance] = useState(null); const fetchClientSecret = useCallback(async () => { const response = await stripeAPI.createAccountSession(); return response.data.clientSecret; }, []); const initializeStripeConnect = useCallback(async () => { try { const publishableKey = process.env.REACT_APP_STRIPE_PUBLISHABLE_KEY; if (!publishableKey) { throw new Error("Stripe publishable key not configured"); } const instance = loadConnectAndInitialize({ publishableKey, fetchClientSecret, appearance: { overlays: "dialog", variables: { colorPrimary: "#0d6efd", colorBackground: "#ffffff", colorText: "#212529", colorDanger: "#dc3545", fontFamily: "system-ui, -apple-system, 'Segoe UI', Roboto, sans-serif", fontSizeBase: "20px", borderRadius: "8px", spacingUnit: "4px", }, }, }); setStripeConnectInstance(instance); } catch (err: any) { setError(err.message || "Failed to initialize Stripe"); setStep("start"); setLoading(false); } }, [fetchClientSecret]); const createStripeAccount = async () => { setLoading(true); setError(null); setStep("creating"); try { // Create the Stripe Connected Account await stripeAPI.createConnectedAccount(); // Initialize Stripe Connect for embedded onboarding await initializeStripeConnect(); setStep("onboarding"); setLoading(false); } catch (err: any) { setError( err.response?.data?.error || err.message || "Failed to set up earnings" ); setStep("start"); setLoading(false); } }; const startOnboardingForExistingAccount = async () => { setLoading(true); setError(null); try { await initializeStripeConnect(); setStep("onboarding"); setLoading(false); } catch (err: any) { setError(err.message || "Failed to initialize onboarding"); setLoading(false); } }; // If user already has an account, initialize immediately React.useEffect(() => { if (hasExistingAccount && step === "onboarding" && !stripeConnectInstance) { startOnboardingForExistingAccount(); } }, [hasExistingAccount]); const handleStartSetup = () => { createStripeAccount(); }; const handleOnboardingExit = () => { onComplete(); }; return (
{step === "onboarding" ? "Complete Your Earnings Setup" : "Start Receiving Earnings"}
{step === "start" && ( <>
Quick Setup
Takes about 5 minutes
Secure
Powered by Stripe and trusted by millions
Fast Deposits
In your bank in 2-7 business days
What to expect:
  • Verify your identity securely
  • Provide bank account details for deposits
{error && (
{error}
)} )} {step === "creating" && (
Loading...
Creating your earnings account...

Please wait while we set up your account

)} {step === "onboarding" && ( <> {!stripeConnectInstance ? (
Loading...
Loading onboarding form...
) : (
)} {error && (
{error}
)} )}
{step === "start" && ( <> )} {step === "creating" && (
Please don't close this window...
)} {step === "onboarding" && stripeConnectInstance && (
Your information is securely processed by Stripe
)}
); }; export default StripeConnectOnboarding;