'use client';
import { Spinner } from '@/internal/components/Spinner';
import { ErrorSvg } from '@/internal/svg/errorSvg';
import { SuccessSvg } from '@/internal/svg/successSvg';
import { useCallback, useMemo } from 'react';
import { useFundCardFundingUrl } from '../hooks/useFundCardFundingUrl';
import { FundCardSubmitButtonProps } from '../types';
import { FundButton } from './FundButton';
import { useFundContext } from './FundCardProvider';
export function FundCardSubmitButton({
children,
render,
}: FundCardSubmitButtonProps) {
const {
fundAmountFiat,
fundAmountCrypto,
submitButtonState,
setSubmitButtonState,
currency,
updateLifecycleStatus,
sessionToken,
} = useFundContext();
const fundingUrl = useFundCardFundingUrl();
const handleOnClick = useCallback(
() => setSubmitButtonState('loading'),
[setSubmitButtonState],
);
const handleOnPopupClose = useCallback(() => {
updateLifecycleStatus({ statusName: 'exit', statusData: undefined });
setSubmitButtonState('default');
}, [updateLifecycleStatus, setSubmitButtonState]);
const isButtonDisabled = useMemo(
() =>
(!fundAmountFiat || Number(fundAmountCrypto) === 0) &&
(!fundAmountCrypto || Number(fundAmountFiat) === 0),
[fundAmountCrypto, fundAmountFiat],
);
const buttonIcon = useMemo(() => {
switch (submitButtonState) {
case 'loading':
return '';
case 'success':
return ;
case 'error':
return ;
default:
return null;
}
}, [submitButtonState]);
const buttonTextContent = useMemo(() => {
switch (submitButtonState) {
case 'loading':
return '';
case 'success':
return 'Success';
case 'error':
return 'Something went wrong';
default:
return 'Buy';
}
}, [submitButtonState]);
const buttonContent = useMemo(() => {
if (submitButtonState === 'loading') {
return ;
}
return (
<>
{buttonIcon && (
{buttonIcon}
)}
{buttonTextContent}
>
);
}, [submitButtonState, buttonIcon, buttonTextContent]);
// FundButton accepts render prop or children but not both
if (render) {
return (
);
}
return (
{children || buttonContent}
);
}