'use client';
import { copyToClipboard } from '@/internal/utils/copyToClipboard';
import { useState } from 'react';
import { cn, pressable, text } from '../../styles/theme';
import type { AddressProps } from '../types';
import { getSlicedAddress } from '../utils/getSlicedAddress';
import { useIdentityContext } from './IdentityProvider';
export function Address({
address = null,
className,
isSliced = true,
hasCopyAddressOnClick = true,
}: AddressProps) {
const [copyText, setCopyText] = useState('Copy');
const { address: contextAddress } = useIdentityContext();
const accountAddress = address ?? contextAddress;
if (!accountAddress) {
console.error(
'Address: an Ethereum address must be provided to the Identity or Address component.',
);
return null;
}
const addressContent = isSliced
? getSlicedAddress(accountAddress)
: accountAddress;
// Non-interactive version
if (!hasCopyAddressOnClick) {
return (
{addressContent}
);
}
// Interactive version with copy functionality
const handleClick = async () => {
await copyToClipboard({
copyValue: accountAddress,
onSuccess: () => {
setCopyText('Copied');
setTimeout(() => setCopyText('Copy'), 2000);
},
onError: (err: unknown) => {
console.error('Failed to copy address:', err);
setCopyText('Failed to copy');
setTimeout(() => setCopyText('Copy'), 2000);
},
});
};
const handleKeyDown = (e: React.KeyboardEvent) => {
if (e.key === 'Enter' || e.key === ' ') {
e.preventDefault();
handleClick();
}
};
return (
{addressContent}
);
}