diff --git a/frontend/src/lib/services/icrc-accounts.services.ts b/frontend/src/lib/services/icrc-accounts.services.ts index 735a2909c8..57f98ebe21 100644 --- a/frontend/src/lib/services/icrc-accounts.services.ts +++ b/frontend/src/lib/services/icrc-accounts.services.ts @@ -196,7 +196,7 @@ export const loadAccounts = async ({ } // hide unproven data - icrcAccountsStore.reset(); + icrcAccountsStore.resetUniverse(ledgerCanisterId); icrcTransactionsStore.resetUniverse(ledgerCanisterId); if ( diff --git a/frontend/src/lib/stores/icrc-accounts.store.ts b/frontend/src/lib/stores/icrc-accounts.store.ts index ddc8a9ee91..a9082dbd0e 100644 --- a/frontend/src/lib/stores/icrc-accounts.store.ts +++ b/frontend/src/lib/stores/icrc-accounts.store.ts @@ -1,4 +1,5 @@ import type { Account } from "$lib/types/account"; +import { removeKeys } from "$lib/utils/utils"; import type { Principal } from "@dfinity/principal"; import type { Readable } from "svelte/store"; import { writable } from "svelte/store"; @@ -21,6 +22,7 @@ export interface IcrcAccountsStore extends Readable { accounts: IcrcAccounts; ledgerCanisterId: Principal; }) => void; + resetUniverse: (ledgerCanisterId: Principal) => void; reset: () => void; } @@ -72,6 +74,15 @@ const initIcrcAccountsStore = (): IcrcAccountsStore => { })); }, + resetUniverse: (ledgerCanisterId: Principal) => { + update((currentState: IcrcAccountStoreData) => + removeKeys({ + obj: currentState, + keysToRemove: [ledgerCanisterId.toText()], + }) + ); + }, + reset: () => set(initialAccounts), }; }; diff --git a/frontend/src/tests/lib/services/icrc-accounts.services.spec.ts b/frontend/src/tests/lib/services/icrc-accounts.services.spec.ts index 8ff1515267..d9bcf458f0 100644 --- a/frontend/src/tests/lib/services/icrc-accounts.services.spec.ts +++ b/frontend/src/tests/lib/services/icrc-accounts.services.spec.ts @@ -217,6 +217,46 @@ describe("icrc-accounts-services", () => { ).toBeUndefined(); }); + it("should remove only failed account from the store", async () => { + vi.spyOn(ledgerApi, "queryIcrcBalance") + .mockResolvedValueOnce(mockCkBTCMainAccount.balanceUlps) + .mockRejectedValueOnce(new Error()); + icrcAccountsStore.set({ + accounts: { + accounts: [mockCkBTCMainAccount], + certified: true, + }, + ledgerCanisterId: ledgerCanisterId, + }); + icrcAccountsStore.set({ + accounts: { + accounts: [mockCkBTCMainAccount], + certified: false, + }, + ledgerCanisterId: ledgerCanisterId2, + }); + + expect(get(icrcAccountsStore)).toEqual({ + [ledgerCanisterId.toText()]: { + accounts: [mockCkBTCMainAccount], + certified: true, + }, + [ledgerCanisterId2.toText()]: { + accounts: [mockCkBTCMainAccount], + certified: false, + }, + }); + + await loadAccounts({ ledgerCanisterId }); + + expect(get(icrcAccountsStore)).toEqual({ + [ledgerCanisterId2.toText()]: { + accounts: [mockCkBTCMainAccount], + certified: false, + }, + }); + }); + it("displays a toast on error", async () => { vi.spyOn(ledgerApi, "queryIcrcBalance").mockRejectedValue( new Error("test") diff --git a/frontend/src/tests/lib/stores/icrc-accounts.store.spec.ts b/frontend/src/tests/lib/stores/icrc-accounts.store.spec.ts index 7e110655fb..b753c7a0e8 100644 --- a/frontend/src/tests/lib/stores/icrc-accounts.store.spec.ts +++ b/frontend/src/tests/lib/stores/icrc-accounts.store.spec.ts @@ -10,6 +10,7 @@ import { mockSnsMainAccount, mockSnsSubAccount, } from "$tests/mocks/sns-accounts.mock"; +import { principal } from "$tests/mocks/sns-projects.mock"; import { get } from "svelte/store"; describe("icrc Accounts store", () => { @@ -88,4 +89,46 @@ describe("icrc Accounts store", () => { certified: true, }); }); + + it("should reset for a project", () => { + const ledgerCanisterId1 = principal(0); + const ledgerCanisterId2 = principal(1); + const accounts: Account[] = [mockSnsMainAccount, mockSnsSubAccount]; + icrcAccountsStore.set({ + accounts: { + accounts, + certified: true, + }, + ledgerCanisterId: ledgerCanisterId1, + }); + icrcAccountsStore.set({ + accounts: { + accounts, + certified: false, + }, + ledgerCanisterId: ledgerCanisterId2, + }); + + expect(get(icrcAccountsStore)).toEqual({ + [ledgerCanisterId1.toText()]: { + accounts, + certified: true, + }, + [ledgerCanisterId2.toText()]: { + accounts, + certified: false, + }, + }); + + icrcAccountsStore.resetUniverse(ledgerCanisterId1); + expect(get(icrcAccountsStore)).toEqual({ + [ledgerCanisterId2.toText()]: { + accounts, + certified: false, + }, + }); + + icrcAccountsStore.resetUniverse(ledgerCanisterId2); + expect(get(icrcAccountsStore)).toEqual({}); + }); });