diff --git a/apps/ledger-live-mobile/src/components/RootNavigator/BaseNavigator.tsx b/apps/ledger-live-mobile/src/components/RootNavigator/BaseNavigator.tsx index 5326f75ee6e..d10697e2544 100644 --- a/apps/ledger-live-mobile/src/components/RootNavigator/BaseNavigator.tsx +++ b/apps/ledger-live-mobile/src/components/RootNavigator/BaseNavigator.tsx @@ -87,6 +87,8 @@ import LandingPagesNavigator from "./LandingPagesNavigator"; import FirmwareUpdateScreen from "~/screens/FirmwareUpdate"; import EditCurrencyUnits from "~/screens/Settings/CryptoAssets/Currencies/EditCurrencyUnits"; import WalletSyncNavigator from "LLM/features/WalletSync/WalletSyncNavigator"; +import Web3HubNavigator from "LLM/features/Web3Hub/Navigator"; +import { useFeature } from "@ledgerhq/live-common/featureFlags/index"; const Stack = createStackNavigator(); @@ -104,6 +106,7 @@ export default function BaseNavigator() { const noNanoBuyNanoWallScreenOptions = useNoNanoBuyNanoWallScreenOptions(); const isAccountsEmpty = useSelector(hasNoAccountsSelector); const readOnlyModeEnabled = useSelector(readOnlyModeEnabledSelector) && isAccountsEmpty; + const web3hub = useFeature("web3hub"); return ( <> @@ -186,6 +189,13 @@ export default function BaseNavigator() { component={SendFundsNavigator} options={{ headerShown: false }} /> + {web3hub?.enabled ? ( + + ) : null} {web3hub?.enabled ? ( ( @@ -148,7 +148,7 @@ export default function MainNavigator() { tabPress: e => { e.preventDefault(); managerLockAwareCallback(() => { - navigation.navigate(NavigatorName.Web3Hub); + navigation.navigate(NavigatorName.Web3HubTab); }); }, })} diff --git a/apps/ledger-live-mobile/src/components/RootNavigator/types/BaseNavigator.ts b/apps/ledger-live-mobile/src/components/RootNavigator/types/BaseNavigator.ts index 1d74314c3a7..132fa9f67b8 100644 --- a/apps/ledger-live-mobile/src/components/RootNavigator/types/BaseNavigator.ts +++ b/apps/ledger-live-mobile/src/components/RootNavigator/types/BaseNavigator.ts @@ -14,6 +14,7 @@ import type { Transaction } from "@ledgerhq/live-common/generated/types"; import { MappedSwapOperation } from "@ledgerhq/live-common/exchange/swap/types"; import { Device } from "@ledgerhq/live-common/hw/actions/types"; import { AppResult } from "@ledgerhq/live-common/hw/actions/app"; +import { Web3HubStackParamList } from "LLM/features/Web3Hub/Navigator"; import { NavigatorName, ScreenName } from "~/const"; import type { FirmwareUpdateProps } from "~/screens/FirmwareUpdate"; import type { AccountSettingsNavigatorParamList } from "./AccountSettingsNavigator"; @@ -108,6 +109,7 @@ export type BaseNavigatorStackParamList = { customDappURL?: string; uri?: string; }; + [NavigatorName.Web3Hub]: NavigatorScreenParams | undefined; [ScreenName.Recover]: { platform?: string; device?: Device; diff --git a/apps/ledger-live-mobile/src/components/RootNavigator/types/MainNavigator.ts b/apps/ledger-live-mobile/src/components/RootNavigator/types/MainNavigator.ts index d750c805c10..6d865491135 100644 --- a/apps/ledger-live-mobile/src/components/RootNavigator/types/MainNavigator.ts +++ b/apps/ledger-live-mobile/src/components/RootNavigator/types/MainNavigator.ts @@ -1,6 +1,6 @@ import { NavigatorScreenParams } from "@react-navigation/native"; import { NavigatorName, ScreenName } from "~/const"; -import { Web3HubStackParamList } from "LLM/features/Web3Hub/Navigator"; +import { Web3HubTabStackParamList } from "LLM/features/Web3Hub/TabNavigator"; import { DiscoverNavigatorStackParamList } from "./DiscoverNavigator"; import { MyLedgerNavigatorStackParamList } from "./MyLedgerNavigator"; import { PortfolioNavigatorStackParamList } from "./PortfolioNavigator"; @@ -11,6 +11,6 @@ export type MainNavigatorParamList = { [NavigatorName.Earn]: NavigatorScreenParams | undefined; [ScreenName.Transfer]: undefined; [NavigatorName.Discover]: NavigatorScreenParams | undefined; - [NavigatorName.Web3Hub]: NavigatorScreenParams | undefined; + [NavigatorName.Web3HubTab]: NavigatorScreenParams | undefined; [NavigatorName.MyLedger]: NavigatorScreenParams | undefined; }; diff --git a/apps/ledger-live-mobile/src/const/navigation.ts b/apps/ledger-live-mobile/src/const/navigation.ts index 31fb9c6f240..2b81da03310 100644 --- a/apps/ledger-live-mobile/src/const/navigation.ts +++ b/apps/ledger-live-mobile/src/const/navigation.ts @@ -632,6 +632,7 @@ export enum NavigatorName { // Web3Hub Web3Hub = "Web3Hub", + Web3HubTab = "Web3HubTab", WalletSync = "WalletSync", } diff --git a/apps/ledger-live-mobile/src/newArch/features/Web3Hub/Navigator.tsx b/apps/ledger-live-mobile/src/newArch/features/Web3Hub/Navigator.tsx index 0550ce07609..2cac16e5fe4 100644 --- a/apps/ledger-live-mobile/src/newArch/features/Web3Hub/Navigator.tsx +++ b/apps/ledger-live-mobile/src/newArch/features/Web3Hub/Navigator.tsx @@ -1,11 +1,8 @@ import React, { useState } from "react"; -import { useTranslation } from "react-i18next"; import { createNativeStackNavigator } from "@react-navigation/native-stack"; import { useSharedValue } from "react-native-reanimated"; import { ScreenName } from "~/const"; import { HeaderContext } from "./HeaderContext"; -import Web3HubMain from "./screens/Web3HubMain"; -import Web3HubMainHeader from "./screens/Web3HubMain/components/Header"; import Web3HubSearch from "./screens/Web3HubSearch"; import Web3HubSearchHeader from "./screens/Web3HubSearch/components/Header"; import Web3HubTabs from "./screens/Web3HubTabs"; @@ -14,7 +11,6 @@ import Web3HubApp from "./screens/Web3HubApp"; import Web3HubAppHeader from "./screens/Web3HubApp/components/Header"; export type Web3HubStackParamList = { - [ScreenName.Web3HubMain]: undefined; [ScreenName.Web3HubSearch]: undefined; [ScreenName.Web3HubTabs]: undefined; [ScreenName.Web3HubApp]: { @@ -24,8 +20,7 @@ export type Web3HubStackParamList = { const Stack = createNativeStackNavigator(); -export default function Web3HubNavigator() { - const { t } = useTranslation(); +export default function Navigator() { const layoutY = useSharedValue(0); const [search, setSearch] = useState(""); @@ -36,20 +31,7 @@ export default function Web3HubNavigator() { search, }} > - - ( - - ), - animation: "none", - }} - /> + (); + +export default function TabNavigator() { + const { t } = useTranslation(); + const layoutY = useSharedValue(0); + + return ( + + + ( + + ), + animation: "none", + }} + /> + + + ); +} diff --git a/apps/ledger-live-mobile/src/newArch/features/Web3Hub/__integrations__/shared.tsx b/apps/ledger-live-mobile/src/newArch/features/Web3Hub/__integrations__/shared.tsx index 090682a400b..ca42f7dc99d 100644 --- a/apps/ledger-live-mobile/src/newArch/features/Web3Hub/__integrations__/shared.tsx +++ b/apps/ledger-live-mobile/src/newArch/features/Web3Hub/__integrations__/shared.tsx @@ -1,11 +1,27 @@ import React from "react"; import { QueryClient, QueryClientProvider } from "@tanstack/react-query"; -import Web3HubNavigator from "../Navigator"; +import Navigator from "../Navigator"; +import TabNavigator from "../TabNavigator"; +import { createNativeStackNavigator } from "@react-navigation/native-stack"; +import { NavigatorName } from "~/const"; + +const Stack = createNativeStackNavigator(); export function Web3HubTest() { return ( - + + + + ); } diff --git a/apps/ledger-live-mobile/src/newArch/features/Web3Hub/components/ManifestsList/ManifestItem/index.tsx b/apps/ledger-live-mobile/src/newArch/features/Web3Hub/components/ManifestsList/ManifestItem/index.tsx index 4456a3ab9e7..eff7dc195dc 100644 --- a/apps/ledger-live-mobile/src/newArch/features/Web3Hub/components/ManifestsList/ManifestItem/index.tsx +++ b/apps/ledger-live-mobile/src/newArch/features/Web3Hub/components/ManifestsList/ManifestItem/index.tsx @@ -1,22 +1,14 @@ -import { NativeStackScreenProps } from "@react-navigation/native-stack"; import React, { useCallback, useMemo } from "react"; import { TouchableOpacity } from "react-native"; import { useTranslation } from "react-i18next"; import { useTheme } from "@react-navigation/native"; import { Flex, Text } from "@ledgerhq/native-ui"; import { AppBranch, AppManifest } from "@ledgerhq/live-common/wallet-api/types"; -import { BaseComposite } from "~/components/RootNavigator/types/helpers"; +import type { MainProps, SearchProps } from "LLM/features/Web3Hub/types"; import { AppIcon } from "~/screens/Platform/v2/AppIcon"; -import { ScreenName } from "~/const"; +import { NavigatorName, ScreenName } from "~/const"; import { Theme } from "~/colors"; -import type { Web3HubStackParamList } from "LLM/features/Web3Hub/Navigator"; -type MainProps = BaseComposite< - NativeStackScreenProps ->; -type SearchProps = BaseComposite< - NativeStackScreenProps ->; export type NavigationProp = MainProps["navigation"] | SearchProps["navigation"]; function getBranchStyle(branch: AppBranch, colors: Theme["colors"]) { @@ -70,8 +62,11 @@ export default function ManifestItem({ if (isDisabled) { return; } - navigation.push(ScreenName.Web3HubApp, { - manifestId: manifest.id, + navigation.push(NavigatorName.Web3Hub, { + screen: ScreenName.Web3HubApp, + params: { + manifestId: manifest.id, + }, }); }, [isDisabled, navigation, manifest.id]); diff --git a/apps/ledger-live-mobile/src/newArch/features/Web3Hub/screens/Web3HubApp/index.tsx b/apps/ledger-live-mobile/src/newArch/features/Web3Hub/screens/Web3HubApp/index.tsx index 50a11449ca0..680f4cd68d0 100644 --- a/apps/ledger-live-mobile/src/newArch/features/Web3Hub/screens/Web3HubApp/index.tsx +++ b/apps/ledger-live-mobile/src/newArch/features/Web3Hub/screens/Web3HubApp/index.tsx @@ -1,14 +1,10 @@ import { Text } from "@ledgerhq/native-ui"; -import { NativeStackScreenProps } from "@react-navigation/native-stack"; import React from "react"; import { View } from "react-native"; -import { BaseComposite } from "~/components/RootNavigator/types/helpers"; +import type { AppProps } from "LLM/features/Web3Hub/types"; import { ScreenName } from "~/const"; -import { Web3HubStackParamList } from "../../Navigator"; -type Props = BaseComposite>; - -export default function Web3HubApp({ route }: Props) { +export default function Web3HubApp({ route }: AppProps) { const { manifestId } = route.params; return ( { - navigation.push(ScreenName.Web3HubSearch, {}); + navigation.push(NavigatorName.Web3Hub, { + screen: ScreenName.Web3HubSearch, + }); }, [navigation]); return ( diff --git a/apps/ledger-live-mobile/src/newArch/features/Web3Hub/screens/Web3HubMain/index.tsx b/apps/ledger-live-mobile/src/newArch/features/Web3Hub/screens/Web3HubMain/index.tsx index b60e2a2990a..d48fd3b1407 100644 --- a/apps/ledger-live-mobile/src/newArch/features/Web3Hub/screens/Web3HubMain/index.tsx +++ b/apps/ledger-live-mobile/src/newArch/features/Web3Hub/screens/Web3HubMain/index.tsx @@ -1,15 +1,10 @@ import React, { useContext } from "react"; -import { NativeStackScreenProps } from "@react-navigation/native-stack"; import Animated, { useAnimatedScrollHandler } from "react-native-reanimated"; -import { BaseComposite } from "~/components/RootNavigator/types/helpers"; -import { ScreenName } from "~/const"; -import type { Web3HubStackParamList } from "LLM/features/Web3Hub/Navigator"; +import type { MainProps } from "LLM/features/Web3Hub/types"; import { HeaderContext } from "LLM/features/Web3Hub/HeaderContext"; import ManifestsList from "LLM/features/Web3Hub/components/ManifestsList"; -type Props = BaseComposite>; - -export default function Web3HubMain({ navigation }: Props) { +export default function Web3HubMain({ navigation }: MainProps) { const { layoutY } = useContext(HeaderContext); const scrollHandler = useAnimatedScrollHandler(event => { diff --git a/apps/ledger-live-mobile/src/newArch/features/Web3Hub/screens/Web3HubSearch/components/SearchList/SearchItem/index.tsx b/apps/ledger-live-mobile/src/newArch/features/Web3Hub/screens/Web3HubSearch/components/SearchList/SearchItem/index.tsx index 85ac5b2fbf2..4c7dc8ce5b4 100644 --- a/apps/ledger-live-mobile/src/newArch/features/Web3Hub/screens/Web3HubSearch/components/SearchList/SearchItem/index.tsx +++ b/apps/ledger-live-mobile/src/newArch/features/Web3Hub/screens/Web3HubSearch/components/SearchList/SearchItem/index.tsx @@ -1,18 +1,13 @@ -import { NativeStackScreenProps } from "@react-navigation/native-stack"; import React, { useCallback } from "react"; import { TouchableOpacity } from "react-native"; import { useTheme } from "@react-navigation/native"; import { Flex, Text } from "@ledgerhq/native-ui"; import { AppManifest } from "@ledgerhq/live-common/wallet-api/types"; -import { BaseComposite } from "~/components/RootNavigator/types/helpers"; +import type { SearchProps } from "LLM/features/Web3Hub/types"; import { AppIcon } from "~/screens/Platform/v2/AppIcon"; import { ScreenName } from "~/const"; -import type { Web3HubStackParamList } from "LLM/features/Web3Hub/Navigator"; import CurrencyIconList from "./CurrencyIconList"; -type SearchProps = BaseComposite< - NativeStackScreenProps ->; export type NavigationProp = SearchProps["navigation"]; export default function SearchItem({ diff --git a/apps/ledger-live-mobile/src/newArch/features/Web3Hub/screens/Web3HubSearch/index.tsx b/apps/ledger-live-mobile/src/newArch/features/Web3Hub/screens/Web3HubSearch/index.tsx index 1ca96b2a103..ca02d05d625 100644 --- a/apps/ledger-live-mobile/src/newArch/features/Web3Hub/screens/Web3HubSearch/index.tsx +++ b/apps/ledger-live-mobile/src/newArch/features/Web3Hub/screens/Web3HubSearch/index.tsx @@ -1,16 +1,11 @@ -import { NativeStackScreenProps } from "@react-navigation/native-stack"; import React, { useContext } from "react"; import { ScrollView } from "react-native"; -import { BaseComposite } from "~/components/RootNavigator/types/helpers"; -import { ScreenName } from "~/const"; -import { Web3HubStackParamList } from "LLM/features/Web3Hub/Navigator"; +import type { SearchProps } from "LLM/features/Web3Hub/types"; import { HeaderContext } from "LLM/features/Web3Hub/HeaderContext"; import ManifestsList from "LLM/features/Web3Hub/components/ManifestsList"; import SearchList from "./components/SearchList"; -type Props = BaseComposite>; - -export default function Web3HubSearch({ navigation }: Props) { +export default function Web3HubSearch({ navigation }: SearchProps) { const { search } = useContext(HeaderContext); return ( diff --git a/apps/ledger-live-mobile/src/newArch/features/Web3Hub/screens/Web3HubTabs/index.tsx b/apps/ledger-live-mobile/src/newArch/features/Web3Hub/screens/Web3HubTabs/index.tsx index 8bcd866d1c6..108d83b3595 100644 --- a/apps/ledger-live-mobile/src/newArch/features/Web3Hub/screens/Web3HubTabs/index.tsx +++ b/apps/ledger-live-mobile/src/newArch/features/Web3Hub/screens/Web3HubTabs/index.tsx @@ -1,14 +1,10 @@ -import { Text } from "@ledgerhq/native-ui"; -import { NativeStackScreenProps } from "@react-navigation/native-stack"; import React from "react"; import { View } from "react-native"; -import { BaseComposite } from "~/components/RootNavigator/types/helpers"; -import { Web3HubStackParamList } from "../../Navigator"; +import { Text } from "@ledgerhq/native-ui"; +import type { TabsProps } from "LLM/features/Web3Hub/types"; import { ScreenName } from "~/const"; -type Props = BaseComposite>; - -export default function Web3HubTabs(_: Props) { +export default function Web3HubTabs(_: TabsProps) { return ( +>; + +export type SearchProps = BaseComposite< + NativeStackScreenProps +>; + +export type AppProps = BaseComposite< + NativeStackScreenProps +>; + +export type TabsProps = BaseComposite< + NativeStackScreenProps +>;