@ledgerhq/live-common
Version:
Common ground for the Ledger Live apps
171 lines • 6.9 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 () {
var ownKeys = function(o) {
ownKeys = Object.getOwnPropertyNames || function (o) {
var ar = [];
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
return ar;
};
return ownKeys(o);
};
return function (mod) {
if (mod && mod.__esModule) return mod;
var result = {};
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
__setModuleDefault(result, mod);
return result;
};
})();
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.liveAppContext = void 0;
exports.useRemoteLiveAppManifest = useRemoteLiveAppManifest;
exports.useRemoteLiveAppContext = useRemoteLiveAppContext;
exports.useManifests = useManifests;
exports.RemoteLiveAppProvider = RemoteLiveAppProvider;
const react_1 = __importStar(require("react"));
const api_1 = __importDefault(require("./api"));
const useIsMounted_1 = __importDefault(require("../../../hooks/useIsMounted"));
const useEnv_1 = __importDefault(require("../../../hooks/useEnv"));
const initialState = {
isLoading: false,
value: null,
error: null,
};
const initialProvider = "production";
const initialParams = {
branches: ["stable", "soon"],
};
exports.liveAppContext = (0, react_1.createContext)({
state: initialState,
provider: initialProvider,
setProvider: () => { },
updateManifests: () => Promise.resolve(),
});
function useRemoteLiveAppManifest(appId) {
const liveAppRegistry = (0, react_1.useContext)(exports.liveAppContext).state;
if (!liveAppRegistry.value || !appId) {
return undefined;
}
return (liveAppRegistry.value.liveAppFilteredById[appId] || liveAppRegistry.value.liveAppById[appId]);
}
function useRemoteLiveAppContext() {
return (0, react_1.useContext)(exports.liveAppContext);
}
function useManifests(options = {}) {
const ctx = useRemoteLiveAppContext();
return (0, react_1.useMemo)(() => {
const liveAppFiltered = ctx.state?.value?.liveAppFiltered ?? [];
if (Object.keys(options).length === 0) {
return liveAppFiltered;
}
return liveAppFiltered.filter(manifest => Object.entries(options).some(([key, val]) => {
switch (key) {
case "visibility":
return val.includes(manifest[key]);
default:
return manifest[key] === val;
}
}));
}, [options, ctx]);
}
function RemoteLiveAppProvider({ children, parameters, updateFrequency, }) {
const isMounted = (0, useIsMounted_1.default)();
const [state, setState] = (0, react_1.useState)(initialState);
const [provider, setProvider] = (0, react_1.useState)(initialProvider);
const { allowExperimentalApps, allowDebugApps, apiVersions, platform, llVersion, lang } = parameters;
// apiVersion renamed without (s) because param
const apiVersion = apiVersions ? apiVersions : ["1.0.0", "2.0.0"];
const envProviderURL = (0, useEnv_1.default)("PLATFORM_MANIFEST_API_URL");
const providerURL = provider === "production" ? envProviderURL : provider;
const updateManifests = (0, react_1.useCallback)(async () => {
setState(currentState => ({
...currentState,
isLoading: true,
error: null,
}));
const branches = [...(initialParams.branches || [])];
allowExperimentalApps && branches.push("experimental");
allowDebugApps && branches.push("debug");
const result = await api_1.default
.fetchLiveAppManifests(providerURL)
.then(allManifests => api_1.default
.fetchLiveAppManifests(providerURL, {
apiVersion,
branches,
platform,
private: false,
llVersion,
lang: lang ? lang : "en",
})
.then(catalogManifests => ({ allManifests, catalogManifests })))
.then((manifests) => ({
manifests,
fetchError: null,
}), (e) => ({ manifests: null, fetchError: e }));
if (!isMounted())
return;
if (result.manifests === null) {
setState(currentState => ({
...currentState,
isLoading: false,
error: result.fetchError,
}));
}
else {
const { allManifests, catalogManifests } = result.manifests;
setState(() => ({
isLoading: false,
value: {
liveAppByIndex: allManifests,
liveAppFiltered: catalogManifests,
liveAppFilteredById: catalogManifests.reduce((acc, liveAppManifest) => {
acc[liveAppManifest.id] = liveAppManifest;
return acc;
}, {}),
liveAppById: allManifests.reduce((acc, liveAppManifest) => {
acc[liveAppManifest.id] = liveAppManifest;
return acc;
}, {}),
},
error: null,
}));
}
// eslint-disable-next-line react-hooks/exhaustive-deps
}, [allowDebugApps, allowExperimentalApps, providerURL, lang, isMounted]);
const value = (0, react_1.useMemo)(() => ({
state,
provider,
setProvider,
updateManifests,
}), [state, provider, setProvider, updateManifests]);
(0, react_1.useEffect)(() => {
const interval = setInterval(() => {
updateManifests();
}, updateFrequency);
updateManifests();
return () => {
clearInterval(interval);
};
}, [updateFrequency, updateManifests]);
return react_1.default.createElement(exports.liveAppContext.Provider, { value: value }, children);
}
//# sourceMappingURL=index.js.map