@r3l/app
Version:
237 lines (194 loc) • 8.49 kB
JavaScript
;
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.useContract = useContract;
exports.useBlockNumber = useBlockNumber;
exports.useAsync = useAsync;
exports.useContractParam = useContractParam;
var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator"));
var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray"));
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator"));
var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
var _react = require("react");
var _web = require("./web3");
var _utils = require("../utils");
var _contracts = require("../utils/contracts");
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; }
function useContract(name, address, provider) {
var _useState = (0, _react.useState)(),
_useState2 = (0, _slicedToArray2.default)(_useState, 2),
contract = _useState2[0],
setContract = _useState2[1];
var _useWeb3React = (0, _web.useWeb3React)(),
library = _useWeb3React.library,
active = _useWeb3React.active;
(0, _react.useEffect)(function () {
var _fetchContract = /*#__PURE__*/function () {
var _ref = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee(_name, _address) {
var contract;
return _regenerator.default.wrap(function _callee$(_context) {
while (1) {
switch (_context.prev = _context.next) {
case 0:
if (library) {
_context.next = 2;
break;
}
return _context.abrupt("return");
case 2:
contract = (0, _utils.getContract)(_address, _contracts.contracts[_name].abi, library.getUncheckedSigner());
setContract(contract);
case 4:
case "end":
return _context.stop();
}
}
}, _callee);
}));
return function _fetchContract(_x, _x2) {
return _ref.apply(this, arguments);
};
}();
if (name && address && library && active) _fetchContract(name, address);
}, [name, address, provider, library, active]);
return contract;
}
function useBlockNumber() {
var _useWeb3React2 = (0, _web.useWeb3React)(),
chainId = _useWeb3React2.chainId,
library = _useWeb3React2.library,
active = _useWeb3React2.active;
var _useState3 = (0, _react.useState)(),
_useState4 = (0, _slicedToArray2.default)(_useState3, 2),
blockNumber = _useState4[0],
setBlockNumber = _useState4[1];
(0, _react.useEffect)(function () {
var stale = false;
var watchNumber = /*#__PURE__*/function () {
var _ref2 = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee2() {
var _blockNumber;
return _regenerator.default.wrap(function _callee2$(_context2) {
while (1) {
switch (_context2.prev = _context2.next) {
case 0:
_context2.prev = 0;
library === null || library === void 0 ? void 0 : library.on('block', updateBlockNumber);
_context2.next = 4;
return library === null || library === void 0 ? void 0 : library.getBlockNumber();
case 4:
_blockNumber = _context2.sent;
setBlockNumber(_blockNumber);
_context2.next = 11;
break;
case 8:
_context2.prev = 8;
_context2.t0 = _context2["catch"](0);
setBlockNumber(undefined);
case 11:
case "end":
return _context2.stop();
}
}
}, _callee2, null, [[0, 8]]);
}));
return function watchNumber() {
return _ref2.apply(this, arguments);
};
}();
var updateBlockNumber = function updateBlockNumber(blockNumber) {
setBlockNumber(blockNumber);
};
if (active && library && !stale) watchNumber();
return function () {
stale = true;
library && library.removeListener('block', updateBlockNumber);
setBlockNumber(undefined);
};
}, [chainId, active]);
return (0, _react.useMemo)(function () {
return blockNumber;
}, [blockNumber]);
}
/**
* allows us to easily call async functions inside hooks
* @param {Function} fn function we want to call
* @param {Array} args fn arguments
* @param {opt} { condition: only execute if condition is true, deps: additional execution deps }
* @return {error: String, result: Any, loading: boolean} return object
*/
function useAsync(fn, args) {
var opt = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};
var defaultOpt = {
condition: true,
deps: []
};
opt = _objectSpread(_objectSpread({}, defaultOpt), opt);
var _useState5 = (0, _react.useState)(),
_useState6 = (0, _slicedToArray2.default)(_useState5, 2),
res = _useState6[0],
setResult = _useState6[1];
var _useState7 = (0, _react.useState)(),
_useState8 = (0, _slicedToArray2.default)(_useState7, 2),
error = _useState8[0],
setError = _useState8[1];
var _useState9 = (0, _react.useState)(false),
_useState10 = (0, _slicedToArray2.default)(_useState9, 2),
loading = _useState10[0],
setLoading = _useState10[1];
(0, _react.useEffect)(function () {
var callAsyncFn = /*#__PURE__*/function () {
var _ref3 = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee3() {
var result;
return _regenerator.default.wrap(function _callee3$(_context3) {
while (1) {
switch (_context3.prev = _context3.next) {
case 0:
_context3.prev = 0;
setLoading(true);
_context3.next = 4;
return fn.apply(void 0, (0, _toConsumableArray2.default)(args));
case 4:
result = _context3.sent;
setResult(result);
setLoading(false);
_context3.next = 14;
break;
case 9:
_context3.prev = 9;
_context3.t0 = _context3["catch"](0);
// eslint-disable-next-line no-console
console.error(_context3.t0);
if (_context3.t0 instanceof Error) setError(_context3.t0.message);
setLoading(false);
case 14:
case "end":
return _context3.stop();
}
}
}, _callee3, null, [[0, 9]]);
}));
return function callAsyncFn() {
return _ref3.apply(this, arguments);
};
}();
if (opt.condition && fn) callAsyncFn();
}, [opt.condition].concat((0, _toConsumableArray2.default)(args), (0, _toConsumableArray2.default)(opt.deps), [fn]));
return {
error: error,
res: res,
loading: loading
};
}
function useContractParam(contract, param, args) {
var block = useBlockNumber();
var fn = (0, _react.useCallback)(contract === null || contract === void 0 ? void 0 : contract[param], [contract, param]);
return useAsync(fn, args, {
condition: !!contract,
deps: [block]
});
}
//# sourceMappingURL=common.js.map