import BaseLayout from '@layouts/base'; import OnboardingLayout from '@layouts/onboarding'; 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 { motion } from 'framer-motion'; import Image from 'next/image'; import { useRouter } from 'next/router'; import { generatePrivateKey, getEventHash, getPublicKey, nip19, signEvent } from 'nostr-tools'; import { JSXElementConstructor, ReactElement, ReactFragment, ReactPortal, 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 { 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); 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] ); const insertDB = useCallback(async () => { await db.execute( `INSERT INTO accounts (id, privkey, npub, nsec, metadata) VALUES ("${pubKey}", "${privKey}", "${npub}", "${nsec}", '${JSON.stringify( data )}')` ); }, [data, db, npub, nsec, privKey, pubKey]); const createAccount = async () => { 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); 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, pubkey: pubKey, }); // redirect to pre-follow setTimeout(() => { setLoading(false); router.push('/onboarding/create/pre-follows'); }, 1500); }) .catch(console.error); }; return (
{/* spacer */}
Create new key Lume will generate key with default profile for you, you can edit it later, and please store your key safely so you can restore your account or use other client

{data.display_name}

@{data.username}

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