/** * Stripe Connect Onboarding Component * For paid-tier businesses to connect their Stripe account via Connect */ import React, { useState } from 'react'; import { ExternalLink, CheckCircle, AlertCircle, Loader2, RefreshCw, CreditCard, Wallet, } from 'lucide-react'; import { ConnectAccountInfo } from '../api/payments'; import { useConnectOnboarding, useRefreshConnectLink } from '../hooks/usePayments'; interface ConnectOnboardingProps { connectAccount: ConnectAccountInfo | null; tier: string; onSuccess?: () => void; } const ConnectOnboarding: React.FC = ({ connectAccount, tier, onSuccess, }) => { const [error, setError] = useState(null); const onboardingMutation = useConnectOnboarding(); const refreshLinkMutation = useRefreshConnectLink(); const isActive = connectAccount?.status === 'active' && connectAccount?.charges_enabled; const isOnboarding = connectAccount?.status === 'onboarding' || (connectAccount && !connectAccount.onboarding_complete); const needsOnboarding = !connectAccount; const getReturnUrls = () => { const baseUrl = window.location.origin; return { refreshUrl: `${baseUrl}/payments?connect=refresh`, returnUrl: `${baseUrl}/payments?connect=complete`, }; }; const handleStartOnboarding = async () => { setError(null); try { const { refreshUrl, returnUrl } = getReturnUrls(); const result = await onboardingMutation.mutateAsync({ refreshUrl, returnUrl }); // Redirect to Stripe onboarding window.location.href = result.url; } catch (err: any) { setError(err.response?.data?.error || 'Failed to start onboarding'); } }; const handleRefreshLink = async () => { setError(null); try { const { refreshUrl, returnUrl } = getReturnUrls(); const result = await refreshLinkMutation.mutateAsync({ refreshUrl, returnUrl }); // Redirect to continue onboarding window.location.href = result.url; } catch (err: any) { setError(err.response?.data?.error || 'Failed to refresh onboarding link'); } }; // Account type display const getAccountTypeLabel = () => { switch (connectAccount?.account_type) { case 'standard': return 'Standard Connect'; case 'express': return 'Express Connect'; case 'custom': return 'Custom Connect'; default: return 'Connect'; } }; return (
{/* Active Account Status */} {isActive && (

Stripe Connected

Your Stripe account is connected and ready to accept payments.

)} {/* Account Details */} {connectAccount && (

Account Details

Account Type: {getAccountTypeLabel()}
Status: {connectAccount.status}
Charges: {connectAccount.charges_enabled ? ( <> Enabled ) : ( <> Disabled )}
Payouts: {connectAccount.payouts_enabled ? ( <> Enabled ) : ( <> Disabled )}
{connectAccount.stripe_account_id && (
Account ID: {connectAccount.stripe_account_id}
)}
)} {/* Onboarding in Progress */} {isOnboarding && (

Complete Onboarding

Your Stripe Connect account setup is incomplete. Click below to continue the onboarding process.

)} {/* Start Onboarding */} {needsOnboarding && (

Connect with Stripe

As a {tier} tier business, you'll use Stripe Connect to accept payments. This provides a seamless payment experience for your customers while the platform handles payment processing.

  • Secure payment processing
  • Automatic payouts to your bank account
  • PCI compliance handled for you
)} {/* Error Display */} {error && (
{error}
)} {/* External Stripe Dashboard Link */} {isActive && ( Open Stripe Dashboard )}
); }; export default ConnectOnboarding;