@aelf-react/core
Version:
Please visit the [parent](https://github.com/mason-hz/aelf-react) [aelf-react](https://github.com/mason-hz/aelf-react) [repository](https://github.com/mason-hz/aelf-react) for documentation and details on this packge.
141 lines (140 loc) • 6.47 kB
JavaScript
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
var desc = Object.getOwnPropertyDescriptor(m, k);
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
desc = { enumerable: true, get: function() { return m[k]; } };
}
Object.defineProperty(o, k2, desc);
}) : (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
o[k2] = m[k];
}));
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
Object.defineProperty(o, "default", { enumerable: true, value: v });
}) : function(o, v) {
o["default"] = v;
});
var __importStar = (this && this.__importStar) || function (mod) {
if (mod && mod.__esModule) return mod;
var result = {};
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
__setModuleDefault(result, mod);
return result;
};
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
return new (P || (P = Promise))(function (resolve, reject) {
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
step((generator = generator.apply(thisArg, _arguments || [])).next());
});
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.useAElfReact = exports.AElfReactProvider = void 0;
const react_1 = __importStar(require("react"));
const utils_1 = require("./utils");
const types_1 = require("./types");
const storage_1 = require("./utils/storage");
const Listeners = ['nightElfRemoveKeyPairs', 'nightElfLockWallet'];
const INITIAL_STATE = {
isActive: false,
account: undefined,
defaultAElfBridge: undefined,
aelfBridges: undefined,
pubKey: undefined,
publicKey: undefined,
};
const AElfContext = (0, react_1.createContext)(undefined);
//reducer
function reducer(state, { type, payload }) {
switch (type) {
case types_1.Actions.DEACTIVATE: {
(0, storage_1.setConnectEagerlyItem)(false);
return Object.assign({}, state, INITIAL_STATE, payload);
}
case types_1.Actions.ACTIVATE: {
(0, storage_1.setConnectEagerlyItem)(true);
return Object.assign({}, state, payload);
}
default: {
return Object.assign({}, state, payload);
}
}
}
function AElfReactProvider({ children, appName, nodes: providerNodes }) {
const [state, dispatch] = (0, react_1.useReducer)(reducer, INITIAL_STATE);
const { account, defaultAElfBridge } = state;
const activate = (0, react_1.useCallback)((activateNodes) => __awaiter(this, void 0, void 0, function* () {
const nodes = activateNodes || providerNodes;
if (!nodes)
throw Error('activate must exist nodes');
const { bridge, bridges, node } = yield (0, utils_1.getBridges)(nodes, appName);
const result = yield bridge.login({ chainId: node.chainId, payload: { method: 'LOGIN' } });
// login fail
if (result.error)
throw result.errorMessage || result;
// is aelf-bridge by wallet app
if (bridge.connect)
yield bridge.connect();
dispatch({
type: types_1.Actions.ACTIVATE,
payload: Object.assign(Object.assign({}, (0, utils_1.formatLoginInfo)(result.detail)), { defaultAElfBridge: bridge, aelfBridges: bridges, isActive: true, nodes, chainId: node.chainId }),
});
return bridges;
}), [appName, providerNodes]);
const deactivate = (0, react_1.useCallback)(() => __awaiter(this, void 0, void 0, function* () {
if (!account || !defaultAElfBridge)
throw Error('no active connection');
const result = yield (defaultAElfBridge === null || defaultAElfBridge === void 0 ? void 0 : defaultAElfBridge.logout({ address: account }));
if (result.error)
throw result;
dispatch({ type: types_1.Actions.DEACTIVATE });
return true;
}), [account, defaultAElfBridge]);
const connectEagerly = (0, react_1.useCallback)((activateNodes) => __awaiter(this, void 0, void 0, function* () {
const { bridge } = yield (0, utils_1.getBridges)(activateNodes, appName);
let isConnectEagerly;
if (bridge.getExtensionInfo) {
const extensionInfo = yield bridge.getExtensionInfo();
if (extensionInfo && !extensionInfo.error && extensionInfo.detail)
isConnectEagerly = true;
}
else {
isConnectEagerly = (0, storage_1.getConnectEagerlyItem)();
}
if (isConnectEagerly)
return yield activate(activateNodes);
throw Error('Can‘t Connect Eagerly');
}), [activate, appName]);
const listener = (0, react_1.useCallback)((result) => {
try {
const { type, detail } = result;
if ((type === Listeners[0] && detail.address === account) || type === Listeners[1])
dispatch({ type: types_1.Actions.DEACTIVATE });
}
catch (error) {
console.debug(error);
}
}, [account]);
(0, react_1.useEffect)(() => {
Listeners.forEach((key) => {
document.addEventListener(key, listener);
});
return () => {
Listeners.forEach((key) => {
document.removeEventListener(key, listener);
});
};
}, [listener]);
return (0, react_1.useMemo)(() => (react_1.default.createElement(AElfContext.Provider, { value: Object.assign(Object.assign({}, state), { activate, deactivate, connectEagerly }) }, children)), [state, activate, deactivate, connectEagerly, children]);
}
exports.AElfReactProvider = AElfReactProvider;
function useAElfReact() {
const context = (0, react_1.useContext)(AElfContext);
if (!context)
throw Error('useAElfReact can only be used within the AElfReactProvider component');
return context;
}
exports.useAElfReact = useAElfReact;
;