UNPKG

@polkadot/react-api

Version:

A collection of RxJs React components the Polkadot JS API

156 lines (123 loc) 6.12 kB
"use strict"; var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard"); var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports.default = Api; exports.api = void 0; var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty")); var _react = _interopRequireWildcard(require("react")); var _promise = _interopRequireDefault(require("@polkadot/api/promise")); var _extensionDapp = require("@polkadot/extension-dapp"); var _rpcProvider = require("@polkadot/rpc-provider"); var _Status = require("@polkadot/react-components/Status"); var _InputNumber = require("@polkadot/react-components/InputNumber"); var _uiKeyring = _interopRequireDefault(require("@polkadot/ui-keyring")); var _uiSettings = _interopRequireDefault(require("@polkadot/ui-settings")); var _ApiSigner = _interopRequireDefault(require("@polkadot/react-signer/ApiSigner")); var _types = require("@polkadot/types"); var _util = require("@polkadot/util"); var _defaults = _interopRequireDefault(require("@polkadot/util-crypto/address/defaults")); var _chain = _interopRequireDefault(require("./overrides/chain")); var _spec = _interopRequireDefault(require("./overrides/spec")); var _ApiContext = _interopRequireDefault(require("./ApiContext")); var _typeRegistry = _interopRequireDefault(require("./typeRegistry")); function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; } function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { (0, _defineProperty2.default)(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; } const DEFAULT_DECIMALS = (0, _types.createType)(_typeRegistry.default, 'u32', 12); const DEFAULT_SS58 = (0, _types.createType)(_typeRegistry.default, 'u32', _defaults.default.prefix); const injectedPromise = (0, _extensionDapp.web3Enable)('polkadot-js/apps'); let api; exports.api = api; async function loadOnReady(api) { const [properties, _systemChain, _systemName, _systemVersion, injectedAccounts] = await Promise.all([api.rpc.system.properties(), api.rpc.system.chain(), api.rpc.system.name(), api.rpc.system.version(), (0, _extensionDapp.web3Accounts)().then(accounts => accounts.map(({ address, meta }) => ({ address, meta: _objectSpread({}, meta, { name: "".concat(meta.name, " (").concat(meta.source === 'polkadot-js' ? 'extension' : meta.source, ")") }) })))]); const ss58Format = _uiSettings.default.prefix === -1 ? properties.ss58Format.unwrapOr(DEFAULT_SS58).toNumber() : _uiSettings.default.prefix; const tokenSymbol = properties.tokenSymbol.unwrapOr('DEV').toString(); const tokenDecimals = properties.tokenDecimals.unwrapOr(DEFAULT_DECIMALS).toNumber(); const systemChain = _systemChain ? _systemChain.toString() : '<unknown>'; const isDevelopment = (0, _util.isTestChain)(systemChain); console.log('api: found chain', systemChain, JSON.stringify(properties)); // first setup the UI helpers _util.formatBalance.setDefaults({ decimals: tokenDecimals, unit: tokenSymbol }); _InputNumber.TokenUnit.setAbbr(tokenSymbol); // finally load the keyring _uiKeyring.default.loadAll({ addressPrefix: ss58Format, genesisHash: api.genesisHash, isDevelopment, ss58Format, type: 'ed25519' }, injectedAccounts); const defaultSection = Object.keys(api.tx)[0]; const defaultMethod = Object.keys(api.tx[defaultSection])[0]; const apiDefaultTx = api.tx[defaultSection][defaultMethod]; const apiDefaultTxSudo = api.tx.system && api.tx.system.setCode || apiDefaultTx; const isSubstrateV2 = !!Object.keys(api.consts).length; return { apiDefaultTx, apiDefaultTxSudo, isApiReady: true, isDevelopment, isSubstrateV2, systemChain, systemName: _systemName.toString(), systemVersion: _systemVersion.toString() }; } function Api({ children, url }) { const { queuePayload, queueSetTxStatus } = (0, _react.useContext)(_Status.StatusContext); const [state, setState] = (0, _react.useState)({ isApiReady: false }); const [isApiConnected, setIsApiConnected] = (0, _react.useState)(false); const [isWaitingInjected, setIsWaitingInjected] = (0, _react.useState)(_extensionDapp.isWeb3Injected); const [isInitialized, setIsInitialized] = (0, _react.useState)(false); // initial initialization (0, _react.useEffect)(() => { const provider = new _rpcProvider.WsProvider(url); const signer = new _ApiSigner.default(queuePayload, queueSetTxStatus); exports.api = api = new _promise.default({ provider, registry: _typeRegistry.default, signer, typesChain: _chain.default, typesSpec: _spec.default }); api.on('connected', () => setIsApiConnected(true)); api.on('disconnected', () => setIsApiConnected(false)); api.on('ready', async () => { try { setState((await loadOnReady(api))); } catch (error) { console.error('Unable to load chain', error); } }); injectedPromise.then(() => setIsWaitingInjected(false)).catch(error => console.error(error)); setIsInitialized(true); }, []); if (!isInitialized) { return null; } return _react.default.createElement(_ApiContext.default.Provider, { value: _objectSpread({}, state, { api, isApiConnected, isWaitingInjected }) }, children); }