import * as React from 'react'; import { useEffect, useState } from 'react'; import { useStatePersist } from 'use-state-persist'; import * as ReactDOM from 'react-dom'; import { broadcastToRelay, Connect, connectToRelay, ConnectURI, TimeRanges } from '../src/index'; import { QRCodeSVG } from 'qrcode.react'; import { getEventHash, getPublicKey, Event, nip19 } from 'nostr-tools'; const secretKey = "5acff99d1ad3e1706360d213fd69203312d9b5e91a2d5f2e06100cc6f686e5b3"; const connectURI = new ConnectURI({ target: getPublicKey(secretKey), relay: 'wss://nostr.vulpem.com', metadata: { name: 'Vulpem', description: 'Bitcoin company', url: 'https://vulpem.com', icons: ['https://vulpem.com/favicon.ico'], }, }); const App = () => { const [pubkey, setPubkey] = useStatePersist('@pubkey', ''); const [getPublicKeyReply, setGetPublicKeyReply] = useState(''); const [eventWithSig, setEvent] = useState({}); const [schnorrSig, setSchnorrSig] = useState(''); const [delegationSig, setDelegateSig] = useState(''); useEffect(() => { (async () => { const target = pubkey.length > 0 ? pubkey : undefined; const connect = new Connect({ secretKey, target, }); connect.events.on('connect', (pubkey: string) => { setPubkey(pubkey); }); connect.events.on('disconnect', () => { setEvent({}); setPubkey(''); setGetPublicKeyReply(''); }); await connect.init(); })(); }, []); const getPub = async () => { if (pubkey.length === 0) return; const connect = new Connect({ secretKey, target: pubkey, }); const pk = await connect.getPublicKey(); setGetPublicKeyReply(nip19.npubEncode(pk)); } const sendMessage = async () => { try { if (pubkey.length === 0) return; const connect = new Connect({ secretKey, target: pubkey, }); let event: Event = { kind: 1, pubkey: pubkey, created_at: Math.floor(Date.now() / 1000), tags: [], content: "Running Nostr Connect 🔌" }; event.id = getEventHash(event) event.sig = await connect.signEvent(event); const relay = await connectToRelay('wss://relay.damus.io'); await broadcastToRelay(relay, event, true); setEvent(event); } catch (error) { console.error(error); } } const getSchnorrSig = async () => { try { if (pubkey.length === 0) return; const connect = new Connect({ secretKey, target: pubkey, }); const sig = await connect.rpc.call({ target: pubkey, request: { method: 'sign_schnorr', params: ['Hello World'], } }); setSchnorrSig(sig); } catch (error) { console.error(error); } } const delegate = async () => { try { if (pubkey.length === 0) return; const connect = new Connect({ secretKey, target: pubkey, }); const sig = await connect.delegate( getPublicKey(secretKey), { kind: 1, until: TimeRanges.ONE_DAY, } ); setDelegateSig(sig); } catch (error) { console.error(error); } } const isConnected = () => { return pubkey.length > 0; } const disconnect = async () => { const connect = new Connect({ secretKey, target: pubkey, }); await connect.disconnect(); //cleanup setEvent({}); setPubkey(''); setGetPublicKeyReply(''); } const copyToClipboard = () => { navigator.clipboard.writeText(connectURI.toString()).then(undefined, function (err) { console.error('Async: Could not copy text: ', err); }); } const appEpehemeralPubKey = nip19.npubEncode(getPublicKey(secretKey)); return (
Nostr ID (ephemeral) {appEpehemeralPubKey}
Status {isConnected() ? '🟢 Connected' : '🔴 Disconnected'}