'use client'; import { RelayContext } from '@components/relaysProvider'; import { createAccount } from '@utils/storage'; import { EyeClose, EyeEmpty } from 'iconoir-react'; import Image from 'next/image'; import { useRouter } from 'next/navigation'; import { generatePrivateKey, getEventHash, getPublicKey, nip19, signEvent } from 'nostr-tools'; import { useCallback, useContext, useMemo, useState } from 'react'; import { Config, names, uniqueNamesGenerator } from 'unique-names-generator'; const config: Config = { dictionaries: [names], }; export default function Page() { const router = useRouter(); const [pool, relays]: any = useContext(RelayContext); const [type, setType] = useState('password'); const [loading, setLoading] = useState(false); const privkey = useMemo(() => generatePrivateKey(), []); const name = useMemo(() => uniqueNamesGenerator(config).toString(), []); const pubkey = getPublicKey(privkey); const npub = nip19.npubEncode(pubkey); const nsec = nip19.nsecEncode(privkey); // auto-generated profile metadata const metadata: any = useMemo( () => ({ display_name: name, name: name, username: name.toLowerCase(), picture: 'https://void.cat/d/KmypFh2fBdYCEvyJrPiN89.webp', }), [name] ); // toggle privatek key const showPrivateKey = () => { if (type === 'password') { setType('text'); } else { setType('password'); } }; // create account and broadcast to all relays const submit = useCallback(async () => { setLoading(true); // build event const event: any = { content: JSON.stringify(metadata), created_at: Math.floor(Date.now() / 1000), kind: 0, pubkey: pubkey, tags: [], }; event.id = getEventHash(event); event.sig = signEvent(event, privkey); // insert to database createAccount(pubkey, privkey, metadata); // broadcast pool.publish(event, relays); // redirect to next step router.push(`/onboarding/create/${pubkey}/${privkey}`); }, [pool, pubkey, privkey, metadata, relays, router]); return (
{metadata.display_name}
@{metadata.username}