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) => (
-
+
))}
-
-
+
-
- {t("walletSync.walletSyncActivated.synchronizedInstances.title", {
- count: instances?.length,
- })}
-
+ {isLoading ? (
+
+ ) : (
+
+ {isError
+ ? t("walletSync.walletSyncActivated.synchronizedInstances.error")
+ : t("walletSync.walletSyncActivated.synchronizedInstances.title", {
+ count: data?.length,
+ })}
+
+ )}
@@ -80,7 +104,7 @@ const WalletSyncManage = () => {
-
+
);
@@ -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 }>``;