import { Dialog, DialogContent, DialogTrigger } from '@/components/ui/dialog' import { Drawer, DrawerContent, DrawerTrigger } from '@/components/ui/drawer' import { useScreenSize } from '@/providers/ScreenSizeProvider' import { QrCodeIcon } from 'lucide-react' import { nip19 } from 'nostr-tools' import { useCallback, useMemo, useState } from 'react' import { useTranslation } from 'react-i18next' import { toast } from 'sonner' import Nip05 from '../Nip05' import QrCode from '../QrCode' import UserAvatar from '../UserAvatar' import Username from '../Username' export default function NpubQrCode({ pubkey }: { pubkey: string }) { const { t } = useTranslation() const { isSmallScreen } = useScreenSize() const [open, setOpen] = useState(false) const npub = useMemo(() => { // Validate pubkey is a 64-character hex string before encoding if (!pubkey || !/^[0-9a-f]{64}$/i.test(pubkey)) return '' try { return nip19.npubEncode(pubkey) } catch { return '' } }, [pubkey]) const handleQrClick = useCallback(() => { navigator.clipboard.writeText(npub) toast.success(t('Copied npub to clipboard')) setOpen(false) }, [npub, t]) if (!npub) return null const trigger = ( ) const content = (