import BaseLayout from '@layouts/base'; import { DatabaseContext } from '@components/contexts/database'; import { RelayContext } from '@components/contexts/relay'; import { EyeClosedIcon, EyeOpenIcon } from '@radix-ui/react-icons'; import { useLocalStorage, writeStorage } from '@rehooks/local-storage'; import Image from 'next/image'; import { useRouter } from 'next/router'; import { generatePrivateKey, getEventHash, getPublicKey, nip19, signEvent } from 'nostr-tools'; import { JSXElementConstructor, ReactElement, ReactFragment, ReactPortal, 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 { db }: any = useContext(DatabaseContext); const relayPool: any = useContext(RelayContext); const [relays] = useLocalStorage('relays'); const [type, setType] = useState('password'); const [loading, setLoading] = useState(false); const [privKey] = useState(() => generatePrivateKey()); const [name] = useState(() => uniqueNamesGenerator(config).toString()); const pubKey = getPublicKey(privKey); const npub = nip19.npubEncode(pubKey); const nsec = nip19.nsecEncode(privKey); // toggle privatek key const showPrivateKey = () => { if (type === 'password') { setType('text'); } else { setType('password'); } }; // auto-generated profile const data = useMemo( () => ({ display_name: name, name: name, username: name.toLowerCase(), picture: 'https://bafybeidfsbrzqbvontmucteomoz2rkrxugu462l5hyhh6uioslkfzzs4oq.ipfs.w3s.link/avatar-11.png', banner: 'https://bafybeiacwit7hjmdefqggxqtgh6ht5dhth7ndptwn2msl5kpkodudsr7py.ipfs.w3s.link/banner-1.jpg', }), [name] ); // insert to database const insertDB = async () => { await db.execute( `INSERT INTO accounts (id, privkey, npub, nsec, metadata) VALUES ("${pubKey}", "${privKey}", "${npub}", "${nsec}", '${JSON.stringify( data )}')` ); }; // build event and broadcast to all relays const createAccount = () => { setLoading(true); // build event const event: any = { content: JSON.stringify(data), created_at: Math.floor(Date.now() / 1000), kind: 0, pubkey: pubKey, tags: [], }; event.id = getEventHash(event); event.sig = signEvent(event, privKey); // insert to database then broadcast insertDB() .then(() => { // publish to relays relayPool.publish(event, relays); // set currentUser in global state writeStorage('current-user', { metadata: JSON.stringify(data), npub: npub, privkey: privKey, id: pubKey, }); // redirect to pre-follow setTimeout(() => { setLoading(false); router.push('/onboarding/create/step-2'); }, 1500); }) .catch(console.error); }; return (

Create new account

{data.display_name}

@{data.username}

{loading === true ? ( ) : ( )}
); } Page.getLayout = function getLayout( page: | string | number | boolean | ReactElement> | ReactFragment | ReactPortal ) { return {page}; };