From 93c7c0e8e570636cfb22d9d20acb67913ac833a4 Mon Sep 17 00:00:00 2001 From: Jaco Date: Sun, 14 May 2023 09:07:07 +0300 Subject: [PATCH] Basic NIS dashboard (#9437) --- CHANGELOG.md | 1 + packages/apps-routing/src/index.ts | 4 +- packages/apps-routing/src/nis.ts | 23 ++++ packages/page-nis/.skip-build | 0 packages/page-nis/.skip-npm | 0 packages/page-nis/README.md | 1 + packages/page-nis/package.json | 26 ++++ packages/page-nis/src/Overview/BidAdd.tsx | 132 +++++++++++++++++++++ packages/page-nis/src/Overview/Queue.tsx | 31 +++++ packages/page-nis/src/Overview/Queues.tsx | 43 +++++++ packages/page-nis/src/Overview/Summary.tsx | 55 +++++++++ packages/page-nis/src/Overview/index.tsx | 41 +++++++ packages/page-nis/src/Overview/types.ts | 16 +++ packages/page-nis/src/Overview/useInfo.ts | 39 ++++++ packages/page-nis/src/index.tsx | 48 ++++++++ packages/page-nis/src/translate.ts | 10 ++ packages/page-nis/src/useProxies.ts | 42 +++++++ packages/page-nis/tsconfig.build.json | 9 ++ tsconfig.base.json | 1 + yarn.lock | 14 ++- 20 files changed, 534 insertions(+), 2 deletions(-) create mode 100644 packages/apps-routing/src/nis.ts create mode 100644 packages/page-nis/.skip-build create mode 100644 packages/page-nis/.skip-npm create mode 100644 packages/page-nis/README.md create mode 100644 packages/page-nis/package.json create mode 100644 packages/page-nis/src/Overview/BidAdd.tsx create mode 100644 packages/page-nis/src/Overview/Queue.tsx create mode 100644 packages/page-nis/src/Overview/Queues.tsx create mode 100644 packages/page-nis/src/Overview/Summary.tsx create mode 100644 packages/page-nis/src/Overview/index.tsx create mode 100644 packages/page-nis/src/Overview/types.ts create mode 100644 packages/page-nis/src/Overview/useInfo.ts create mode 100644 packages/page-nis/src/index.tsx create mode 100644 packages/page-nis/src/translate.ts create mode 100644 packages/page-nis/src/useProxies.ts create mode 100644 packages/page-nis/tsconfig.build.json diff --git a/CHANGELOG.md b/CHANGELOG.md index 363bc49d7e..fc234a5e47 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -10,6 +10,7 @@ Contributed: Changes: - Cater for current Substrate bonding extrinsic arguments +- Add basic NIS dashboard - Disable unreachable endpoints diff --git a/packages/apps-routing/src/index.ts b/packages/apps-routing/src/index.ts index f20c7a4936..f71413a6f1 100644 --- a/packages/apps-routing/src/index.ts +++ b/packages/apps-routing/src/index.ts @@ -23,6 +23,7 @@ import gilt from './gilt.js'; import js from './js.js'; import membership from './membership.js'; import nfts from './nfts.js'; +import nis from './nis.js'; import parachains from './parachains.js'; import poll from './poll.js'; import preimages from './preimages.js'; @@ -74,10 +75,11 @@ export default function create (t: TFunction): Routes { bounties(t), // others parachains(t), - gilt(t), assets(t), nfts(t), society(t), + nis(t), + gilt(t), scheduler(t), calendar(t), contracts(t), diff --git a/packages/apps-routing/src/nis.ts b/packages/apps-routing/src/nis.ts new file mode 100644 index 0000000000..e7534355c7 --- /dev/null +++ b/packages/apps-routing/src/nis.ts @@ -0,0 +1,23 @@ +// Copyright 2017-2023 @polkadot/apps-routing authors & contributors +// SPDX-License-Identifier: Apache-2.0 + +import type { TFunction } from 'i18next'; +import type { Route } from './types.js'; + +import Component from '@polkadot/app-nis'; + +export default function create (t: TFunction): Route { + return { + Component, + display: { + needsApi: [ + 'tx.nis.placeBid', + 'query.proxy.proxies' + ] + }, + group: 'network', + icon: 'leaf', + name: 'nis', + text: t('nav.nis', 'Non-interactive Staking', { ns: 'apps-routing' }) + }; +} diff --git a/packages/page-nis/.skip-build b/packages/page-nis/.skip-build new file mode 100644 index 0000000000..e69de29bb2 diff --git a/packages/page-nis/.skip-npm b/packages/page-nis/.skip-npm new file mode 100644 index 0000000000..e69de29bb2 diff --git a/packages/page-nis/README.md b/packages/page-nis/README.md new file mode 100644 index 0000000000..e1a2f0c65c --- /dev/null +++ b/packages/page-nis/README.md @@ -0,0 +1 @@ +# @polkadot/app-nis diff --git a/packages/page-nis/package.json b/packages/page-nis/package.json new file mode 100644 index 0000000000..7b9dcbcbc6 --- /dev/null +++ b/packages/page-nis/package.json @@ -0,0 +1,26 @@ +{ + "bugs": "https://github.com/polkadot-js/apps/issues", + "engines": { + "node": ">=16" + }, + "homepage": "https://github.com/polkadot-js/apps/tree/master/packages/page-nis#readme", + "license": "Apache-2.0", + "name": "@polkadot/app-nis", + "private": true, + "repository": { + "directory": "packages/page-nis", + "type": "git", + "url": "https://github.com/polkadot-js/apps.git" + }, + "sideEffects": false, + "type": "module", + "version": "0.130.2-1-x", + "dependencies": { + "@polkadot/react-components": "^0.130.2-1-x" + }, + "peerDependencies": { + "react": "*", + "react-dom": "*", + "react-is": "*" + } +} diff --git a/packages/page-nis/src/Overview/BidAdd.tsx b/packages/page-nis/src/Overview/BidAdd.tsx new file mode 100644 index 0000000000..e3f9afdf64 --- /dev/null +++ b/packages/page-nis/src/Overview/BidAdd.tsx @@ -0,0 +1,132 @@ +// Copyright 2017-2023 @polkadot/app-nis authors & contributors +// SPDX-License-Identifier: Apache-2.0 + +import type { BN } from '@polkadot/util'; + +import React, { useMemo, useState } from 'react'; + +import { Button, InputAddress, InputBalance, InputNumber, Modal, TxButton } from '@polkadot/react-components'; +import { useApi, useToggle } from '@polkadot/react-hooks'; +import { Available } from '@polkadot/react-query'; +import { BN_ONE } from '@polkadot/util'; + +import { useTranslation } from '../translate.js'; + +interface Props { + className?: string; + isDisabled?: boolean; + proxies: Record; +} + +function Bid ({ className, isDisabled, proxies }: Props): React.ReactElement { + const { t } = useTranslation(); + const { api } = useApi(); + const [isOpen, toggleOpen] = useToggle(); + const [accountId, setAccountId] = useState(null); + const [proxyId, setProxyId] = useState(null); + const [amount, setAmount] = useState(); + const [duration, setDuration] = useState(); + + const tx = useMemo( + () => accountId && amount && duration + ? api.tx.proxy.proxy(accountId, null, api.tx.nis.placeBid(amount, duration)) + : null, + [api, accountId, amount, duration] + ); + + const proxiedAccounts = Object.keys(proxies); + const isAmountError = !amount || amount.isZero() || amount.lt(api.consts.nis.minBid); + const isDurationError = !duration || !duration.gte(BN_ONE) || duration.gt(api.consts.nis.queueCount); + + return ( + <> +