'use client'; import React, { useState, useEffect } from 'react'; import { useOrg } from '@components/Contexts/OrgContext'; import { SiStripe } from '@icons-pack/react-simple-icons' import { useLHSession } from '@components/Contexts/LHSessionContext'; import { getPaymentConfigs, initializePaymentConfig, updatePaymentConfig, deletePaymentConfig, updateStripeAccountID, getStripeOnboardingLink } from '@services/payments/payments'; import FormLayout, { ButtonBlack, Input, Textarea, FormField, FormLabelAndMessage, Flex } from '@components/Objects/StyledElements/Form/Form'; import { AlertTriangle, BarChart2, Check, Coins, CreditCard, Edit, ExternalLink, Info, Loader2, RefreshCcw, Trash2, UnplugIcon } from 'lucide-react'; import toast from 'react-hot-toast'; import useSWR, { mutate } from 'swr'; import Modal from '@components/Objects/StyledElements/Modal/Modal'; import ConfirmationModal from '@components/Objects/StyledElements/ConfirmationModal/ConfirmationModal'; import { Button } from '@components/ui/button'; import { Alert, AlertDescription, AlertTitle } from '@components/ui/alert'; import { useRouter } from 'next/navigation'; import { getUriWithoutOrg } from '@services/config/config'; const PaymentsConfigurationPage: React.FC = () => { const org = useOrg() as any; const session = useLHSession() as any; const router = useRouter(); const access_token = session?.data?.tokens?.access_token; const { data: paymentConfigs, error, isLoading } = useSWR( () => (org && access_token ? [`/payments/${org.id}/config`, access_token] : null), ([url, token]) => getPaymentConfigs(org.id, token) ); const stripeConfig = paymentConfigs?.find((config: any) => config.provider === 'stripe'); const [isModalOpen, setIsModalOpen] = useState(false); const [isOnboarding, setIsOnboarding] = useState(false); const [isOnboardingLoading, setIsOnboardingLoading] = useState(false); const enableStripe = async () => { try { setIsOnboarding(true); const newConfig = { provider: 'stripe', enabled: true }; const config = await initializePaymentConfig(org.id, newConfig, 'stripe', access_token); toast.success('Stripe enabled successfully'); mutate([`/payments/${org.id}/config`, access_token]); } catch (error) { console.error('Error enabling Stripe:', error); toast.error('Failed to enable Stripe'); } finally { setIsOnboarding(false); } }; const editConfig = async () => { setIsModalOpen(true); }; const deleteConfig = async () => { try { await deletePaymentConfig(org.id, stripeConfig.id, access_token); toast.success('Stripe configuration deleted successfully'); mutate([`/payments/${org.id}/config`, access_token]); } catch (error) { console.error('Error deleting Stripe configuration:', error); toast.error('Failed to delete Stripe configuration'); } }; const handleStripeOnboarding = async () => { try { setIsOnboardingLoading(true); const { connect_url } = await getStripeOnboardingLink(org.id, access_token, getUriWithoutOrg('/payments/stripe/connect/oauth')); window.open(connect_url, '_blank'); } catch (error) { console.error('Error getting onboarding link:', error); toast.error('Failed to start Stripe onboarding'); } finally { setIsOnboardingLoading(false); } }; if (isLoading) { return
Loading...
; } if (error) { return
Error loading payment configuration
; } return (

Payments Configuration

Manage your organization payments configuration

About the Stripe Integration
  • Accept payments for courses and subscriptions
  • Manage recurring billing and subscriptions
  • Handle multiple currencies and payment methods
  • Access detailed payment analytics
Learn more about Stripe
{stripeConfig ? (
Stripe {stripeConfig.provider_specific_id && stripeConfig.active ? (
Connected
) : (
Not Connected
)}
{stripeConfig.provider_specific_id ? `Linked Account: ${stripeConfig.provider_specific_id}` : 'Account ID not configured'}
{(!stripeConfig.provider_specific_id || !stripeConfig.active) && ( )} Remove Connection } functionToExecute={deleteConfig} status="warning" />
) : ( )}
{stripeConfig && ( setIsModalOpen(false)} /> )}
); }; interface EditStripeConfigModalProps { orgId: number; configId: string; accessToken: string; isOpen: boolean; onClose: () => void; } const EditStripeConfigModal: React.FC = ({ orgId, configId, accessToken, isOpen, onClose }) => { const [stripeAccountId, setStripeAccountId] = useState(''); useEffect(() => { const fetchConfig = async () => { try { const config = await getPaymentConfigs(orgId, accessToken); const stripeConfig = config.find((c: any) => c.id === configId); if (stripeConfig && stripeConfig.provider_specific_id) { setStripeAccountId(stripeConfig.provider_specific_id || ''); } } catch (error) { console.error('Error fetching Stripe configuration:', error); toast.error('Failed to load existing configuration'); } }; if (isOpen) { fetchConfig(); } }, [isOpen, orgId, configId, accessToken]); const handleSubmit = async () => { try { const stripe_config = { stripe_account_id: stripeAccountId, }; await updateStripeAccountID(orgId, stripe_config, accessToken); toast.success('Configuration updated successfully'); mutate([`/payments/${orgId}/config`, accessToken]); onClose(); } catch (error) { console.error('Error updating config:', error); toast.error('Failed to update configuration'); } }; return ( setStripeAccountId(e.target.value)} placeholder="acct_..." /> Save } /> ); }; export default PaymentsConfigurationPage;