diff --git a/src/pages/wallets/WalletActions.tsx b/src/pages/wallets/WalletActions.tsx index 41aadf4..27b5f9b 100644 --- a/src/pages/wallets/WalletActions.tsx +++ b/src/pages/wallets/WalletActions.tsx @@ -1,7 +1,7 @@ // Copyright (c) 2020-2021 Drew Lemmy // This file is part of KristWeb 2 under AGPL-3.0. // Full details: https://github.com/tmpim/KristWeb2/blob/master/LICENSE.txt -import React, { useState } from "react"; +import React from "react"; import { Modal, Dropdown, Menu } from "antd"; import { MenuClickEventHandler } from "rc-menu/lib/interface"; import { @@ -13,8 +13,8 @@ import { AuthorisedAction } from "@comp/auth/AuthorisedAction"; import { OpenEditWalletFn } from "./WalletEditButton"; -import { WalletInfoModal } from "./info/WalletInfoModal"; import { OpenSendTxFn } from "@comp/transactions/SendTransactionModalLink"; +import { OpenWalletInfoFn } from "./info/WalletInfoModal"; import { Wallet, deleteWallet } from "@wallets"; @@ -22,15 +22,16 @@ wallet: Wallet; openEditWallet: OpenEditWalletFn; openSendTx: OpenSendTxFn; + openWalletInfo: OpenWalletInfoFn; } export function WalletActions({ wallet, openEditWallet, openSendTx, + openWalletInfo, }: Props): JSX.Element { const { t } = useTranslation(); - const [walletInfoVisible, setWalletInfoVisible] = useState(false); function showWalletDeleteConfirm(): void { Modal.confirm({ @@ -50,7 +51,7 @@ switch (e.key) { // "Wallet info" button case "2": - return setWalletInfoVisible(true); + return openWalletInfo(wallet); // "Delete wallet" button case "3": @@ -58,63 +59,59 @@ } }; - return <> - [ - // Edit wallet button - openEditWallet(wallet)} - popoverPlacement="left" - > - {/* Tooltip was removed for now as an optimisation */} - {/* */} - {React.cloneElement(leftButton as React.ReactElement, { - className: "ant-btn-left", // force the border-radius - disabled: wallet.dontSave - })} - {/* */} - , + buttonsRender={([leftButton, rightButton]) => [ + // Edit wallet button + openEditWallet(wallet)} + popoverPlacement="left" + > + {/* Tooltip was removed for now as an optimisation */} + {/* */} + {React.cloneElement(leftButton as React.ReactElement, { + className: "ant-btn-left", // force the border-radius + disabled: wallet.dontSave + })} + {/* */} + , - // Dropdown button - rightButton - ]} + // Dropdown button + rightButton + ]} - trigger={["click"]} + trigger={["click"]} - overlay={( - - {/* Send tx button */} - - openSendTx(wallet)} - popoverPlacement="left" - > -
{t("myWallets.actionsSendTransaction")}
-
-
+ overlay={( + + {/* Send tx button */} + + openSendTx(wallet)} + popoverPlacement="left" + > +
{t("myWallets.actionsSendTransaction")}
+
+
- {/* Wallet info button */} - - {t("myWallets.actionsWalletInfo")} - + {/* Wallet info button */} + + {t("myWallets.actionsWalletInfo")} + - + - {/* Delete button */} - - {t("myWallets.actionsDelete")} - -
- )}> + {/* Delete button */} + + {t("myWallets.actionsDelete")} + +
+ )}> - {/* Edit button */} - -
- - - ; + {/* Edit button */} + + ; } diff --git a/src/pages/wallets/WalletsPage.tsx b/src/pages/wallets/WalletsPage.tsx index e7c25f9..33e9392 100644 --- a/src/pages/wallets/WalletsPage.tsx +++ b/src/pages/wallets/WalletsPage.tsx @@ -18,6 +18,7 @@ import { useEditWalletModal } from "./WalletEditButton"; import { useSendTransactionModal } from "@comp/transactions/SendTransactionModalLink"; +import { useWalletInfoModal } from "./info/WalletInfoModal"; /** Extract the subtitle into its own component to avoid re-rendering the * entire page when a wallet is added. */ @@ -61,6 +62,7 @@ export function WalletsPage(): JSX.Element { const [openEditWallet, editWalletModal] = useEditWalletModal(); const [openSendTx, sendTxModal] = useSendTransactionModal(); + const [openWalletInfo, walletInfoModal] = useWalletInfoModal(); return {/* Rendered only once, as an optimisation */} {editWalletModal} {sendTxModal} + {walletInfoModal} ; } diff --git a/src/pages/wallets/WalletsTable.tsx b/src/pages/wallets/WalletsTable.tsx index 6a38802..f7dabb8 100644 --- a/src/pages/wallets/WalletsTable.tsx +++ b/src/pages/wallets/WalletsTable.tsx @@ -13,6 +13,7 @@ import { WalletActions } from "./WalletActions"; import { OpenEditWalletFn } from "./WalletEditButton"; import { OpenSendTxFn } from "@comp/transactions/SendTransactionModalLink"; +import { OpenWalletInfoFn } from "./info/WalletInfoModal"; import { keyedNullSort, localeSort } from "@utils"; import { useDateColumnWidth } from "@utils/table"; @@ -20,11 +21,13 @@ interface Props { openEditWallet: OpenEditWalletFn; openSendTx: OpenSendTxFn; + openWalletInfo: OpenWalletInfoFn; } export function WalletsTable({ openEditWallet, - openSendTx + openSendTx, + openWalletInfo }: Props): JSX.Element { const { t } = useTranslation(); const { wallets } = useWallets(); @@ -131,6 +134,7 @@ wallet={record} openEditWallet={openEditWallet} openSendTx={openSendTx} + openWalletInfo={openWalletInfo} /> ) } diff --git a/src/pages/wallets/info/WalletInfoModal.tsx b/src/pages/wallets/info/WalletInfoModal.tsx index eeb9ace..991abb5 100644 --- a/src/pages/wallets/info/WalletInfoModal.tsx +++ b/src/pages/wallets/info/WalletInfoModal.tsx @@ -1,7 +1,7 @@ // Copyright (c) 2020-2021 Drew Lemmy // This file is part of KristWeb 2 under AGPL-3.0. // Full details: https://github.com/tmpim/KristWeb2/blob/master/LICENSE.txt -import { Dispatch, SetStateAction } from "react"; +import { useState, Dispatch, SetStateAction } from "react"; import { Modal, Button, DescriptionsProps } from "antd"; import { useTranslation } from "react-i18next"; @@ -61,3 +61,28 @@ ; } + +export type OpenWalletInfoFn = (wallet: Wallet) => void; +export type WalletInfoHookRes = [ + OpenWalletInfoFn, + JSX.Element | null, + (visible: boolean) => void +]; + +export function useWalletInfoModal(): WalletInfoHookRes { + const [opened, setOpened] = useState(false); + const [visible, setVisible] = useState(false); + const [wallet, setWallet] = useState(); + + function open(wallet: Wallet) { + setWallet(wallet); + setVisible(true); + if (!opened) setOpened(true); + } + + const modal = opened && wallet + ? + : null; + + return [open, modal, setVisible]; +}