From 23e8224b58917a5c1e47aab447a1ae1dc31ad4a2 Mon Sep 17 00:00:00 2001 From: Yusef Habib Fernandez Date: Tue, 25 Aug 2026 23:31:05 +0200 Subject: [PATCH] fix(address-book): base mutations on certified data --- .../address-book/AddAddressModal.svelte | 31 +++---- .../address-book/RemoveAddressModal.svelte | 18 ++-- .../modals/common/ConfirmationModal.svelte | 3 +- .../src/lib/services/address-book.services.ts | 60 +++++++++++-- .../address-book/AddAddressModal.spec.ts | 66 +++++++++----- .../address-book/RemoveAddressModal.spec.ts | 52 +++++++++++ .../services/address-book.services.spec.ts | 86 +++++++++++++++++++ 7 files changed, 263 insertions(+), 53 deletions(-) create mode 100644 frontend/src/tests/lib/modals/address-book/RemoveAddressModal.spec.ts create mode 100644 frontend/src/tests/lib/services/address-book.services.spec.ts diff --git a/frontend/src/lib/modals/address-book/AddAddressModal.svelte b/frontend/src/lib/modals/address-book/AddAddressModal.svelte index a89c0ea9c0d..8f3043a738d 100644 --- a/frontend/src/lib/modals/address-book/AddAddressModal.svelte +++ b/frontend/src/lib/modals/address-book/AddAddressModal.svelte @@ -97,6 +97,7 @@ const disableSave = $derived( nickname === "" || address === "" || + $addressBookStore.certified !== true || nonNullish(nicknameError) || nonNullish(addressError) || $busy || @@ -120,6 +121,10 @@ event.preventDefault(); normalizeNickname(); + if ($addressBookStore.certified !== true) { + return; + } + // Check if fields are empty after normalizing if (nickname === "" || address === "") { return; @@ -144,29 +149,21 @@ address: addressType, }; - // Create temporary array with the updated addresses - const currentAddresses = $addressBookStore.namedAddresses ?? []; - let updatedAddresses: NamedAddress[]; - - if (isEditMode) { - // In edit mode, find and replace the existing entry - updatedAddresses = currentAddresses.map((entry) => - normalizeName(entry.name) === normalizeName(namedAddress?.name ?? "") - ? updatedAddress - : entry - ); - } else { - // In add mode, append the new address - updatedAddresses = [...currentAddresses, updatedAddress]; - } - const initiator = isEditMode ? "edit-address-book-entry" : "add-address-book-entry"; startBusy({ initiator }); try { - const result = await saveAddressBook(updatedAddresses); + const result = await saveAddressBook( + isEditMode + ? { + type: "update", + previousName: namedAddress?.name ?? "", + address: updatedAddress, + } + : { type: "add", address: updatedAddress } + ); if (!result?.err) { toastsSuccess({ diff --git a/frontend/src/lib/modals/address-book/RemoveAddressModal.svelte b/frontend/src/lib/modals/address-book/RemoveAddressModal.svelte index 40bbc28a89c..1246728f118 100644 --- a/frontend/src/lib/modals/address-book/RemoveAddressModal.svelte +++ b/frontend/src/lib/modals/address-book/RemoveAddressModal.svelte @@ -8,7 +8,6 @@ import { toastsSuccess } from "$lib/stores/toasts.store"; import { replacePlaceholders } from "$lib/utils/i18n.utils"; import { IconErrorOutline } from "@dfinity/gix-components"; - import { isNullish } from "@dfinity/utils"; interface Props { onClose: () => void; @@ -18,19 +17,18 @@ const { onClose, namedAddress }: Props = $props(); const handleDeleteConfirm = async () => { - if (isNullish($addressBookStore.namedAddresses)) { + if ($addressBookStore.certified !== true) { return; } - const updatedAddresses = $addressBookStore.namedAddresses.filter( - (entry) => entry.name !== namedAddress.name - ); - const initiator = "delete-address-book-entry"; startBusy({ initiator }); try { - const result = await saveAddressBook(updatedAddresses); + const result = await saveAddressBook({ + type: "remove", + name: namedAddress.name, + }); if (!result?.err) { toastsSuccess({ @@ -47,7 +45,11 @@ }; - +

{replacePlaceholders($i18n.address_book.remove_address_title, { diff --git a/frontend/src/lib/modals/common/ConfirmationModal.svelte b/frontend/src/lib/modals/common/ConfirmationModal.svelte index eacfecb674a..f3524b02380 100644 --- a/frontend/src/lib/modals/common/ConfirmationModal.svelte +++ b/frontend/src/lib/modals/common/ConfirmationModal.svelte @@ -5,6 +5,7 @@ export let testId = "confirmation-modal-component"; export let yesLabel: string | undefined = undefined; + export let disabledConfirm = false; const dispatch = createEventDispatcher(); @@ -27,7 +28,7 @@