'use client'; import { ReactNode, useCallback, useMemo } from 'react'; import { useGetFundingUrl } from '../../fund/hooks/useGetFundingUrl'; import { getFundingPopupSize } from '../../fund/utils/getFundingPopupSize'; import { useIcon } from '../../internal/hooks/useIcon'; import { openPopup } from '../../internal/utils/openPopup'; import { cn, pressable, text as themeText } from '../../styles/theme'; export type WalletDropdownFundLinkProps = { /** Optional className override for the element */ className?: string; /** Optional icon override */ icon?: ReactNode; /** Whether to open the funding flow in a tab or a popup window */ openIn?: 'popup' | 'tab'; /** * Note: popupSize is only respected when providing your own funding link, or when a Coinbase Smart Wallet is * connected. For any other wallet popupSize will be ignored as the Coinbase Onramp widget requires a fixed size * popup window. */ popupSize?: 'sm' | 'md' | 'lg'; /** Specifies the relationship between the current document and the linked document */ rel?: string; /** Where to open the target if `openIn` is set to tab */ target?: string; /** Optional text override */ text?: string; /** Optional funding URL override */ fundingUrl?: string; }; export function WalletDropdownFundLink({ className, fundingUrl, icon = 'fundWallet', openIn = 'popup', popupSize = 'md', rel, target, text = 'Fund wallet', }: WalletDropdownFundLinkProps) { // If we can't get a funding URL, this component will be a no-op and render a disabled link const fundingUrlToRender = fundingUrl ?? // eslint-disable-next-line react-hooks/rules-of-hooks useGetFundingUrl({ originComponentName: 'WalletDropdownFundLink', }); const iconSvg = useIcon({ icon }); const handleClick = useCallback( (e: React.MouseEvent) => { e.preventDefault(); if (fundingUrlToRender) { const { height, width } = getFundingPopupSize( popupSize, fundingUrlToRender, ); openPopup({ url: fundingUrlToRender, height, width, target, }); } }, [fundingUrlToRender, popupSize, target], ); const overrideClassName = cn( pressable.default, 'text-ock-foreground', // Disable hover effects if there is no funding URL !fundingUrlToRender && 'pointer-events-none', 'relative flex items-center px-4 py-3 w-full', className, ); const linkContent = useMemo( () => ( // We put disabled on the content wrapper rather than the button/link because we dont wan't to change the // background color of the dropdown item, just the text and icon
{iconSvg}
{text}
), [fundingUrlToRender, iconSvg, text], ); if (openIn === 'tab') { return ( {linkContent} ); } return ( ); }