@polkadot/react-api
Version:
A collection of RxJs React components the Polkadot JS API
156 lines (123 loc) • 6.12 kB
JavaScript
;
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);
}