From 1ee06b7c82cae2849bc9294488cdb6e496841217 Mon Sep 17 00:00:00 2001 From: Jaco Greeff Date: Fri, 19 Jun 2020 17:45:20 +0200 Subject: [PATCH] Improve status display via context (#2992) --- packages/apps/src/Content/Status.tsx | 17 ++++----- packages/apps/src/Content/index.tsx | 8 ++--- .../react-components/src/Status/index.tsx | 36 ++++++++++--------- 3 files changed, 27 insertions(+), 34 deletions(-) diff --git a/packages/apps/src/Content/Status.tsx b/packages/apps/src/Content/Status.tsx index 9e5a19b2d1..ffcc5f3547 100644 --- a/packages/apps/src/Content/Status.tsx +++ b/packages/apps/src/Content/Status.tsx @@ -4,10 +4,10 @@ import { EventRecord } from '@polkadot/types/interfaces'; import { KeyringOptions } from '@polkadot/ui-keyring/options/types'; -import { ActionStatus, QueueStatus, QueueTx, QueueAction$Add } from '@polkadot/react-components/Status/types'; +import { ActionStatus } from '@polkadot/react-components/Status/types'; -import React, { useEffect } from 'react'; -import { Status as StatusDisplay } from '@polkadot/react-components'; +import React, { useContext, useEffect } from 'react'; +import { Status as StatusDisplay, StatusContext } from '@polkadot/react-components'; import { useAccounts, useApi, useCall } from '@polkadot/react-hooks'; import { stringToU8a } from '@polkadot/util'; import { xxhashAsHex } from '@polkadot/util-crypto'; @@ -16,9 +16,6 @@ import { useTranslation } from '../translate'; interface Props { optionsAll?: KeyringOptions; - queueAction: QueueAction$Add; - stqueue: QueueStatus[]; - txqueue: QueueTx[]; } let prevEventHash: string; @@ -64,7 +61,8 @@ function filterEvents (allAccounts: string[], t: (key: string, opts .filter((item): item is ActionStatus => !!item); } -function Status ({ optionsAll, queueAction, stqueue, txqueue }: Props): React.ReactElement { +function Status ({ optionsAll }: Props): React.ReactElement { + const { queueAction } = useContext(StatusContext); const { api, isApiReady } = useApi(); const { allAccounts } = useAccounts(); const { t } = useTranslation(); @@ -77,10 +75,7 @@ function Status ({ optionsAll, queueAction, stqueue, txqueue }: Props): React.Re }, [allAccounts, events, optionsAll, queueAction, t]); return ( - + ); } diff --git a/packages/apps/src/Content/index.tsx b/packages/apps/src/Content/index.tsx index cd181ff6cd..b62da37522 100644 --- a/packages/apps/src/Content/index.tsx +++ b/packages/apps/src/Content/index.tsx @@ -34,7 +34,7 @@ function Content ({ className }: Props): React.ReactElement { const location = useLocation(); const { t } = useTranslation(); const { isApiConnected, isApiReady } = useApi(); - const { queueAction, stqueue, txqueue } = useContext(StatusContext); + const { queueAction } = useContext(StatusContext); const { Component, display: { needsApi }, name } = useMemo( (): Route => { const app = location.pathname.slice(1) || ''; @@ -64,11 +64,7 @@ function Content ({ className }: Props): React.ReactElement { /> - + ) } diff --git a/packages/react-components/src/Status/index.tsx b/packages/react-components/src/Status/index.tsx index bb2a20f5c4..2ddf660eea 100644 --- a/packages/react-components/src/Status/index.tsx +++ b/packages/react-components/src/Status/index.tsx @@ -4,7 +4,7 @@ import { QueueStatus, QueueTx, QueueTxStatus } from './types'; -import React, { useCallback, useMemo } from 'react'; +import React, { useCallback, useContext, useEffect, useState } from 'react'; import styled from 'styled-components'; import { registry } from '@polkadot/react-api'; @@ -21,8 +21,6 @@ export { StatusContext }; interface Props { className?: string; - stqueue?: QueueStatus[]; - txqueue?: QueueTx[]; } function iconName (status: string): any { @@ -150,29 +148,33 @@ function renderItem ({ error, extrinsic, id, removeItem, rpc, status }: QueueTx) } function filterSt (stqueue?: QueueStatus[]): QueueStatus[] { - return (stqueue || []).filter(({ isCompleted }): boolean => !isCompleted); + return (stqueue || []).filter(({ isCompleted }) => !isCompleted); } function filterTx (txqueue?: QueueTx[]): [QueueTx[], QueueTx[]] { - const allTx = (txqueue || []).filter(({ status }): boolean => !['completed', 'incomplete'].includes(status)); + const allTx = (txqueue || []).filter(({ status }) => !['completed', 'incomplete'].includes(status)); - return [allTx, allTx.filter(({ status }): boolean => STATUS_COMPLETE.includes(status))]; + return [allTx, allTx.filter(({ status }) => STATUS_COMPLETE.includes(status))]; } -function Status ({ className = '', stqueue, txqueue }: Props): React.ReactElement | null { +function Status ({ className = '' }: Props): React.ReactElement | null { + const { stqueue, txqueue } = useContext(StatusContext); + const [allSt, setAllSt] = useState([]); + const [[allTx, completedTx], setAllTx] = useState<[QueueTx[], QueueTx[]]>([[], []]); const { t } = useTranslation(); - const allSt = useMemo( - (): QueueStatus[] => filterSt(stqueue), - [stqueue] - ); - const [allTx, completedTx] = useMemo( - (): [QueueTx[], QueueTx[]] => filterTx(txqueue), - [txqueue] - ); + + useEffect((): void => { + setAllSt(filterSt(stqueue)); + }, [stqueue]); + + useEffect((): void => { + setAllTx(filterTx(txqueue)); + }, [txqueue]); + const _onDismiss = useCallback( (): void => { - allSt.map((s): void => s.removeItem()); - completedTx.map((t): void => t.removeItem()); + allSt.map((s) => s.removeItem()); + completedTx.map((t) => t.removeItem()); }, [allSt, completedTx] );