import React, {useState} from 'react' import useComputedState from 'use-computed-state' import { getPublicKey, getEventHash, serializeEvent, verifySignature, signEvent } from 'nostr-tools' import Item from '../components/item' export default function EventSigning({value}) { let evt = JSON.parse(value) let [privateKey, setPrivateKey] = useState( 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa' ) let privateKeyIsValid = useComputedState( () => privateKey.match(/^[a-f0-9]{64}$/), [privateKey] ) let publicKey = useComputedState( () => (privateKeyIsValid ? getPublicKey(privateKey) : null), [privateKeyIsValid] ) let signature = useComputedState(async () => { try { evt.pubkey = publicKey return await signEvent(evt, privateKey) } catch (err) { return null } }, [value, privateKey]) let isValidSignature = useComputedState(async () => { if (evt.id && evt.sig) { try { return await verifySignature(evt) } catch (err) { return false } } else { return null } }, [value]) return ( <> {serializeEvent(evt)} {getEventHash(evt)} {evt.sig ? ( {isValidSignature?.toString() || ''} ) : ( <> setPrivateKey(e.target.value.toLowerCase())} />{' '} {privateKeyIsValid ? 'valid' : 'invalid'} {publicKey} {privateKeyIsValid ? signature : ''} )} ) } EventSigning.match = value => { try { let evt = JSON.parse(value) return evt.kind && evt.content && evt.tags } catch (err) { /**/ } return false }