Skip to content

Commit

Permalink
Merge pull request #7019 from LedgerHQ/bugfix/LIVE-12325-remove-manag…
Browse files Browse the repository at this point in the history
…er-v1-api-calls

[LIVE-12325] Remove remaining manager v1 api calls (outside of list apps v1)
  • Loading branch information
ofreyssinet-ledger committed Jun 12, 2024
2 parents d13502f + f7b51d8 commit ef00813
Show file tree
Hide file tree
Showing 24 changed files with 186 additions and 237 deletions.
6 changes: 6 additions & 0 deletions .changeset/mean-rocks-live.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
---
"@ledgerhq/device-core": patch
"@ledgerhq/live-common": patch
---

Create getAppsCatalogForDevice use case
7 changes: 7 additions & 0 deletions .changeset/purple-rules-return.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
---
"ledger-live-desktop": patch
"live-mobile": patch
"@ledgerhq/live-common": patch
---

Refactor "app update available" logic to only rely on v2 manager apis
6 changes: 6 additions & 0 deletions .changeset/tasty-sheep-study.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
---
"@ledgerhq/live-cli": patch
"@ledgerhq/web-tools": patch
---

Refactor install/uninstall app commands to only rely on v2 manager apis
13 changes: 8 additions & 5 deletions apps/cli/src/commands/device/app.ts
Original file line number Diff line number Diff line change
@@ -1,12 +1,13 @@
import { from, concat } from "rxjs";
import { map, mergeMap, ignoreElements } from "rxjs/operators";
import manager from "@ledgerhq/live-common/manager/index";
import { withDevice } from "@ledgerhq/live-common/hw/deviceAccess";
import getDeviceInfo from "@ledgerhq/live-common/hw/getDeviceInfo";
import openApp from "@ledgerhq/live-common/hw/openApp";
import quitApp from "@ledgerhq/live-common/hw/quitApp";
import installApp from "@ledgerhq/live-common/hw/installApp";
import uninstallApp from "@ledgerhq/live-common/hw/uninstallApp";
import { getAppsCatalogForDevice } from "@ledgerhq/live-common/device/use-cases/getAppsCatalogForDevice";
import { mapApplicationV2ToApp } from "@ledgerhq/live-common/apps/polyfill";
import { deviceOpt, inferManagerApp } from "../../scan";
import type { DeviceInfo } from "@ledgerhq/types-live";
export default {
Expand Down Expand Up @@ -74,10 +75,10 @@ export default {
if (debug)
return from(getDeviceInfo(t)).pipe(
mergeMap((deviceInfo: DeviceInfo) =>
from(manager.getAppsList(deviceInfo, true)).pipe(
from(getAppsCatalogForDevice(deviceInfo)).pipe(
mergeMap(list => {
const app = list.find(
item => item.name.toLowerCase() === inferManagerApp(debug).toLowerCase(),
item => item.versionName.toLowerCase() === inferManagerApp(debug).toLowerCase(),
);

if (!app) {
Expand All @@ -91,11 +92,12 @@ export default {
);
return from(getDeviceInfo(t)).pipe(
mergeMap((deviceInfo: DeviceInfo) =>
from(manager.getAppsList(deviceInfo, true)).pipe(
mergeMap(list =>
from(getAppsCatalogForDevice(deviceInfo)).pipe(
mergeMap(v2List =>
concat(
...(uninstall || []).map(application => {
const { targetId } = deviceInfo;
const list = v2List.map(mapApplicationV2ToApp);
const app = list.find(
item => item.name.toLowerCase() === inferManagerApp(application).toLowerCase(),
);
Expand All @@ -108,6 +110,7 @@ export default {
}),
...(install || []).map(application => {
const { targetId } = deviceInfo;
const list = v2List.map(mapApplicationV2ToApp);
const app = list.find(
item => item.name.toLowerCase() === inferManagerApp(application).toLowerCase(),
);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ import { useDispatch, useSelector } from "react-redux";
import { Link, useHistory, useLocation, PromptProps } from "react-router-dom";
import { Transition } from "react-transition-group";
import styled from "styled-components";
import { useManagerBlueDot } from "@ledgerhq/live-common/manager/hooks";
import { useDeviceHasUpdatesAvailable } from "@ledgerhq/live-common/manager/useDeviceHasUpdatesAvailable";
import { useRemoteLiveAppManifest } from "@ledgerhq/live-common/platform/providers/RemoteLiveAppProvider/index";
import { FeatureToggle, useFeature } from "@ledgerhq/live-common/featureFlags/index";
import { IconsLegacy, Tag as TagComponent } from "@ledgerhq/react-ui";
Expand Down Expand Up @@ -232,7 +232,7 @@ const MainSideBar = () => {
const lastSeenDevice = useSelector(lastSeenDeviceSelector);
const noAccounts = useSelector(accountsSelector).length === 0;
const hasStarredAccounts = useSelector(starredAccountsSelector).length > 0;
const displayBlueDot = useManagerBlueDot(lastSeenDevice);
const displayBlueDot = useDeviceHasUpdatesAvailable(lastSeenDevice);

const referralProgramConfig = useFeature("referralProgramDesktopSidebar");
const recoverFeature = useFeature("protectServicesDesktop");
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ import useIsMounted from "@ledgerhq/live-common/hooks/useIsMounted";
import { Device } from "@ledgerhq/live-common/hw/actions/types";
import { withDevice } from "@ledgerhq/live-common/hw/deviceAccess";
import getDeviceInfo from "@ledgerhq/live-common/hw/getDeviceInfo";
import { useAvailableLanguagesForDevice } from "@ledgerhq/live-common/manager/hooks";
import { useAvailableLanguagesForDevice } from "@ledgerhq/live-common/manager/useAvailableLanguagesForDevice";
import { DeviceInfo, DeviceModelInfo, idsToLanguage } from "@ledgerhq/types-live";
import isEqual from "lodash/isEqual";
import { useCallback, useEffect, useState } from "react";
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ import { Flex } from "@ledgerhq/react-ui";
import { useSelector } from "react-redux";
import { languageSelector } from "~/renderer/reducers/settings";
import { DEFAULT_LANGUAGE, Languages } from "~/config/languages";
import { useAvailableLanguagesForDevice } from "@ledgerhq/live-common/manager/hooks";
import { useAvailableLanguagesForDevice } from "@ledgerhq/live-common/manager/useAvailableLanguagesForDevice";
import { track } from "~/renderer/analytics/segment";
import ChangeDeviceLanguageAction from "~/renderer/components/ChangeDeviceLanguageAction";
import { renderLoading } from "~/renderer/components/DeviceAction/rendering";
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ import {
} from "@ledgerhq/react-ui";
import { DeviceInfo, Language } from "@ledgerhq/types-live";
import { track } from "~/renderer/analytics/segment";
import { useAvailableLanguagesForDevice } from "@ledgerhq/live-common/manager/hooks";
import { useAvailableLanguagesForDevice } from "@ledgerhq/live-common/manager/useAvailableLanguagesForDevice";
import { Device } from "@ledgerhq/live-common/hw/actions/types";
import { useTranslation } from "react-i18next";
import ChangeDeviceLanguageAction from "~/renderer/components/ChangeDeviceLanguageAction";
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import { withDevice } from "@ledgerhq/live-common/hw/deviceAccess";
import getDeviceInfo from "@ledgerhq/live-common/hw/getDeviceInfo";
import { useAvailableLanguagesForDevice } from "@ledgerhq/live-common/manager/hooks";
import { useAvailableLanguagesForDevice } from "@ledgerhq/live-common/manager/useAvailableLanguagesForDevice";
import { DeviceInfo, idsToLanguage } from "@ledgerhq/types-live";
import isEqual from "lodash/isEqual";
import React, { useCallback, useEffect, useMemo } from "react";
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ import { Flex } from "@ledgerhq/native-ui";
import { getDeviceModel } from "@ledgerhq/devices";
import { DeviceInfo, idsToLanguage, Language, languageIds } from "@ledgerhq/types-live";
import { Device } from "@ledgerhq/live-common/hw/actions/types";
import { useAvailableLanguagesForDevice } from "@ledgerhq/live-common/manager/hooks";
import { useAvailableLanguagesForDevice } from "@ledgerhq/live-common/manager/useAvailableLanguagesForDevice";

import { FwUpdateForegroundEvent } from "./types";

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ import { Icons, Text } from "@ledgerhq/native-ui";
import React, { useCallback, useRef, useState } from "react";
import { useTranslation } from "react-i18next";
import { Language, DeviceInfo } from "@ledgerhq/types-live";
import { useAvailableLanguagesForDevice } from "@ledgerhq/live-common/manager/hooks";
import { useAvailableLanguagesForDevice } from "@ledgerhq/live-common/manager/useAvailableLanguagesForDevice";
import { Device } from "@ledgerhq/live-common/hw/actions/types";
import DeviceLanguageSelection from "./DeviceLanguageSelection";
import QueuedDrawer from "~/components/QueuedDrawer";
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ import { Flex, SelectableList } from "@ledgerhq/native-ui";
import i18next from "i18next";
import RNRestart from "react-native-restart";
import { useDispatch, useSelector } from "react-redux";
import { useAvailableLanguagesForDevice } from "@ledgerhq/live-common/manager/hooks";
import { useAvailableLanguagesForDevice } from "@ledgerhq/live-common/manager/useAvailableLanguagesForDevice";
import { Device } from "@ledgerhq/live-common/hw/actions/types";
import { firstValueFrom, from } from "rxjs";
import { DeviceModelInfo, idsToLanguage, Language } from "@ledgerhq/types-live";
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import React, { useCallback, useEffect, useState } from "react";
import { useAvailableLanguagesForDevice } from "@ledgerhq/live-common/manager/hooks";
import { useAvailableLanguagesForDevice } from "@ledgerhq/live-common/manager/useAvailableLanguagesForDevice";
import { useGetDeviceInfo } from "@ledgerhq/live-common/deviceSDK/hooks/useGetDeviceInfo";
import { Device } from "@ledgerhq/live-common/hw/actions/types";
import { Flex } from "@ledgerhq/native-ui";
Expand Down
43 changes: 8 additions & 35 deletions apps/web-tools/repl/components/fields/ApplicationField.tsx
Original file line number Diff line number Diff line change
@@ -1,57 +1,30 @@
import React, { useState, useEffect } from "react";
import Select from "react-select";
import { getProviderId } from "@ledgerhq/live-common/manager/index";
import ManagerAPI from "@ledgerhq/live-common/manager/api";
import type { ApplicationVersion, DeviceInfo } from "@ledgerhq/types-live";
import { getLatestFirmwareForDeviceUseCase } from "@ledgerhq/live-common/device/use-cases/getLatestFirmwareForDeviceUseCase";
import type { App, DeviceInfo } from "@ledgerhq/types-live";
import { getAppsCatalogForDevice } from "@ledgerhq/live-common/device/use-cases/getAppsCatalogForDevice";
import { mapApplicationV2ToApp } from "@ledgerhq/live-common/apps/polyfill";

export type DataTypeApplication = {
type: "application";
};

type Props = {
value?: ApplicationVersion;
onChange: (_: ApplicationVersion | null) => void;
value?: App | null;
onChange: (_: App | null) => void;
dependencies: {
deviceInfo: DeviceInfo;
};
};

const ApplicationField = ({ value, onChange, dependencies: { deviceInfo } }: Props) => {
const [applications, setApplications] = useState<ApplicationVersion[]>([]);
const [applications, setApplications] = useState<App[]>([]);

useEffect(() => {
if (!deviceInfo) return;
const provider = getProviderId(deviceInfo);
const deviceVersionP = ManagerAPI.getDeviceVersion(deviceInfo.targetId, provider);

const firmwareDataP = deviceVersionP.then(deviceVersion =>
ManagerAPI.getCurrentFirmware({
deviceId: deviceVersion.id,
version: deviceInfo.version,
provider,
}),
getAppsCatalogForDevice(deviceInfo).then(apps =>
setApplications(apps.map(mapApplicationV2ToApp)),
);

const latestFirmwareForDeviceP = getLatestFirmwareForDeviceUseCase(deviceInfo);

Promise.all([firmwareDataP, latestFirmwareForDeviceP]).then(
([firmwareData, updateAvailable]) => ({
...firmwareData,
updateAvailable,
}),
);

const applicationsByDeviceP = Promise.all([deviceVersionP, firmwareDataP]).then(
([deviceVersion, firmwareData]) =>
ManagerAPI.applicationsByDevice({
provider,
current_se_firmware_final_version: firmwareData.id,
device_version: deviceVersion.id,
}),
);

applicationsByDeviceP.then(setApplications);
}, [deviceInfo]);

return (
Expand Down
1 change: 1 addition & 0 deletions libs/device-core/src/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ export { isDeviceLocalizationSupported } from "./commands/use-cases/isDeviceLoca
export { PROVIDERS, getProviderIdUseCase } from "./managerApi/use-cases/getProviderIdUseCase";
export { fetchMcus } from "./managerApi/use-cases/fetchMcus";
export { aDeviceInfoBuilder } from "./managerApi/entities/mocks/aDeviceInfo";
export { getAppsCatalogForDevice } from "./managerApi/use-cases/getAppsCatalogForDevice";
// src/commands/
export type { FirmwareInfoEntity } from "./commands/entities/FirmwareInfoEntity";
export { GET_VERSION_APDU } from "./commands/use-cases/getVersion";
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
import { ManagerApiRepository } from "../repositories/ManagerApiRepository";

type Params = {
firmwareVersion: string;
targetId: string | number;
provider: number;
};

export async function getAppsCatalogForDevice(
params: Params,
managerApiRepository: ManagerApiRepository,
) {
const { firmwareVersion, targetId, provider } = params;
return managerApiRepository.catalogForDevice({
firmwareVersion,
provider,
targetId,
});
}
15 changes: 5 additions & 10 deletions libs/ledger-live-common/.unimportedrc.json
Original file line number Diff line number Diff line change
Expand Up @@ -214,6 +214,8 @@
"src/logs/simple.ts",
"src/manager/api.ts",
"src/manager/hooks.ts",
"src/manager/useDeviceHasUpdatesAvailable.ts",
"src/manager/useAvailableLanguagesForDevice.ts",
"src/manager/index.ts",
"src/manager/localization.ts",
"src/manager/provider.ts",
Expand Down Expand Up @@ -283,15 +285,8 @@
"src/wallet-api/types.ts",
"src/wallet-api/version.ts"
],
"extensions": [
".ts",
".js",
".jsx",
".tsx"
],
"ignorePatterns": [
"**/node_modules/**"
],
"extensions": [".ts", ".js", ".jsx", ".tsx"],
"ignorePatterns": ["**/node_modules/**"],
"ignoreUnimported": [
"lib-es/__tests__",
"lib-es/__tests__/accounts",
Expand Down Expand Up @@ -2810,4 +2805,4 @@
"rpc-websockets/dist/lib/client/websocket",
"superstruct"
]
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
import {
ManagerApiRepository,
getAppsCatalogForDevice as coreGetAppsCatalogForDevice,
} from "@ledgerhq/device-core";
import { HttpManagerApiRepositoryFactory } from "../factories/HttpManagerApiRepositoryFactory";
import { getProviderId } from "../../manager";
import { DeviceInfo } from "@ledgerhq/types-live";

export function getAppsCatalogForDevice(
deviceInfo: DeviceInfo,
managerApiRepository: ManagerApiRepository = HttpManagerApiRepositoryFactory.getInstance(),
) {
const { version: firmwareVersion, targetId } = deviceInfo;
const provider = getProviderId(deviceInfo);
return coreGetAppsCatalogForDevice({ firmwareVersion, targetId, provider }, managerApiRepository);
}
29 changes: 4 additions & 25 deletions libs/ledger-live-common/src/hw/isUpdateAvailable.ts
Original file line number Diff line number Diff line change
Expand Up @@ -9,40 +9,19 @@
*/
import { DeviceInfo } from "@ledgerhq/types-live";
import semver from "semver";
import { getProviderId } from "../manager/provider";
import ManagerAPI from "../manager/api";
import { AppAndVersion } from "./connectApp";
import { mustUpgrade } from "../apps";
import { getAppsCatalogForDevice } from "../device/use-cases/getAppsCatalogForDevice";

const isUpdateAvailable = async (
deviceInfo: DeviceInfo,
appAndVersion: AppAndVersion,
checkMustUpdate = true,
): Promise<boolean> => {
const deviceVersionP = ManagerAPI.getDeviceVersion(
deviceInfo.targetId,
getProviderId(deviceInfo),
);

const firmwareDataP = deviceVersionP.then(deviceVersion =>
ManagerAPI.getCurrentFirmware({
deviceId: deviceVersion.id,
version: deviceInfo.version,
provider: getProviderId(deviceInfo),
}),
);

const applicationsByDevice = await Promise.all([deviceVersionP, firmwareDataP]).then(
([deviceVersion, firmwareData]) =>
ManagerAPI.applicationsByDevice({
provider: getProviderId(deviceInfo),
current_se_firmware_final_version: firmwareData.id,
device_version: deviceVersion.id,
}),
);
const applicationsByDevice = await getAppsCatalogForDevice(deviceInfo);

const appAvailableInProvider = applicationsByDevice.find(
({ name }) => appAndVersion.name === name,
({ versionName: name }) => appAndVersion.name === name,
);

if (!appAvailableInProvider) return false;
Expand All @@ -53,7 +32,7 @@ const isUpdateAvailable = async (

return (
!!appAvailableInProvider &&
!mustUpgrade(appAvailableInProvider.name, appAvailableInProvider.version)
!mustUpgrade(appAvailableInProvider.versionName, appAvailableInProvider.version)
);
};

Expand Down
4 changes: 4 additions & 0 deletions libs/ledger-live-common/src/manager/api.ts
Original file line number Diff line number Diff line change
Expand Up @@ -108,6 +108,7 @@ const remapSocketError = (context?: string) =>
}
});

/** @deprecated use getAppsCatalogForDevice (from ledger-live-common/src/device/use-cases) instead */
const applicationsByDevice: (params: {
provider: number;
current_se_firmware_final_version: Id;
Expand All @@ -132,6 +133,7 @@ const applicationsByDevice: (params: {
}`,
);

/** @deprecated use getAppsCatalogForDevice (from ledger-live-common/src/device/use-cases) instead */
const listApps: () => Promise<Array<Application>> = makeLRUCache(
async () => {
const { data } = await network({
Expand Down Expand Up @@ -515,7 +517,9 @@ async function retrieveMcuVersion({
}

const API = {
/** @deprecated use getAppsCatalogForDevice (from ledger-live-common/src/device/use-cases) instead */
applicationsByDevice,
/** @deprecated use getAppsCatalogForDevice (from ledger-live-common/src/device/use-cases) instead */
listApps,
listInstalledApps,
listCategories,
Expand Down
Loading

0 comments on commit ef00813

Please sign in to comment.