Skip to content

Commit b47ac6a

Browse files
committed
feat(contacts): drive add-address confirmation via DiE
1 parent c5bb7ae commit b47ac6a

36 files changed

Lines changed: 331 additions & 380 deletions

File tree

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
---
2+
"ledger-live-desktop": minor
3+
"live-mobile": minor
4+
"@features/flow-contacts-add-address": minor
5+
"@features/platform-contacts": patch
6+
---
7+
8+
Drive Contacts add-address confirmation through the Device Intent Executor instead of mocked Continue screens, including prefill and Send entry points.

apps/ledger-live-desktop/__mocks__/@features/platform-contacts/device.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { createMockContactDeviceIntentsPort } from "@features/platform-contacts";
1+
import { createMockContactDeviceIntentsPort } from "@features/platform-contacts/test";
22

33
const deviceIntents = createMockContactDeviceIntentsPort();
44

apps/ledger-live-desktop/src/mvvm/features/Contacts/__integrations__/Contacts.deviceIntents.integration.test.tsx

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -117,10 +117,9 @@ describe("Contacts device intents integration", () => {
117117
expect(screen.getByTestId("contacts-add-address-confirm")).toBeEnabled();
118118
});
119119
await user.click(screen.getByTestId("contacts-add-address-confirm"));
120-
await user.click(screen.getByTestId("contacts-add-address-review-continue"));
121120

122121
await expectDeviceIntentExecutor();
123-
expect(screen.queryByTestId("contacts-add-address-review")).not.toBeInTheDocument();
122+
expect(screen.queryByTestId("contacts-add-address-confirm")).not.toBeInTheDocument();
124123
});
125124

