diff --git a/packages/apps/src/Apps.tsx b/packages/apps/src/Apps.tsx index cd889f1155..0fb3d66153 100644 --- a/packages/apps/src/Apps.tsx +++ b/packages/apps/src/Apps.tsx @@ -4,7 +4,7 @@ import { BareProps as Props } from '@polkadot/react-components/types'; -import React, { useMemo, useState } from 'react'; +import React, { useCallback, useMemo, useState } from 'react'; import store from 'store'; import styled from 'styled-components'; import { defaultColor, chainColors, emptyColor, nodeColors } from '@polkadot/apps-config/ui/general'; @@ -46,23 +46,35 @@ function Apps ({ className }: Props): React.ReactElement { }, [systemChain, systemName]); const { isCollapsed, isMenu, isMenuOpen } = sidebar; - const _setSidebar = (update: Partial): void => - setSidebar(store.set('sidebar', { ...sidebar, ...update })); - const _collapse = (): void => - _setSidebar({ isCollapsed: !isCollapsed }); - const _toggleMenu = (): void => - _setSidebar({ isCollapsed: false, isMenuOpen: true }); - const _handleResize = (): void => { - const transition = window.innerWidth < SIDEBAR_MENU_THRESHOLD - ? SideBarTransition.MINIMISED_AND_EXPANDED - : SideBarTransition.EXPANDED_AND_MAXIMISED; + const _setSidebar = useCallback( + (update: Partial): void => + setSidebar((sidebar: SidebarState) => + store.set('sidebar', { ...sidebar, ...update }) + ), + [] + ); + const _collapse = useCallback( + (): void => _setSidebar({ isCollapsed: !isCollapsed }), + [isCollapsed] + ); + const _toggleMenu = useCallback( + (): void => _setSidebar({ isCollapsed: false, isMenuOpen: true }), + [] + ); + const _handleResize = useCallback( + (): void => { + const transition = window.innerWidth < SIDEBAR_MENU_THRESHOLD + ? SideBarTransition.MINIMISED_AND_EXPANDED + : SideBarTransition.EXPANDED_AND_MAXIMISED; - _setSidebar({ - isMenu: transition === SideBarTransition.MINIMISED_AND_EXPANDED, - isMenuOpen: false, - transition - }); - }; + _setSidebar({ + isMenu: transition === SideBarTransition.MINIMISED_AND_EXPANDED, + isMenuOpen: false, + transition + }); + }, + [] + ); return ( <> diff --git a/packages/apps/src/SideBar/index.tsx b/packages/apps/src/SideBar/index.tsx index 27eeb1e781..ac38cfd6d4 100644 --- a/packages/apps/src/SideBar/index.tsx +++ b/packages/apps/src/SideBar/index.tsx @@ -4,7 +4,7 @@ import { SIDEBAR_MENU_THRESHOLD } from '../constants'; -import React, { useState } from 'react'; +import React, { useCallback, useState } from 'react'; import styled from 'styled-components'; import { Responsive } from 'semantic-ui-react'; import routing from '@polkadot/apps-routing'; @@ -38,8 +38,14 @@ function SideBar ({ className, collapse, handleResize, isCollapsed, isMenuOpen, }, { network: false }) ); - const _toggleModal = (name: string): () => void => - (): void => setModals({ ...modals, [name]: !modals[name] }); + const _toggleModal = useCallback( + (name: string): () => void => + (): void => setModals((modals: Record) => ({ + ...modals, + [name]: !modals[name] + })), + [] + ); return ( {routing.routes.map((route): React.ReactNode => ( - route && route.Modal + route?.Modal ? route.Modal && modals[route.name] ? ( setIsHidden(true), + [] + ); + if (!isApiReady || hasAccounts || isHidden) { return null; } - const _onClose = (): void => setIsHidden(true); - return ( | null { const [isHidden, setIsHidden] = useState(false); + const _onClose = useCallback( + (): void => setIsHidden(true), + [] + ); + if (isHidden) { return null; } - const _onClose = (): void => setIsHidden(true); - return (
diff --git a/packages/page-accounts/src/Account.tsx b/packages/page-accounts/src/Account.tsx index 7a9cee32eb..8e88258e47 100644 --- a/packages/page-accounts/src/Account.tsx +++ b/packages/page-accounts/src/Account.tsx @@ -6,7 +6,7 @@ import { DeriveAccountInfo } from '@polkadot/api-derive/types'; import { ActionStatus } from '@polkadot/react-components/Status/types'; import { RecoveryConfig } from '@polkadot/types/interfaces'; -import React, { useState, useEffect } from 'react'; +import React, { useCallback, useState, useEffect } from 'react'; import { Label } from 'semantic-ui-react'; import styled from 'styled-components'; import { AddressInfo, AddressSmall, Badge, Button, ChainLock, Forget, Icon, IdentityIcon, InputTags, LinkExternal, Menu, Popup, Input } from '@polkadot/react-components'; @@ -57,7 +57,10 @@ function Account ({ address, className, filter, isFavorite, toggleFavorite }: Pr const [isSettingsOpen, toggleSettings] = useToggle(); const [isTransferOpen, toggleTransfer] = useToggle(); - const _setTags = (tags: string[]): void => setTags(tags.sort()); + const _setTags = useCallback( + (tags: string[]): void => setTags(tags.sort()), + [] + ); useEffect((): void => { const { identity, nickname } = info || {}; diff --git a/packages/page-accounts/src/Overview.tsx b/packages/page-accounts/src/Overview.tsx index 1fc9405c39..ea5b8de159 100644 --- a/packages/page-accounts/src/Overview.tsx +++ b/packages/page-accounts/src/Overview.tsx @@ -9,7 +9,7 @@ import React, { useEffect, useState } from 'react'; import styled from 'styled-components'; import keyring from '@polkadot/ui-keyring'; import { getLedger, isLedger } from '@polkadot/react-api'; -import { useAccounts, useFavorites } from '@polkadot/react-hooks'; +import { useAccounts, useFavorites, useToggle } from '@polkadot/react-hooks'; import { Button, Input, Table } from '@polkadot/react-components'; import CreateModal from './modals/Create'; @@ -39,9 +39,9 @@ async function queryLedger (): Promise { function Overview ({ className, onStatusChange }: Props): React.ReactElement { const { t } = useTranslation(); const { allAccounts, hasAccounts } = useAccounts(); - const [isCreateOpen, setIsCreateOpen] = useState(false); - const [isImportOpen, setIsImportOpen] = useState(false); - const [isQrOpen, setIsQrOpen] = useState(false); + const [isCreateOpen, toggleCreate] = useToggle(); + const [isImportOpen, toggleImport] = useToggle(); + const [isQrOpen, toggleQr] = useToggle(); const [favorites, toggleFavorite] = useFavorites(STORE_FAVS); const [sortedAccounts, setSortedAccounts] = useState([]); const [filter, setFilter] = useState(''); @@ -66,28 +66,24 @@ function Overview ({ className, onStatusChange }: Props): React.ReactElement setIsCreateOpen(!isCreateOpen); - const _toggleImport = (): void => setIsImportOpen(!isImportOpen); - const _toggleQr = (): void => setIsQrOpen(!isQrOpen); - return (
{isCreateOpen && ( )} {isImportOpen && ( )} {isQrOpen && ( )} @@ -96,21 +92,21 @@ function Overview ({ className, onStatusChange }: Props): React.ReactElement