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 (
{data.display_name}
@{data.username}