import "./Profile.css"; import Nostrich from "nostrich.webp"; import { useEffect, useState } from "react"; import { FormattedMessage } from "react-intl"; import { useNavigate } from "react-router-dom"; import useEventPublisher from "Feed/EventPublisher"; import { useUserProfile } from "Hooks/useUserProfile"; import { openFile } from "Util"; import useFileUpload from "Upload"; import AsyncButton from "Element/AsyncButton"; import { mapEventToProfile, UserCache } from "Cache"; import useLogin from "Hooks/useLogin"; import AvatarEditor from "Element/AvatarEditor"; import Icon from "Icons/Icon"; import messages from "./messages"; export interface ProfileSettingsProps { avatar?: boolean; banner?: boolean; } export default function ProfileSettings(props: ProfileSettingsProps) { const navigate = useNavigate(); const { publicKey: id } = useLogin(); const user = useUserProfile(id ?? ""); const publisher = useEventPublisher(); const uploader = useFileUpload(); 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 [lud16, setLud16] = 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); setLud16(user.lud16); } }, [user]); async function saveProfile() { // copy user object and delete internal fields const userCopy = { ...user, name, display_name: displayName, about, picture, banner, website, nip05, lud16, } as Record; delete userCopy["loaded"]; delete userCopy["created"]; delete userCopy["pubkey"]; delete userCopy["npub"]; delete userCopy["deleted"]; delete userCopy["zapService"]; delete userCopy["isNostrAddressValid"]; console.debug(userCopy); if (publisher) { const ev = await publisher.metadata(userCopy); publisher.broadcast(ev); const newProfile = mapEventToProfile(ev); if (newProfile) { await UserCache.set(newProfile); } } } async function uploadFile() { const file = await openFile(); if (file) { console.log(file); const rsp = await uploader.upload(file, file.name); console.log(rsp); if (typeof rsp?.error === "string") { throw new Error(`Upload failed ${rsp.error}`); } return rsp.url; } } async function setNewBanner() { const rsp = await uploadFile(); if (rsp) { setBanner(rsp); } } function editor() { return (
:
setName(e.target.value)} />
:
setDisplayName(e.target.value)} />
:
:
setWebsite(e.target.value)} />
:
setNip05(e.target.value)} />
:
setLud16(e.target.value)} />
saveProfile()}>
); } function settings() { if (!id) return null; return ( <>
{(props.avatar ?? true) && (
:
setPicture(p)} />
)} {(props.banner ?? true) && (
:
setNewBanner()}>
)}
{editor()} ); } return (

{settings()}
); }