126125
it("should open the device intent executor alone when renaming a contact", async () => {

apps/ledger-live-desktop/src/mvvm/features/Contacts/__integrations__/Contacts.integration.test.tsx

Lines changed: 1 addition & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -577,24 +577,8 @@ describe("Contacts integration", () => {
577577
await user.type(addressNameInput, "Exchange");
578578
await user.click(confirmationButton);
579579

580-
expect(screen.getByRole("dialog")).toBe(dialog);
581-
expect(screen.getByTestId("contacts-add-address-review")).toBeVisible();
582-
583-
await user.click(screen.getByRole("button", { name: "Go back" }));
584-
expect(screen.getByTestId("contacts-add-address-input")).toBeVisible();
585-
expect(screen.getByTestId("contacts-add-address-name-input")).toHaveValue("Exchange");
586-
587-
await user.click(screen.getByTestId("contacts-add-address-confirm"));
588-
await user.click(screen.getByTestId("contacts-add-address-review-continue"));
589-
590-
await waitFor(() => {
591-
expect(screen.getByTestId("contacts-add-address-success")).toBeVisible();
592-
});
593-
594-
await user.click(screen.getByTestId("contacts-add-address-success-continue"));
595-
596580
await waitFor(() => {
597-
expect(screen.queryByTestId("contacts-add-address-success")).not.toBeInTheDocument();
581+
expect(screen.queryByRole("dialog")).not.toBeInTheDocument();
598582
expect(
599583
within(screen.getByTestId("contacts-detail-screen")).getByText("1 address"),
600584
).toBeVisible();

apps/ledger-live-desktop/src/mvvm/features/Contacts/hooks/prefillAddAddress/PrefillAddAddressFlowRoot.tsx

Lines changed: 11 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -8,19 +8,24 @@ import {
88
import {
99
isPrefillAddAddressFlowOpen,
1010
usePrefillAddAddressFlow,
11-
type AddAddressCompletionLabels,
1211
type ContactsAddAddressNameLabels,
1312
type ContactsAddAddressReviewLabels,
1413
} from "@features/flow-contacts-add-address";
15-
import { createMockContactDeviceIntentsPort } from "@features/platform-contacts";
14+
import { getMinVersion } from "@ledgerhq/live-common/apps/support";
15+
import { useContactsIntentsOrchestrator } from "@features/platform-contacts/device";
16+
import { DeviceIntentExecutorLWD } from "LLD/components/DeviceIntentExecutor";
17+
import { contactsIntentLWDDefinitions } from "../../deviceIntents/contactsIntentPlatformDefinitions";
1618
import { ContactsAddAddressFlowDialog } from "../../screens/Contacts/components/ContactsAddAddressFlowDialog";
1719
import type { ContactsAddAddressFlowDialogProps } from "../../screens/Contacts/components/ContactsAddAddressFlowDialog/types";
1820
import { useContactsAddressValidationAdapter } from "../useContactsAddressValidationAdapter";
1921

2022
export function PrefillAddAddressFlowRoot(): React.JSX.Element | null {
2123
const { t } = useTranslation();
2224
const addressValidation = useContactsAddressValidationAdapter();
23-
const deviceIntents = useMemo(() => createMockContactDeviceIntentsPort(), []);
25+
const { deviceIntents, dieProps } = useContactsIntentsOrchestrator({
26+
intents: contactsIntentLWDDefinitions,
27+
getLiveConfigMinVersion: getMinVersion,
28+
});
2429
const { state, updateAddressLabel, continueFromName, onBack, onClose, saveFromReview } =
2530
usePrefillAddAddressFlow({ addressValidation, deviceIntents });
2631

@@ -52,15 +57,9 @@ export function PrefillAddAddressFlowRoot(): React.JSX.Element | null {
5257
}),
5358
[t],
5459
);
55-
const completionLabels = useMemo<AddAddressCompletionLabels>(
56-
() => ({
57-
title: t("contacts.addAddressReview.title"),
58-
continue: t("contacts.addAddressReview.continue"),
59-
successTitle: t("contacts.addAddressReview.successTitle"),
60-
close: t("contacts.addAddressReview.close"),
61-
}),
62-
[t],
63-
);
60+
if (dieProps?.enabled === true) {
61+
return <DeviceIntentExecutorLWD sourceFlow="contacts" {...dieProps} />;
62+
}
6463

6564
if (!isPrefillAddAddressFlowOpen(state)) {
6665
return null;
@@ -87,15 +86,13 @@ export function PrefillAddAddressFlowRoot(): React.JSX.Element | null {
8786
},
8887
nameLabels,
8988
reviewLabels,
90-
completionLabels,
9189
onAddressChange: () => undefined,
9290
onContinueFromAddressDetails: () => undefined,
9391
onAddressLabelChange: updateAddressLabel,
9492
onContinueFromName: continueFromName,
9593
onContinueFromReview: () => {
9694
void saveFromReview();
9795
},
98-
onCompleteMockConfirmation: () => undefined,
9996
onBack,
10097
onClose,
10198
};

apps/ledger-live-desktop/src/mvvm/features/Contacts/screens/Contacts/components/ContactsAddAddressFlowDialog/ContactsAddAddressFlowDialog.tsx

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -15,13 +15,11 @@ export function ContactsAddAddressFlowDialog({
1515
sanctionedAddressBanner,
1616
nameLabels,
1717
reviewLabels,
18-
completionLabels,
1918
onAddressChange,
2019
onContinueFromAddressDetails,
2120
onAddressLabelChange,
2221
onContinueFromName,
2322
onContinueFromReview,
24-
onCompleteMockConfirmation,
2523
onBack,
2624
onClose,
2725
}: ContactsAddAddressFlowDialogProps): React.JSX.Element | null {
@@ -40,18 +38,15 @@ export function ContactsAddAddressFlowDialog({
4038
modularDialog.content
4139
) : (
4240
<ContactsAddAddressFlowContent
43-
completionLabels={completionLabels}
4441
entryLabels={entryLabels}
4542
sanctionedAddressBanner={sanctionedAddressBanner}
4643
nameLabels={nameLabels}
4744
reviewLabels={reviewLabels}
4845
onAddressChange={onAddressChange}
4946
onAddressLabelChange={onAddressLabelChange}
50-
onClose={onClose}
5147
onContinueFromAddressDetails={onContinueFromAddressDetails}
5248
onContinueFromName={onContinueFromName}
5349
onContinueFromReview={onContinueFromReview}
54-
onCompleteMockConfirmation={onCompleteMockConfirmation}
5550
state={state}
5651
/>
5752
);

apps/ledger-live-desktop/src/mvvm/features/Contacts/screens/Contacts/components/ContactsAddAddressFlowDialog/types.ts

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
import type {
2-
AddAddressCompletionLabels,
32
AddAddressEntryLabels,
43
AddAddressFlowState,
54
AddAddressInputSource,
@@ -14,13 +13,11 @@ export type ContactsAddAddressFlowDialogProps = Readonly<{
1413
sanctionedAddressBanner: SanctionedAddressBannerProps;
1514
nameLabels: ContactsAddAddressNameLabels;
1615
reviewLabels: ContactsAddAddressReviewLabels;
17-
completionLabels: AddAddressCompletionLabels;
1816
onAddressChange: (address: string, inputMethod: AddAddressInputSource) => void;
1917
onContinueFromAddressDetails: () => void;
2018
onAddressLabelChange: (value: string) => void;
2119
onContinueFromName: () => void;
2220
onContinueFromReview: () => void;
23-
onCompleteMockConfirmation: () => void;
2421
onBack: () => void;
2522
onClose: () => void;
2623
}>;

0 commit comments

Comments
 (0)