implement account editing via JSON

This commit is contained in:
plebeius.eth
2023-08-13 21:53:43 +02:00
parent 89332a38cf
commit e4c4927989
2 changed files with 96 additions and 28 deletions
+79 -26
View File
@@ -1,7 +1,8 @@
import React, { useState, useEffect, useRef } from "react"; import React, { useState, useEffect, useRef } from "react";
import { Link, useLocation, useNavigate } from "react-router-dom"; import { Link, useLocation, useNavigate } from "react-router-dom";
import Modal from "react-modal"; import Modal from "react-modal";
import { deleteCaches, exportAccount, importAccount, setAccount, setActiveAccount, useAccount, useAccounts, useResolvedAuthorAddress } from "@plebbit/plebbit-react-hooks"; import { confirmAlert } from "react-confirm-alert";
import { deleteAccount, deleteCaches, exportAccount, importAccount, setAccount, setActiveAccount, useAccount, useAccounts, useResolvedAuthorAddress } from "@plebbit/plebbit-react-hooks";
import { StyledModal } from "../styled/modals/SettingsModal.styled"; import { StyledModal } from "../styled/modals/SettingsModal.styled";
import useError from "../../hooks/useError"; import useError from "../../hooks/useError";
import useSuccess from "../../hooks/useSuccess"; import useSuccess from "../../hooks/useSuccess";
@@ -21,7 +22,7 @@ const SettingsModal = ({ isOpen, closeModal }) => {
const navigate = useNavigate(); const navigate = useNavigate();
const location = useLocation(); const location = useLocation();
const [expanded, setExpanded] = useState([]); const [expanded, setExpanded] = useState([]);
const [accountJson, setAccountJson] = useState(null); const [accountJson, setAccountJson] = useState("");
const [copyStatus, setCopyStatus] = useState(false); const [copyStatus, setCopyStatus] = useState(false);
const [ensName, setEnsName] = useState(''); const [ensName, setEnsName] = useState('');
const [checkedENS, setCheckedENS] = useState(false); const [checkedENS, setCheckedENS] = useState(false);
@@ -42,10 +43,10 @@ const SettingsModal = ({ isOpen, closeModal }) => {
const nameRef = useRef(); const nameRef = useRef();
const ensRef = useRef(); const ensRef = useRef();
const isElectron = window.electron && window.electron.isElectron;
const author = {...account?.author, address: ensName}; const author = {...account?.author, address: ensName};
const { resolvedAddress, state } = useResolvedAuthorAddress({ author, cache: false }); const { resolvedAddress, state } = useResolvedAuthorAddress({ author, cache: false });
const isElectron = window.electron && window.electron.isElectron;
const defaultGatewayUrls = isElectron ? undefined : [ const defaultGatewayUrls = isElectron ? undefined : [
'https://ipfs.io', 'https://ipfs.io',
@@ -70,6 +71,23 @@ const SettingsModal = ({ isOpen, closeModal }) => {
]; ];
useEffect(() => {
if (account) {
const fetchAccountData = async () => {
const data = await exportAccount();
setAccountJson(data);
};
fetchAccountData();
}
}, [account]);
const handleAccountJsonChange = (e) => {
setAccountJson(e.target.value);
};
useEffect(() => { useEffect(() => {
if (checkedENS && resolvedAddress && state === 'succeeded') { if (checkedENS && resolvedAddress && state === 'succeeded') {
setCheckedENS(false); setCheckedENS(false);
@@ -302,8 +320,6 @@ const SettingsModal = ({ isOpen, closeModal }) => {
const handleCloseModal = () => { const handleCloseModal = () => {
setAccountJson(null);
if (location.pathname.endsWith("/settings")) { if (location.pathname.endsWith("/settings")) {
const newPath = location.pathname.slice(0, -9); const newPath = location.pathname.slice(0, -9);
closeModal(); closeModal();
@@ -344,13 +360,31 @@ const SettingsModal = ({ isOpen, closeModal }) => {
}, [setNewSuccessMessage]); }, [setNewSuccessMessage]);
const handleExport = async () => { const handleSaveAccount = async () => {
const activeAccountJson = await exportAccount(); try {
setAccountJson(activeAccountJson); const parsedJson = JSON.parse(accountJson);
await setAccount(parsedJson);
setNewSuccessMessage("Account Data Saved Successfully");
} catch (error) {
setNewErrorMessage("Error saving account data: " + error.message);
console.error(error);
}
}; };
const handleImport = async () => { const handleResetAccount = async () => {
try {
const data = await exportAccount();
setAccountJson(data);
setNewSuccessMessage("Account Data Reset Successfully");
} catch (error) {
setNewErrorMessage("Error resetting account data: " + error.message);
console.error(error);
}
};
const handleImportAccount = async () => {
const accountJson = importRef.current.value; const accountJson = importRef.current.value;
try { try {
@@ -364,6 +398,21 @@ const SettingsModal = ({ isOpen, closeModal }) => {
} }
}; };
const handleDeleteAccount = async () => {
if (window.confirm("Are you sure you want to delete this account?")) {
try {
await deleteAccount(account?.name);
localStorage.setItem("successToast", "Account Deleted Successfully");
window.location.reload();
} catch (error) {
setNewErrorMessage("Error deleting account: " + error.message);
console.error(error);
}
}
};
const handleAccountChange = (e) => { const handleAccountChange = (e) => {
setActiveAccount(e.target.value); setActiveAccount(e.target.value);
}; };
@@ -427,15 +476,6 @@ const SettingsModal = ({ isOpen, closeModal }) => {
<span className="settings-pointer" style={{cursor: "pointer"}} <span className="settings-pointer" style={{cursor: "pointer"}}
onClick={() => toggleExpanded(1)} onClick={() => toggleExpanded(1)}
>Account</span> >Account</span>
<div className="plebbit-options-buttons"
style={{ display: expanded.includes(1) ? 'block' : 'none' }}
>
<button className="save-button"
onClick={handleExport}>Export</button>
<button className="reset-button"
onClick={handleImport}
>Import</button>
</div>
</li> </li>
<ul className="settings-cat" style={{ display: expanded.includes(1) ? 'block' : 'none' }}> <ul className="settings-cat" style={{ display: expanded.includes(1) ? 'block' : 'none' }}>
<li className="anon-off"> <li className="anon-off">
@@ -458,14 +498,27 @@ const SettingsModal = ({ isOpen, closeModal }) => {
Account Data Account Data
</li> </li>
<li className="settings-tip"> <li className="settings-tip">
To export, click "Export", then save your account data displayed below in a safe place. To import, paste your account data into the box below, then click "Import". To save manual changes, click "Save". To undo changes, click "Reset". To delete the account and create a new one, click "Delete". To add another account, paste its data and click "Import".
</li> </li>
<div className="settings-input"> <div className="settings-input">
{accountJson ? ( <textarea id="account-data-text"
<textarea value={accountJson} readOnly /> value={accountJson}
): ( ref={importRef}
<textarea ref={importRef} /> onChange={handleAccountJsonChange} />
)} <div className="account-buttons">
<button onClick={handleSaveAccount}>
Save
</button>
<button onClick={handleResetAccount}>
Reset
</button>
<button onClick={handleImportAccount}>
Import
</button>
<button onClick={handleDeleteAccount}>
Delete
</button>
</div>
</div> </div>
<li className="settings-option disc"> <li className="settings-option disc">
Account Address: u/{account?.author.shortAddress} Account Address: u/{account?.author.shortAddress}
@@ -634,14 +687,14 @@ const SettingsModal = ({ isOpen, closeModal }) => {
ref={ethereumRpcRef} ref={ethereumRpcRef}
/> />
</div> </div>
{/* <li className="settings-option disc">Polygon RPC</li> <li className="settings-option disc">Polygon RPC</li>
<li className="settings-tip">Needed for XPLEB NFTs.</li> <li className="settings-tip">Needed for XPLEB NFTs.</li>
<div className="settings-input"> <div className="settings-input">
<textarea placeholder="Polygon RPC URLs" <textarea placeholder="Polygon RPC URLs"
defaultValue={account?.plebbitOptions?.chainProviders?.['matic']?.urls.join("\n")} defaultValue={account?.plebbitOptions?.chainProviders?.['matic']?.urls.join("\n")}
ref={polygonRpcRef} ref={polygonRpcRef}
/> />
</div> */} </div>
</ul> </ul>
</ul> </ul>
<div> <div>
@@ -87,9 +87,24 @@ export const StyledModal = styled(Modal)`
} }
textarea { textarea {
width: 80%; min-width: 80%;
margin-left: 7%;
min-height: 50px; min-height: 50px;
margin-left: 7%;
}
#account-data-text {
min-width: 70%;
min-height: 105px;
}
.account-buttons {
display: inline-block;
position: absolute;
margin: 5px 5px 5px 10px;
button {
margin-bottom: 5px;
}
} }
.all-div { .all-div {