import { type ReactNode, useMemo } from 'react';
import { useAccount } from 'wagmi';
import { Button } from '@/ui/Button';
import { ConnectWallet } from '@/wallet';
import {
type SignatureContextType,
useSignatureContext,
} from './SignatureProvider';
import { WithRenderProps } from '@/internal/types';
type SignatureButtonProps = WithRenderProps<{
/** CSS class to apply to the button */
className?: string;
/** Whether the button is disabled */
disabled?: boolean;
/** Text displayed on the button in pending state */
label?: ReactNode;
/** Text displayed when signature fails */
errorLabel?: ReactNode;
/** Text displayed after successful signature */
successLabel?: ReactNode;
/** Text displayed while waiting for signature */
pendingLabel?: ReactNode;
/** Text displayed when wallet is disconnected */
disconnectedLabel?: ReactNode;
/** Custom render function for complete control of button rendering */
render?: ({
label,
onClick,
context,
}: {
label: ReactNode;
onClick: () => void;
context: SignatureContextType;
}) => ReactNode;
}>;
export function SignatureButton({
className,
disabled = false,
label = 'Sign',
errorLabel = 'Try again',
successLabel = 'Signed',
pendingLabel = 'Signing...',
disconnectedLabel,
render,
}: SignatureButtonProps) {
const { address } = useAccount();
const context = useSignatureContext();
const {
handleSign,
lifecycleStatus: { statusName },
} = context;
const buttonLabel = useMemo(() => {
if (statusName === 'pending') return pendingLabel;
if (statusName === 'error') return errorLabel;
if (statusName === 'success') return successLabel;
return label;
}, [statusName, label, errorLabel, successLabel, pendingLabel]);
if (!address) return ;
if (render) {
return render({
label: buttonLabel,
onClick: handleSign,
context,
});
}
return (
);
}