From fc0474e93915e6582d37c1b42f9e531ddf34f475 Mon Sep 17 00:00:00 2001 From: Martin CAYUELAS <112866305+mcayuelas-ledger@users.noreply.github.com> Date: Mon, 29 Jul 2024 15:03:03 +0200 Subject: [PATCH] [FEAT] : Get members from trustchain (#7387) --- .changeset/funny-swans-check.md | 5 ++ .changeset/moody-socks-obey.md | 5 ++ .../src/locales/en/common.json | 9 ++- .../WalletSync/__integrations__/shared.tsx | 18 +++--- .../features/WalletSync/hooks/type.hooks.ts | 3 + .../WalletSync/hooks/useGetMembers.ts | 44 +++++++++++++++ .../WalletSync/screens/Manage/Option.tsx | 15 +++-- .../WalletSync/screens/Manage/index.tsx | 56 ++++++++++++++----- 8 files changed, 128 insertions(+), 27 deletions(-) create mode 100644 .changeset/funny-swans-check.md create mode 100644 .changeset/moody-socks-obey.md create mode 100644 apps/ledger-live-mobile/src/newArch/features/WalletSync/hooks/type.hooks.ts create mode 100644 apps/ledger-live-mobile/src/newArch/features/WalletSync/hooks/useGetMembers.ts diff --git a/.changeset/funny-swans-check.md b/.changeset/funny-swans-check.md new file mode 100644 index 000000000000..6554dda4abc5 --- /dev/null +++ b/.changeset/funny-swans-check.md @@ -0,0 +1,5 @@ +--- +"live-mobile": patch +--- + +Add Banner when error throws diff --git a/.changeset/moody-socks-obey.md b/.changeset/moody-socks-obey.md new file mode 100644 index 000000000000..0356c0bf69ea --- /dev/null +++ b/.changeset/moody-socks-obey.md @@ -0,0 +1,5 @@ +--- +"live-mobile": patch +--- + +Get members of trutchain diff --git a/apps/ledger-live-mobile/src/locales/en/common.json b/apps/ledger-live-mobile/src/locales/en/common.json index 0cbad654226a..f861c69554dc 100644 --- a/apps/ledger-live-mobile/src/locales/en/common.json +++ b/apps/ledger-live-mobile/src/locales/en/common.json @@ -6733,7 +6733,14 @@ "synchronizedInstances": { "cta": "Manage now", "title": "{{count}} Synchronized Instance", - "title_plural": "{{count}} Synchronized Instances" + "title_plural": "{{count}} Synchronized Instances", + "error": "Instances" + }, + "errors": { + "fetching": "Something went wrong while fetching your synchronized instances.", + "trustchain": "Unexpected falsy trustchain", + "memberCredentials": "Unexpected falsy member credentials", + "ledgerSyncUnavailable": "Ledger Sync is currently unavailable. This doesn’t have any impact on your assets." } } }, diff --git a/apps/ledger-live-mobile/src/newArch/features/WalletSync/__integrations__/shared.tsx b/apps/ledger-live-mobile/src/newArch/features/WalletSync/__integrations__/shared.tsx index 65f45df70311..66783035a666 100644 --- a/apps/ledger-live-mobile/src/newArch/features/WalletSync/__integrations__/shared.tsx +++ b/apps/ledger-live-mobile/src/newArch/features/WalletSync/__integrations__/shared.tsx @@ -15,14 +15,16 @@ const Stack = createStackNavigator< export function WalletSyncSettingsNavigator() { return ( - - - - + + + + + + ); } diff --git a/apps/ledger-live-mobile/src/newArch/features/WalletSync/hooks/type.hooks.ts b/apps/ledger-live-mobile/src/newArch/features/WalletSync/hooks/type.hooks.ts new file mode 100644 index 000000000000..a3d500c6f786 --- /dev/null +++ b/apps/ledger-live-mobile/src/newArch/features/WalletSync/hooks/type.hooks.ts @@ -0,0 +1,3 @@ +export enum QueryKey { + getMembers = "useGetMembers", +} diff --git a/apps/ledger-live-mobile/src/newArch/features/WalletSync/hooks/useGetMembers.ts b/apps/ledger-live-mobile/src/newArch/features/WalletSync/hooks/useGetMembers.ts new file mode 100644 index 000000000000..7361caa03649 --- /dev/null +++ b/apps/ledger-live-mobile/src/newArch/features/WalletSync/hooks/useGetMembers.ts @@ -0,0 +1,44 @@ +import { memberCredentialsSelector, trustchainSelector } from "@ledgerhq/trustchain/store"; +import { useSelector } from "react-redux"; +import { useTrustchainSdk } from "./useTrustchainSdk"; +import { useQuery } from "@tanstack/react-query"; +import { QueryKey } from "./type.hooks"; +import { useTranslation } from "react-i18next"; +import { createCustomErrorClass } from "@ledgerhq/errors"; + +export const TrustchainNotFound = createCustomErrorClass("TrustchainNotFound"); +export const MemberCredentialsNotFound = createCustomErrorClass("MemberCredentialsNotFound"); + +export function useGetMembers() { + const sdk = useTrustchainSdk(); + const trustchain = useSelector(trustchainSelector); + const memberCredentials = useSelector(memberCredentialsSelector); + const { t } = useTranslation(); + + function getMembers() { + if (!memberCredentials) { + throw new MemberCredentialsNotFound( + t("walletSync.walletSyncActivated.errors.memberCredentials"), + ); + } + + if (!trustchain) { + throw new TrustchainNotFound(t("walletSync.walletSyncActivated.errors.trustchain")); + } + + try { + return sdk.getMembers(trustchain, memberCredentials); + } catch (e) { + throw e as Error; + } + } + + return useQuery({ + queryKey: [QueryKey.getMembers, trustchain], + queryFn: () => getMembers(), + refetchOnMount: true, + refetchOnReconnect: true, + refetchOnWindowFocus: true, + retry: false, + }); +} diff --git a/apps/ledger-live-mobile/src/newArch/features/WalletSync/screens/Manage/Option.tsx b/apps/ledger-live-mobile/src/newArch/features/WalletSync/screens/Manage/Option.tsx index 85a09ef58fa1..9f32146f5016 100644 --- a/apps/ledger-live-mobile/src/newArch/features/WalletSync/screens/Manage/Option.tsx +++ b/apps/ledger-live-mobile/src/newArch/features/WalletSync/screens/Manage/Option.tsx @@ -2,17 +2,20 @@ import { Flex, Icons, Text } from "@ledgerhq/native-ui"; import React from "react"; import { TouchableOpacity } from "react-native"; import { Separator } from "../../components/Separator"; +import styled from "styled-components/native"; export type OptionProps = { label: string; description: string; onClick?: () => void; testId: string; + disabled?: boolean; + id: string; }; -export const Option = ({ label, description, onClick, testId }: OptionProps) => ( - - +export const Option = ({ label, description, onClick, testId, disabled }: OptionProps) => ( + + {label} @@ -26,8 +29,12 @@ export const Option = ({ label, description, onClick, testId }: OptionProps) => - + ); + +const Container = styled(Flex).attrs((p: { disabled?: boolean }) => ({ + opacity: p.disabled ? 0.3 : 1, +}))<{ disabled?: boolean }>``; diff --git a/apps/ledger-live-mobile/src/newArch/features/WalletSync/screens/Manage/index.tsx b/apps/ledger-live-mobile/src/newArch/features/WalletSync/screens/Manage/index.tsx index e5a718a96953..d70dd918ff64 100644 --- a/apps/ledger-live-mobile/src/newArch/features/WalletSync/screens/Manage/index.tsx +++ b/apps/ledger-live-mobile/src/newArch/features/WalletSync/screens/Manage/index.tsx @@ -1,4 +1,4 @@ -import { Box, Flex, Text, Icons } from "@ledgerhq/native-ui"; +import { Box, Flex, Text, Icons, InfiniteLoader, Alert } from "@ledgerhq/native-ui"; import React from "react"; import { useTranslation } from "react-i18next"; import { Option, OptionProps } from "./Option"; @@ -10,13 +10,12 @@ import { } from "../../hooks/useWalletSyncAnalytics"; import { Separator } from "../../components/Separator"; import { TouchableOpacity } from "react-native"; +import { TrustchainNotFound, useGetMembers } from "../../hooks/useGetMembers"; const WalletSyncManage = () => { const { t } = useTranslation(); - //const { instances, isLoading, hasError } = useInstances(); - const instances = ["instance1", "instance2", "instance3"]; - const disabled = false; + const { data, isLoading, isError, error } = useGetMembers(); const { onClickTrack } = useWalletSyncAnalytics(); @@ -42,37 +41,62 @@ const WalletSyncManage = () => { description: t("walletSync.walletSyncActivated.synchronize.description"), onClick: goToSync, testId: "walletSync-synchronize", + id: "synchronize", }, { label: t("walletSync.walletSyncActivated.manageKey.title"), description: t("walletSync.walletSyncActivated.manageKey.description"), onClick: goToManageBackup, testId: "walletSync-manage-backup", + id: "manageKey", }, ]; + function getError(error: Error) { + // if (error instanceof UnavailableServerError) { DO SOMETHING} + + return ; + } + return ( {/* */} - + {isError ? getError(error) : } {Options.map((props, index) => ( - ); @@ -93,3 +117,7 @@ const InstancesRow = styled(TouchableOpacity)<{ disabled?: boolean }>` cursor: ${p => (p.disabled ? "not-allowed" : "pointer")}; } `; + +const Container = styled(Flex).attrs((p: { disabled?: boolean }) => ({ + opacity: p.disabled ? 0.3 : 1, +}))<{ disabled?: boolean }>``;