@ledgerhq/live-common
Version:
Common ground for the Ledger Live apps
108 lines • 4.42 kB
JavaScript
;
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.createAction = exports.getViewKeyExec = void 0;
const invariant_1 = __importDefault(require("invariant"));
const react_1 = require("react");
const rxjs_1 = require("rxjs");
const logs_1 = require("@ledgerhq/logs");
const app_1 = require("../../../../hw/actions/app");
const deviceAccess_1 = require("../../../../hw/deviceAccess");
const setup_1 = require("../../setup");
const getViewKeyExec = (transport, request) => {
(0, invariant_1.default)(request.currency, "getViewKey: currency is required");
(0, invariant_1.default)(request.selectedAccounts.length > 0, "getViewKey: selectedAccounts cannot be empty");
const { selectedAccounts, currency } = request;
const total = selectedAccounts.length;
return (0, rxjs_1.from)(selectedAccounts).pipe((0, rxjs_1.concatMap)(account => {
const { freshAddressPath: path } = account;
const options = { path, currency };
return (0, rxjs_1.defer)(() => (0, setup_1.viewKeyResolver)(transport, options)).pipe((0, rxjs_1.map)(result => {
const viewKey = result.viewKey ? result.viewKey : null;
(0, logs_1.log)("hw", `getViewKey ${currency.id} on ${path}`, result);
return { accountId: account.id, viewKey };
}), (0, rxjs_1.catchError)(e => {
(0, logs_1.log)("hw", `getViewKey ${currency.id} on ${path} FAILED ${String(e)}`);
throw e;
}));
}), (0, rxjs_1.scan)((acc, { accountId, viewKey }) => ({
viewKeys: { ...acc.viewKeys, [accountId]: viewKey },
completed: acc.completed + 1,
total,
}), { viewKeys: {}, completed: 0, total }));
};
exports.getViewKeyExec = getViewKeyExec;
const initialState = {
error: null,
result: null,
sharePending: false,
shareProgress: {
completed: 0,
total: 0,
viewKeys: {},
},
};
const createAction = (connectAppExec, getViewKey) => {
const useHook = (reduxDevice, request) => {
const taskFired = (0, react_1.useRef)(false);
const [state, setState] = (0, react_1.useState)(initialState);
const appState = (0, app_1.createAction)(connectAppExec).useHook(reduxDevice, {
appName: request.appName,
dependencies: request.dependencies,
});
const { device, opened, inWrongDeviceForAccount, error } = appState;
const handleProgress = (0, react_1.useCallback)((progress) => {
const isComplete = progress.completed === progress.total;
setState(prev => ({
...prev,
error: null,
result: isComplete ? progress.viewKeys : null,
sharePending: !isComplete,
shareProgress: progress,
}));
}, []);
const handleError = (0, react_1.useCallback)((error) => {
setState(prev => ({
...prev,
error,
sharePending: false,
}));
taskFired.current = false;
}, []);
(0, react_1.useEffect)(() => {
if (!device || !opened || inWrongDeviceForAccount || error || taskFired.current) {
return;
}
taskFired.current = true;
setState({
...initialState,
sharePending: true,
shareProgress: {
completed: 0,
total: request.selectedAccounts.length,
viewKeys: {},
},
});
const subscription = (0, deviceAccess_1.withDevice)(device.deviceId)(transport => getViewKey(transport, request)).subscribe({
next: handleProgress,
error: handleError,
});
return () => {
subscription.unsubscribe();
};
}, [device, opened, inWrongDeviceForAccount, error, request, handleProgress, handleError]);
return {
...appState,
...state,
error: appState.error || state.error,
};
};
return {
useHook,
mapResult: (state) => state.result,
};
};
exports.createAction = createAction;
//# sourceMappingURL=index.js.map