/** * Stripe Connect Onboarding Component * For paid-tier businesses to connect their Stripe account via Connect */ import React, { useState } from 'react'; import { useTranslation } from 'react-i18next'; 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 { t } = useTranslation(); 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 || t('payments.failedToStartOnboarding')); } }; 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 || t('payments.failedToRefreshLink')); } }; // Account type display const getAccountTypeLabel = () => { switch (connectAccount?.account_type) { case 'standard': return t('payments.standardConnect'); case 'express': return t('payments.expressConnect'); case 'custom': return t('payments.customConnect'); default: return t('payments.connect'); } }; return (
{/* Active Account Status */} {isActive && (

{t('payments.stripeConnected')}

{t('payments.stripeConnectedDesc')}

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

{t('payments.accountDetails')}

{t('payments.accountType')}: {getAccountTypeLabel()}
{t('payments.status')}: {connectAccount.status}
{t('payments.charges')}: {connectAccount.charges_enabled ? ( <> {t('payments.enabled')} ) : ( <> {t('payments.disabled')} )}
{t('payments.payouts')}: {connectAccount.payouts_enabled ? ( <> {t('payments.enabled')} ) : ( <> {t('payments.disabled')} )}
{connectAccount.stripe_account_id && (
{t('payments.accountId')}: {connectAccount.stripe_account_id}
)}
)} {/* Onboarding in Progress */} {isOnboarding && (

{t('payments.completeOnboarding')}

{t('payments.onboardingIncomplete')}

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

{t('payments.connectWithStripe')}

{t('payments.tierPaymentDescription', { tier })}

  • {t('payments.securePaymentProcessing')}
  • {t('payments.automaticPayouts')}
  • {t('payments.pciCompliance')}
)} {/* Error Display */} {error && (
{error}
)} {/* External Stripe Dashboard Link */} {isActive && ( {t('payments.openStripeDashboard')} )}
); }; export default ConnectOnboarding;