'use client'; import { useEffect, useMemo } from 'react'; import { useAnalytics } from '../../core/analytics/hooks/useAnalytics'; import { CheckoutEvent } from '../../core/analytics/types'; import { Spinner } from '../../internal/components/Spinner'; import { useIcon } from '../../internal/hooks/useIcon'; import { cn, pressable, text as styleText } from '../../styles/theme'; import type { CheckoutButtonProps } from '../types'; import { useCheckoutContext } from './CheckoutProvider'; import { CHECKOUT_LIFECYCLE_STATUS } from '../constants'; /** * @deprecated The component and its related components and hooks are deprecated * and will be removed in a future version. We recommend looking at Base Pay for similar functionality. * @see {@link https://docs.base.org/base-account/guides/accept-payments} */ export function CheckoutButton({ className, coinbaseBranded, disabled, icon, text = 'Pay', }: CheckoutButtonProps) { if (coinbaseBranded) { icon = 'coinbasePay'; text = 'Pay'; } const { lifecycleStatus, onSubmit } = useCheckoutContext(); const iconSvg = useIcon({ icon }); const { sendAnalytics } = useAnalytics(); const isLoading = lifecycleStatus?.statusName === CHECKOUT_LIFECYCLE_STATUS.PENDING; const isFetchingData = lifecycleStatus?.statusName === CHECKOUT_LIFECYCLE_STATUS.FETCHING_DATA; const isDisabled = disabled || isLoading || isFetchingData; const buttonText = useMemo(() => { if (lifecycleStatus?.statusName === CHECKOUT_LIFECYCLE_STATUS.SUCCESS) { return 'View payment details'; } return text; }, [lifecycleStatus?.statusName, text]); const shouldRenderIcon = buttonText === text && iconSvg; useEffect(() => { if ( lifecycleStatus?.statusName === CHECKOUT_LIFECYCLE_STATUS.SUCCESS && lifecycleStatus.statusData ) { const { transactionReceipts, chargeId } = lifecycleStatus.statusData; const transactionHash = transactionReceipts?.[0]?.transactionHash; if (transactionHash && chargeId) { sendAnalytics(CheckoutEvent.CheckoutSuccess, { chargeHandlerId: chargeId, transactionHash, }); } } }, [lifecycleStatus, sendAnalytics]); return ( ); }