"use client"; import { useState } from "react"; import { createStripeConnectLink, refreshStripeConnectLink, disconnectStripeConnect, createStripeDashboardLink, getStripeConnectStatus, } from "@/actions/stripe-connect"; interface AdvancedPaymentsProps { brandId: string; initialStatus: { is_connected: boolean; account_id?: string; charges_enabled?: boolean; payouts_enabled?: boolean; details_submitted?: boolean; } | null; } // SVG Icons const CreditCardIcon = ({ className }: { className?: string }) => ( ); const ExternalLinkIcon = ({ className }: { className?: string }) => ( ); const AlertTriangleIcon = ({ className }: { className?: string }) => ( ); const CheckCircleIcon = ({ className }: { className?: string }) => ( ); const XCircleIcon = ({ className }: { className?: string }) => ( ); const LoaderIcon = ({ className }: { className?: string }) => ( ); const RefreshIcon = ({ className }: { className?: string }) => ( ); const UnlinkIcon = ({ className }: { className?: string }) => ( ); const ShieldIcon = ({ className }: { className?: string }) => ( ); const InfoIcon = ({ className }: { className?: string }) => ( ); const StoreIcon = ({ className }: { className?: string }) => ( ); const DollarIcon = ({ className }: { className?: string }) => ( ); export default function AdvancedPayments({ brandId, initialStatus }: AdvancedPaymentsProps) { const [status, setStatus] = useState(initialStatus ?? { is_connected: false }); const [loading, setLoading] = useState(false); const [action, setAction] = useState<"connect" | "refresh" | "dashboard" | "disconnect" | null>(null); const [error, setError] = useState(null); const [success, setSuccess] = useState(null); async function refreshStatus() { const result = await getStripeConnectStatus(brandId); if (!result.error) { setStatus(result); } } async function handleConnect() { setLoading(true); setAction("connect"); setError(null); setSuccess(null); const result = await createStripeConnectLink(brandId); if (!result.success || !result.url) { setError(result.error ?? "Failed to create Stripe account"); setLoading(false); setAction(null); return; } // Redirect to Stripe onboarding window.location.href = result.url; } async function handleRefresh() { setLoading(true); setAction("refresh"); setError(null); setSuccess(null); const result = await refreshStripeConnectLink(brandId); if (!result.success || !result.url) { setError(result.error ?? "Failed to refresh onboarding"); setLoading(false); setAction(null); return; } // Redirect to Stripe to continue onboarding window.location.href = result.url; } async function handleOpenDashboard() { setLoading(true); setAction("dashboard"); setError(null); setSuccess(null); const result = await createStripeDashboardLink(brandId); if (!result.success || !result.url) { setError(result.error ?? "Failed to open Stripe dashboard"); setLoading(false); setAction(null); return; } // Open Stripe dashboard in new tab window.open(result.url, "_blank"); setLoading(false); setAction(null); } async function handleDisconnect() { if (!confirm("Disconnect Stripe? Your brand store will no longer be able to accept payments until reconnected.")) { return; } setLoading(true); setAction("disconnect"); setError(null); setSuccess(null); const result = await disconnectStripeConnect(brandId); if (!result.success) { setError(result.error ?? "Failed to disconnect"); } else { setStatus({ is_connected: false }); setSuccess("Stripe disconnected successfully"); } setLoading(false); setAction(null); } const isFullyOnboarded = status.is_connected && status.charges_enabled && status.payouts_enabled && status.details_submitted; return (
{/* Info Banner - Two Stripe Systems */}

Brand Store Payments

This connects your brand's storefront to your own Stripe account so you can accept payments directly from your customers. This is separate from the Route Commerce SaaS subscription billing.

{/* Security Warning Banner */}

How Stripe Connect Works

  • You sign in to YOUR Stripe account — No API keys to manage or share.
  • Express accounts are pre-configured — Card payments and transfers enabled.
  • Stripe handles compliance — Identity verification and tax forms handled by Stripe.
  • Funds go directly to you — Payments deposit to your connected Stripe account.
  • 2-7 day payout schedule — Standard Stripe payout timing to your bank.
{/* Stripe Connect Status Card */}
{/* Card Header */}

Stripe Connect

Accept payments on your brand storefront

{/* Status Badge */} {status.is_connected ? (
{isFullyOnboarded ? ( ) : ( )} {isFullyOnboarded ? "Active" : "Incomplete"}
) : (
Not Connected
)}
{/* Card Body */}
{/* Account Info */} {status.account_id && (
Account: {status.account_id}
)} {/* Onboarding Status */} {status.is_connected && (
)} {/* Error/Success Messages */} {error && (
{error}
)} {success && (
{success}
)} {/* Action Buttons */}
{!status.is_connected ? ( ) : ( <> {!isFullyOnboarded && ( )} )}
{/* How It Works Section */} {!status.is_connected && (

Setup steps:

  1. Click "Connect with Stripe" to start
  2. Sign in to your Stripe account or create one
  3. Complete business verification in the Stripe form
  4. Once approved, start accepting payments on your store
)} {/* Active Banner */} {isFullyOnboarded && (

Ready to Accept Payments

Your Stripe account is fully set up. Payments from your brand storefront will be deposited directly to your Stripe account.

)}
); } function StatusIndicator({ label, enabled, description, }: { label: string; enabled?: boolean; description: string; }) { return (
{enabled ? ( ) : ( )}

{label} {enabled ? "Enabled" : "Pending"}

{description}

); }