From ae5b1612dbe563b31dc918c5d68a5ada057568a8 Mon Sep 17 00:00:00 2001 From: "plebeius.eth" Date: Sat, 29 Jul 2023 21:40:03 +0200 Subject: [PATCH] implement changing account address to ENS name --- src/components/modals/SettingsModal.jsx | 161 +++++++++++++++--- .../styled/modals/SettingsModal.styled.jsx | 16 +- 2 files changed, 145 insertions(+), 32 deletions(-) diff --git a/src/components/modals/SettingsModal.jsx b/src/components/modals/SettingsModal.jsx index dbbe614d..b2b3183b 100755 --- a/src/components/modals/SettingsModal.jsx +++ b/src/components/modals/SettingsModal.jsx @@ -1,7 +1,7 @@ import React, { useState, useEffect, useRef } from "react"; import { Link, useLocation, useNavigate } from "react-router-dom"; import Modal from "react-modal"; -import { deleteCaches, exportAccount, importAccount, setAccount, setActiveAccount, useAccount, useAccounts } from "@plebbit/plebbit-react-hooks"; +import { deleteCaches, exportAccount, importAccount, setAccount, setActiveAccount, useAccount, useAccounts, useResolvedAuthorAddress } from "@plebbit/plebbit-react-hooks"; import { StyledModal } from "../styled/modals/SettingsModal.styled"; import useError from "../../hooks/useError"; import useSuccess from "../../hooks/useSuccess"; @@ -22,6 +22,9 @@ const SettingsModal = ({ isOpen, closeModal }) => { const location = useLocation(); const [expanded, setExpanded] = useState([]); const [accountJson, setAccountJson] = useState(null); + const [copyStatus, setCopyStatus] = useState(false); + const [ensName, setEnsName] = useState(''); + const [checkedENS, setCheckedENS] = useState(false); const [, setNewErrorMessage] = useError(); const [, setNewSuccessMessage] = useSuccess(); @@ -37,6 +40,52 @@ const SettingsModal = ({ isOpen, closeModal }) => { const dataPathRef = useRef(); const importRef = useRef(); const nameRef = useRef(); + const ensRef = useRef(); + + const author = {...account?.author, address: ensName}; + const { resolvedAddress, state } = useResolvedAuthorAddress({ author, cache: false }); + + + useEffect(() => { + if (checkedENS && resolvedAddress && state === 'succeeded') { + setCheckedENS(false); + } + }, [checkedENS, state, resolvedAddress]); + + + + const handleENSChange = () => { + const newEnsName = ensRef.current.value; + setEnsName(newEnsName); + }; + + const handleENSCheck = () => { + const newEnsName = ensRef.current.value; + setEnsName(newEnsName); + setCheckedENS(true); + }; + + const handleENSSave = async () => { + if (resolvedAddress === account?.signer?.address) { + try { + await setAccount({ + ...account, + author: { + ...account?.author, + address: ensName, + }, + }); + setNewSuccessMessage("ENS Name Saved"); + + } catch (error) { + setNewErrorMessage(error.message); + console.log(error); + } + } else if (resolvedAddress !== account?.signer?.address) { + setNewErrorMessage(`Failed resolving address, ${ensName}`); + } + }; + const defaultGatewayUrls = [ 'https://ipfs.io', @@ -60,6 +109,7 @@ const SettingsModal = ({ isOpen, closeModal }) => { 'https://polygon-rpc.com', ]; + const isValidURL = (url) => { try { new URL(url); @@ -70,6 +120,32 @@ const SettingsModal = ({ isOpen, closeModal }) => { }; + const handleCopyAddress = async () => { + try { + await navigator.clipboard.writeText(account?.author.address); + setCopyStatus(true); + } catch (err) { + console.error('Failed to copy text: ', err); + } + }; + + + useEffect(() => { + let copyStatusTimeoutId; + let checkedENSTimeoutId; + if (copyStatus) { + copyStatusTimeoutId = setTimeout(() => setCopyStatus(false), 3000); + } + if (checkedENS) { + checkedENSTimeoutId = setTimeout(() => setCheckedENS(false), 5000); + } + return () => { + clearTimeout(copyStatusTimeoutId); + clearTimeout(checkedENSTimeoutId); + }; + }, [copyStatus, checkedENS]); + + const handleSavePlebbitOptions = async () => { let gatewayUrls = gatewayRef.current.value.split('\n').filter(url => url.trim()); let ipfsClientsOptions = ipfsRef.current.value.split('\n').filter(url => url.trim()); @@ -151,7 +227,7 @@ const SettingsModal = ({ isOpen, closeModal }) => { await setAccount({ ...account, plebbitOptions: { - ...account.plebbitOptions, + ...account?.plebbitOptions, chainProviders, }, }); @@ -211,7 +287,7 @@ const SettingsModal = ({ isOpen, closeModal }) => { await setAccount({ ...account, plebbitOptions: { - ...account.plebbitOptions, + ...account?.plebbitOptions, chainProviders, }, }); @@ -297,9 +373,9 @@ const SettingsModal = ({ isOpen, closeModal }) => { try { await setAccount({ ...account, - name: name || account.name, + name: name || account?.name, author: { - ...account.author, + ...account?.author, displayName: name, }}); setNewSuccessMessage("Account Name Saved"); @@ -353,6 +429,11 @@ const SettingsModal = ({ isOpen, closeModal }) => {
+ +