Skip to content

Commit

Permalink
fix: missing query params for web3hub manifests requests
Browse files Browse the repository at this point in the history
Also matches the current prod version for android and ios build in dev to get the proper manifest back from the API
  • Loading branch information
Justkant committed Aug 20, 2024
1 parent 935ce9f commit ce45204
Show file tree
Hide file tree
Showing 7 changed files with 128 additions and 29 deletions.
5 changes: 5 additions & 0 deletions .changeset/eighty-candles-boil.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
"live-mobile": patch
---

fix: missing query params for web3hub manifests requests
2 changes: 1 addition & 1 deletion apps/ledger-live-mobile/android/app/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -128,7 +128,7 @@ android {
minSdkVersion rootProject.ext.minSdkVersion
targetSdkVersion rootProject.ext.targetSdkVersion
versionCode 36176158
versionName "3.40.1"
versionName "3.48.0"
resValue "string", "build_config_package", "com.ledger.live"
testBuildType System.getProperty('testBuildType', 'debug')
testInstrumentationRunner 'androidx.test.runner.AndroidJUnitRunner'
Expand Down
2 changes: 1 addition & 1 deletion apps/ledger-live-mobile/ios/ledgerlivemobile/Info.plist
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,7 @@
<key>CFBundlePackageType</key>
<string>APPL</string>
<key>CFBundleShortVersionString</key>
<string>3.40.1</string>
<string>3.48.0</string>
<key>CFBundleSignature</key>
<string>????</string>
<key>CFBundleURLTypes</key>
Expand Down
Original file line number Diff line number Diff line change
@@ -1,20 +1,39 @@
import { useInfiniteQuery } from "@tanstack/react-query";
import useEnv from "@ledgerhq/live-common/hooks/useEnv";
import {
fetchManifests,
selectManifests,
getNextPageParam,
fetchManifestsMock,
} from "LLM/features/Web3Hub/utils/api/manifests";
import { useLocale } from "~/context/Locale";

export const queryKey = (selectedCategory: string) => ["web3hub/manifests", selectedCategory];
export const queryKey = (
selectedCategory: string,
isExperimentalAppEnabled: boolean,
isDebugAppEnabled: boolean,
locale: string,
) => [
"web3hub/manifests",
selectedCategory,
isExperimentalAppEnabled ? "exp-on" : "exp-off",
isDebugAppEnabled ? "debug-on" : "debug-off",
locale,
];

const isInTest = process.env.NODE_ENV === "test" || !!process.env.MOCK_WEB3HUB;
const queryFn = isInTest ? fetchManifestsMock : fetchManifests;

export default function useManifestListViewModel(selectedCategory: string) {
const isExperimentalAppEnabled = useEnv<"PLATFORM_EXPERIMENTAL_APPS">(
"PLATFORM_EXPERIMENTAL_APPS",
) as boolean;
const isDebugAppEnabled = useEnv<"PLATFORM_DEBUG">("PLATFORM_DEBUG") as boolean;
const { locale } = useLocale();

const manifestsQuery = useInfiniteQuery({
queryKey: queryKey(selectedCategory),
queryFn: queryFn(selectedCategory, ""),
queryKey: queryKey(selectedCategory, isExperimentalAppEnabled, isDebugAppEnabled, locale),
queryFn: queryFn(selectedCategory, "", isExperimentalAppEnabled, isDebugAppEnabled, locale),
initialPageParam: 1,
getNextPageParam,
select: selectManifests,
Expand Down
Original file line number Diff line number Diff line change
@@ -1,15 +1,22 @@
import { useQuery } from "@tanstack/react-query";
import { fetchManifestById, fetchManifestByIdMock } from "LLM/features/Web3Hub/utils/api/manifests";
import { useLocale } from "~/context/Locale";

export const queryKey = (manifestId: string) => ["web3hub/manifest", manifestId];
export const queryKey = (manifestId: string, locale: string) => [
"web3hub/manifest",
manifestId,
locale,
];

const isInTest = process.env.NODE_ENV === "test" || !!process.env.MOCK_WEB3HUB;
const queryFn = isInTest ? fetchManifestByIdMock : fetchManifestById;

export default function useWeb3HubAppViewModel(manifestId: string) {
const { locale } = useLocale();

const manifestQuery = useQuery({
queryKey: queryKey(manifestId),
queryFn: queryFn(manifestId),
queryKey: queryKey(manifestId, locale),
queryFn: queryFn(manifestId, locale),
});

return {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,20 +1,44 @@
import { useMemo } from "react";
import { useInfiniteQuery } from "@tanstack/react-query";
import useEnv from "@ledgerhq/live-common/hooks/useEnv";
import {
fetchManifests,
selectManifests,
getNextPageParam,
fetchManifestsMock,
} from "LLM/features/Web3Hub/utils/api/manifests";
import { useLocale } from "~/context/Locale";

export const queryKey = (search: string) => ["web3hub/manifests/search", search];
export const queryKey = (
search: string,
isExperimentalAppEnabled: boolean,
isDebugAppEnabled: boolean,
locale: string,
) => [
"web3hub/manifests/search",
search,
isExperimentalAppEnabled ? "exp-on" : "exp-off",
isDebugAppEnabled ? "debug-on" : "debug-off",
locale,
];

const isInTest = process.env.NODE_ENV === "test" || !!process.env.MOCK_WEB3HUB;
const queryFn = isInTest ? fetchManifestsMock : fetchManifests;

export default function useSearchListViewModel(search: string) {
const trimmedSearch = useMemo(() => {
return search.trim();
}, [search]);

const isExperimentalAppEnabled = useEnv<"PLATFORM_EXPERIMENTAL_APPS">(
"PLATFORM_EXPERIMENTAL_APPS",
) as boolean;
const isDebugAppEnabled = useEnv<"PLATFORM_DEBUG">("PLATFORM_DEBUG") as boolean;
const { locale } = useLocale();

const manifestsQuery = useInfiniteQuery({
queryKey: queryKey(search),
queryFn: queryFn("", search),
queryKey: queryKey(trimmedSearch, isExperimentalAppEnabled, isDebugAppEnabled, locale),
queryFn: queryFn("", trimmedSearch, isExperimentalAppEnabled, isDebugAppEnabled, locale),
initialPageParam: 1,
getNextPageParam,
select: selectManifests,
Expand Down
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
import { Platform } from "react-native";
import VersionNumber from "react-native-version-number";
import network from "@ledgerhq/live-network/network";
import { GetNextPageParamFunction, InfiniteData, QueryFunction } from "@tanstack/react-query";
import { LiveAppManifest } from "@ledgerhq/live-common/platform/types";
Expand Down Expand Up @@ -31,28 +33,65 @@ export const fetchManifestsMock: (
return list.slice((pageParam - 1) * PAGE_SIZE, pageParam * PAGE_SIZE);
};

export const fetchManifests: (
const PLATFORM = Platform.OS === "ios" ? "ios" : "android";
const LLVersion = VersionNumber.appVersion;

const apiVersions = ["1.0.0", "2.0.0"];

const defaultBranches = ["stable", "soon"];

type FetchManifests = (
category: string,
search: string,
) => QueryFunction<LiveAppManifest[], string[], number> =
(category, search) =>
async ({ pageParam }) => {
const url = new URL(`${URL_ORIGIN}/api/v2/apps`);
url.searchParams.set("resultsPerPage", `${PAGE_SIZE}`);
url.searchParams.set("page", `${pageParam}`);
if (category !== "all") {
url.searchParams.set("categories", category);
}
// TODO: make sure to trim search
if (search) {
url.searchParams.set("search", search);
allowExperimentalApps: boolean,
allowDebugApps: boolean,
lang: string,
) => QueryFunction<LiveAppManifest[], string[], number>;

export const fetchManifests: FetchManifests = (
category,
search,
allowExperimentalApps,
allowDebugApps,
lang,
) => {
const url = new URL(`${URL_ORIGIN}/api/v2/apps`);
url.searchParams.set("llVersion", LLVersion);
url.searchParams.set("platform", PLATFORM);
url.searchParams.set("private", "false");
url.searchParams.set("lang", lang ? lang : "en");
apiVersions.forEach(apiVersion => {
url.searchParams.append("apiVersion", apiVersion);
});
const branches = [
...defaultBranches,
allowExperimentalApps && "experimental",
allowDebugApps && "debug",
];
branches.forEach(branch => {
if (branch) {
url.searchParams.append("branches", branch);
}
});

url.searchParams.set("resultsPerPage", `${PAGE_SIZE}`);
if (category !== "all") {
url.searchParams.set("categories", category);
}
// TODO: make sure to trim search
if (search) {
url.searchParams.set("search", search);
}

return async ({ pageParam }) => {
url.searchParams.set("page", `${pageParam}`);

const res = await network<LiveAppManifest[]>({
url: url.toString(),
});
return res.data;
};
};

export const selectManifests = (data: InfiniteData<LiveAppManifest[], number>) => {
return data.pages.flat(1);
Expand All @@ -78,11 +117,16 @@ export const fetchManifestByIdMock = (manifestId: string) => async () => {
return manifests.find(mock => mock.id === manifestId);
};

export const fetchManifestById = (manifestId: string) => async () => {
export const fetchManifestById = (manifestId: string, lang: string) => {
const url = new URL(`${URL_ORIGIN}/api/v2/apps/${manifestId}`);
url.searchParams.set("llVersion", LLVersion);
url.searchParams.set("platform", PLATFORM);
url.searchParams.set("lang", lang ? lang : "en");

const res = await network<LiveAppManifest>({
url: url.toString(),
});
return res.data;
return async () => {
const res = await network<LiveAppManifest>({
url: url.toString(),
});
return res.data;
};
};

0 comments on commit ce45204

Please sign in to comment.