From 92fcae9a37cb47e9b9750911b0345fc89d5cd7ad Mon Sep 17 00:00:00 2001 From: fmtabbara Date: Wed, 4 May 2022 16:18:56 +0100 Subject: [PATCH] use context for accounts state --- .../components/Accounts/AccountContainer.tsx | 60 ------------ nym-wallet/src/components/AppBar.tsx | 15 +-- nym-wallet/src/context/accounts.tsx | 92 +++++++++++++++++++ 3 files changed, 100 insertions(+), 67 deletions(-) delete mode 100644 nym-wallet/src/components/Accounts/AccountContainer.tsx create mode 100644 nym-wallet/src/context/accounts.tsx diff --git a/nym-wallet/src/components/Accounts/AccountContainer.tsx b/nym-wallet/src/components/Accounts/AccountContainer.tsx deleted file mode 100644 index 75c10316df..0000000000 --- a/nym-wallet/src/components/Accounts/AccountContainer.tsx +++ /dev/null @@ -1,60 +0,0 @@ -import React, { useEffect, useState } from 'react'; -import { AccountEntry } from 'src/types'; -import { addAccount as addAccountRequest } from 'src/requests'; -import { Accounts } from './Accounts'; -import { TDialog } from './types'; - -export const AccountsContainer = ({ storedAccounts }: { storedAccounts: AccountEntry[] }) => { - const [accounts, setAccounts] = useState(storedAccounts); - const [selectedAccount, setSelectedAccount] = useState(storedAccounts[0]); - const [accountToEdit, setAccountToEdit] = useState(); - const [dialogToDisplay, setDialogToDisplay] = useState(); - - useEffect(() => { - const selected = accounts?.find((acc) => acc.address === selectedAccount?.address); - if (selected) setSelectedAccount(selected); - }, [accounts, storedAccounts]); - - useEffect(() => { - setAccounts(storedAccounts); - }, [storedAccounts]); - - const addAccount = async ({ - accountName, - mnemonic, - password, - }: { - accountName: string; - mnemonic: string; - password: string; - }) => { - await addAccountRequest({ - accountName, - mnemonic, - password, - }); - }; - const editAccount = (account: AccountEntry) => - setAccounts((accs) => accs?.map((acc) => (acc.address === account.address ? account : acc))); - const importAccount = (account: AccountEntry) => setAccounts((accs) => [...accs, account]); - const handleAccountToEdit = (accountName: string) => setAccountToEdit(accounts.find((acc) => acc.id === accountName)); - const handleSelectedAccount = (accountName: string) => { - const match = accounts.find((acc) => acc.id === accountName); - if (match) setSelectedAccount(match); - }; - - return ( - - ); -}; diff --git a/nym-wallet/src/components/AppBar.tsx b/nym-wallet/src/components/AppBar.tsx index ffd583ec0a..2cec6a9fbc 100644 --- a/nym-wallet/src/components/AppBar.tsx +++ b/nym-wallet/src/components/AppBar.tsx @@ -1,24 +1,25 @@ import React, { useContext } from 'react'; import { AppBar as MuiAppBar, Grid, IconButton, Toolbar } from '@mui/material'; import { Logout } from '@mui/icons-material'; +import { AccountsProvider } from 'src/context/accounts'; import { ClientContext } from '../context/main'; import { NetworkSelector } from './NetworkSelector'; import { Node as NodeIcon } from '../svg-icons/node'; -import { AccountsContainer } from './Accounts/AccountContainer'; +import { Accounts } from './Accounts/Accounts'; export const AppBar = () => { - const { showSettings, storedAccounts, logOut, handleShowSettings } = useContext(ClientContext); + const { showSettings, logOut, handleShowSettings } = useContext(ClientContext); return ( - {storedAccounts && ( - - - - )} + + + + + diff --git a/nym-wallet/src/context/accounts.tsx b/nym-wallet/src/context/accounts.tsx new file mode 100644 index 0000000000..a97b3ae0a4 --- /dev/null +++ b/nym-wallet/src/context/accounts.tsx @@ -0,0 +1,92 @@ +import React, { createContext, useContext, useEffect, useMemo, useState } from 'react'; +import { Account, AccountEntry, TAccountsDialog } from 'src/types'; +import { addAccount as addAccountRequest } from 'src/requests'; +import { ClientContext } from './main'; + +type TAccounts = { + accounts?: AccountEntry[]; + selectedAccount?: AccountEntry; + accountToEdit?: AccountEntry; + dialogToDisplay?: TAccountsDialog; + handleAddAccount: (data: { accountName: string; mnemonic: string; password: string }) => void; + setDialogToDisplay: (dialog?: TAccountsDialog) => void; + handleSelectAccount: (accountId: string) => void; + handleAccountToEdit: (accountId: string) => void; + handleEditAccount: (account: AccountEntry) => void; + handleImportAccount: (account: AccountEntry) => void; +}; + +export const AccountsContext = createContext({} as TAccounts); + +export const AccountsProvider: React.FC = ({ children }) => { + const [accounts, setAccounts] = useState(); + const [selectedAccount, setSelectedAccount] = useState(); + const [accountToEdit, setAccountToEdit] = useState(); + const [dialogToDisplay, setDialogToDisplay] = useState(); + + const { onAccountChange, storedAccounts } = useContext(ClientContext); + + const handleAddAccount = async ({ + accountName, + mnemonic, + password, + }: { + accountName: string; + mnemonic: string; + password: string; + }) => { + await addAccountRequest({ + accountName, + mnemonic, + password, + }); + }; + const handleEditAccount = (account: AccountEntry) => + setAccounts((accs) => accs?.map((acc) => (acc.address === account.address ? account : acc))); + + const handleImportAccount = (account: AccountEntry) => setAccounts((accs) => [...(accs ? [...accs] : []), account]); + + const handleAccountToEdit = (accountName: string) => + setAccountToEdit(accounts?.find((acc) => acc.id === accountName)); + + const handleSelectAccount = async (accountName: string) => { + const match = accounts?.find((acc) => acc.id === accountName); + if (match) { + try { + await onAccountChange(match.id); + setSelectedAccount(match); + } catch (e) { + console.log('Error swtiching account'); + } + } + }; + + useEffect(() => { + if (storedAccounts) { + setAccounts(storedAccounts); + setSelectedAccount(storedAccounts[0]); + } + }, [storedAccounts]); + + return ( + ({ + accounts, + selectedAccount, + accountToEdit, + dialogToDisplay, + setDialogToDisplay, + handleAddAccount, + handleEditAccount, + handleAccountToEdit, + handleSelectAccount, + handleImportAccount, + }), + [accounts, selectedAccount, accountToEdit, dialogToDisplay], + )} + > + {children} + + ); +};