Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[LIVE-12325] Remove remaining manager v1 api calls (outside of list apps v1) #7019

Merged
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
Loading