UNPKG

@ledgerhq/live-common

Version:
108 lines 4.42 kB
"use strict"; 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