diff --git a/.changeset/tiny-socks-jam.md b/.changeset/tiny-socks-jam.md new file mode 100644 index 00000000000..ac483f59e4d --- /dev/null +++ b/.changeset/tiny-socks-jam.md @@ -0,0 +1,7 @@ +--- +"@ledgerhq/types-live": minor +"live-mobile": minor +"@ledgerhq/live-common": minor +--- + +Create the llmMarketQuickActions feature flag diff --git a/apps/ledger-live-mobile/src/components/MarketQuickActions/index.tsx b/apps/ledger-live-mobile/src/components/MarketQuickActions/index.tsx new file mode 100644 index 00000000000..01a92866f4f --- /dev/null +++ b/apps/ledger-live-mobile/src/components/MarketQuickActions/index.tsx @@ -0,0 +1,55 @@ +import { useNavigation } from "@react-navigation/native"; +import { StackNavigationProp } from "@react-navigation/stack"; +import React, { useMemo } from "react"; +import { useTranslation } from "react-i18next"; +import { QuickActionButtonProps, QuickActionList } from "@ledgerhq/native-ui"; +import { EntryOf } from "~/types/helpers"; +import useQuickActions from "../../hooks/useQuickActions"; +import { BaseNavigatorStackParamList } from "../RootNavigator/types/BaseNavigator"; + +export const MarketQuickActions = () => { + const { t } = useTranslation(); + const navigation = useNavigation>(); + const { quickActionsList } = useQuickActions(); + + const quickActionsData: QuickActionButtonProps[] = useMemo( + () => + (Object.entries(QUICK_ACTIONS) as EntryOf[]).flatMap(([key, prop]) => { + const action = quickActionsList[key]; + if (!action) return []; + + return { + variant: "small", + textVariant: "small", + Icon: action.icon, + children: t(prop.name), + onPress: () => + navigation.navigate( + ...(action.route as EntryOf), + ), + disabled: action.disabled, + }; + }), + [quickActionsList, t, navigation], + ); + + return ; +}; + +const QUICK_ACTIONS = { + SEND: { + name: "portfolio.quickActions.send", + }, + RECEIVE: { + name: "portfolio.quickActions.deposit", + }, + BUY: { + name: "portfolio.quickActions.buy", + }, + SWAP: { + name: "portfolio.quickActions.swap", + }, + STAKE: { + name: "portfolio.quickActions.stake", + }, +} as const; diff --git a/apps/ledger-live-mobile/src/newArch/features/Market/screens/MarketDetail/index.tsx b/apps/ledger-live-mobile/src/newArch/features/Market/screens/MarketDetail/index.tsx index 61b2f60ede2..2fee2681a2b 100644 --- a/apps/ledger-live-mobile/src/newArch/features/Market/screens/MarketDetail/index.tsx +++ b/apps/ledger-live-mobile/src/newArch/features/Market/screens/MarketDetail/index.tsx @@ -1,5 +1,6 @@ import React, { memo, useMemo, useState } from "react"; import { useTheme } from "styled-components/native"; +import FeatureToggle from "@ledgerhq/live-common/featureFlags/FeatureToggle"; import { Flex, ScrollContainerHeader, Text } from "@ledgerhq/native-ui"; import { FlatList, Image, RefreshControl } from "react-native"; import { useTranslation } from "react-i18next"; @@ -17,6 +18,7 @@ import MarketGraph from "./components/MarketGraph"; import { ScreenName } from "~/const"; import { withDiscreetMode } from "~/context/DiscreetModeContext"; import { FabMarketActions } from "~/components/FabActions/actionsList/market"; +import { MarketQuickActions } from "~/components/MarketQuickActions"; import BackButton from "./components/BackButton"; import { Item } from "~/components/Graph/types"; import { @@ -138,13 +140,18 @@ function View({ {internalCurrency ? ( - - - + + + + } + /> ) : null} } @@ -166,6 +173,10 @@ function View({ currency={internalCurrency} /> + + + + {accounts?.length > 0 ? ( {t("accounts.title")} diff --git a/apps/ledger-live-mobile/src/types/helpers.ts b/apps/ledger-live-mobile/src/types/helpers.ts index 4b22c0d117c..eef523129f3 100644 --- a/apps/ledger-live-mobile/src/types/helpers.ts +++ b/apps/ledger-live-mobile/src/types/helpers.ts @@ -18,3 +18,8 @@ export type Merge = Omit & B; export type PartialNullable = { [P in keyof T]?: T[P] | null; }; + +export type EntryOf< + T extends Record, + K extends keyof T = keyof T, +> = K extends unknown ? [K, T[K]] : never; diff --git a/libs/ledger-live-common/src/featureFlags/defaultFeatures.ts b/libs/ledger-live-common/src/featureFlags/defaultFeatures.ts index a168b5c86e5..7f281c75926 100644 --- a/libs/ledger-live-common/src/featureFlags/defaultFeatures.ts +++ b/libs/ledger-live-common/src/featureFlags/defaultFeatures.ts @@ -484,6 +484,7 @@ export const DEFAULT_FEATURES: Features = { lldnewArchOrdinals: DEFAULT_FEATURE, enableAppsBackup: DEFAULT_FEATURE, web3hub: DEFAULT_FEATURE, + llmMarketQuickActions: DEFAULT_FEATURE, }; // Firebase SDK treat JSON values as strings diff --git a/libs/ledgerjs/packages/types-live/src/feature.ts b/libs/ledgerjs/packages/types-live/src/feature.ts index dd4ede78206..cc5c69b93a6 100644 --- a/libs/ledgerjs/packages/types-live/src/feature.ts +++ b/libs/ledgerjs/packages/types-live/src/feature.ts @@ -187,6 +187,7 @@ export type Features = CurrencyFeatures & { lldnewArchOrdinals: DefaultFeature; enableAppsBackup: Feature_EnableAppsBackup; web3hub: Feature_web3hub; + llmMarketQuickActions: DefaultFeature; }; /**