import "./SettingsPage.css"; import Nostrich from "nostrich.jpg"; import { useEffect, useState } from "react"; import { useDispatch, useSelector } from "react-redux"; import { useNavigate } from "react-router-dom"; import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; import { faShop } from "@fortawesome/free-solid-svg-icons"; import { RootState } from "State/Store"; import { logout, setRelays } from "State/Login"; import useEventPublisher from "Feed/EventPublisher"; import useProfile from "Feed/ProfileFeed"; import VoidUpload from "Feed/VoidUpload"; import { hexToBech32, openFile } from "Util"; import Relay from "Element/Relay"; import Copy from "Element/Copy"; import { HexKey, UserMetadata } from "Nostr"; import { RelaySettings } from "Nostr/Connection"; import { MetadataCache } from "Db/User"; export default function SettingsPage() { const navigate = useNavigate(); const id = useSelector(s => s.login.publicKey); const privKey = useSelector(s => s.login.privateKey); const relays = useSelector>(s => s.login.relays); const dispatch = useDispatch(); const user = useProfile(id)?.get(id || ""); const publisher = useEventPublisher(); const [name, setName] = useState(); const [displayName, setDisplayName] = useState(); const [picture, setPicture] = useState(); const [banner, setBanner] = useState(); const [about, setAbout] = useState(); const [website, setWebsite] = useState(); const [nip05, setNip05] = useState(); const [lud06, setLud06] = useState(); const [lud16, setLud16] = useState(); const [newRelay, setNewRelay] = useState(); const avatarPicture = (picture?.length ?? 0) === 0 ? Nostrich : picture useEffect(() => { if (user) { setName(user.name); setDisplayName(user.display_name) setPicture(user.picture); setBanner(user.banner); setAbout(user.about); setWebsite(user.website); setNip05(user.nip05); setLud06(user.lud06); setLud16(user.lud16); } }, [user]); async function saveProfile() { // copy user object and delete internal fields let userCopy = { ...user, name, display_name: displayName, about, picture, banner, website, nip05, lud16 }; delete userCopy["loaded"]; delete userCopy["created"]; delete userCopy["pubkey"]; console.debug(userCopy); let ev = await publisher.metadata(userCopy); console.debug(ev); publisher.broadcast(ev); } async function uploadFile() { let file = await openFile(); if (file) { console.log(file); let rsp = await VoidUpload(file, file.name); if (!rsp?.ok) { throw "Upload failed, please try again later"; } return rsp.file; } } async function setNewAvatar() { const rsp = await uploadFile(); if (rsp) { setPicture(rsp.meta?.url ?? `https://void.cat/d/${rsp.id}`); } } async function setNewBanner() { const rsp = await uploadFile(); if (rsp) { setBanner(rsp.meta?.url ?? `https://void.cat/d/${rsp.id}`); } } async function saveRelays() { let ev = await publisher.saveRelays(); publisher.broadcast(ev); } function editor() { return (
Name:
setName(e.target.value)} />
Display name:
setDisplayName(e.target.value)} />
About:
Website:
setWebsite(e.target.value)} />
NIP-05:
setNip05(e.target.value)} />
navigate("/verification")}>   Buy
LN Address:
setLud16(e.target.value)} />
{ dispatch(logout()); navigate("/"); }}>Logout
saveProfile()}>Save
) } function addNewRelay() { if ((newRelay?.length ?? 0) > 0) { const parsed = new URL(newRelay!); const payload = { relays: { ...relays, [parsed.toString()]: { read: false, write: false } }, createdAt: Math.floor(new Date().getTime() / 1000) }; dispatch(setRelays(payload)) } } function addRelay() { return ( <>

Add Relays

setNewRelay(e.target.value)} />
addNewRelay()}>Add
) } function settings() { if (!id) return null; return ( <>

Settings

Avatar

setNewAvatar()}>Edit

Header

setNewBanner()}>Edit
{editor()} ) } return (
{settings()} {privKey && (

Private Key:

)}

Relays

{Object.keys(relays || {}).map(a => )}
saveRelays()}>Save
{addRelay()}
); }