diff --git a/src/libs/actions/Domain.ts b/src/libs/actions/Domain.ts index 8e055c30bff3..ed3599eb8894 100644 --- a/src/libs/actions/Domain.ts +++ b/src/libs/actions/Domain.ts @@ -540,10 +540,12 @@ function clearToggleConsolidatedDomainBillingErrors(domainAccountID: number) { }); } -function addAdminToDomain(domainAccountID: number, accountID: number, targetEmail: string, domainName: string) { +function addAdminToDomain(domainAccountID: number, accountID: number, targetEmail: string, domainName: string, isOptimisticAccount: boolean) { const PERMISSION_KEY = `${CONST.DOMAIN.EXPENSIFY_ADMIN_ACCESS_PREFIX}${accountID}`; - const optimisticData: Array> = [ + const optimisticData: Array< + OnyxUpdate + > = [ { onyxMethod: Onyx.METHOD.MERGE, key: `${ONYXKEYS.COLLECTION.DOMAIN}${domainAccountID}`, @@ -575,7 +577,24 @@ function addAdminToDomain(domainAccountID: number, accountID: number, targetEmai }, ]; - const successData: Array> = [ + if (isOptimisticAccount) { + optimisticData.push({ + onyxMethod: Onyx.METHOD.MERGE, + key: `${ONYXKEYS.PERSONAL_DETAILS_LIST}`, + value: { + [accountID]: { + accountID, + login: targetEmail, + displayName: targetEmail, + isOptimisticPersonalDetail: true, + }, + }, + }); + } + + const successData: Array< + OnyxUpdate + > = [ { onyxMethod: Onyx.METHOD.MERGE, key: `${ONYXKEYS.COLLECTION.DOMAIN}${domainAccountID}`, @@ -605,7 +624,7 @@ function addAdminToDomain(domainAccountID: number, accountID: number, targetEmai }, ]; - const failureData: Array> = [ + const failureData: Array> = [ { onyxMethod: Onyx.METHOD.MERGE, key: `${ONYXKEYS.COLLECTION.DOMAIN_ERRORS}${domainAccountID}`, @@ -628,6 +647,18 @@ function addAdminToDomain(domainAccountID: number, accountID: number, targetEmai }, ]; + if (isOptimisticAccount) { + const clearOptimisticPersonalDetails: OnyxUpdate = { + onyxMethod: Onyx.METHOD.MERGE, + key: `${ONYXKEYS.PERSONAL_DETAILS_LIST}`, + value: { + [accountID]: null, + }, + }; + successData.push(clearOptimisticPersonalDetails); + failureData.push(clearOptimisticPersonalDetails); + } + const params: AddAdminToDomainParams = { domainName, targetEmail, diff --git a/src/pages/domain/Admins/DomainAddAdminPage.tsx b/src/pages/domain/Admins/DomainAddAdminPage.tsx index 62331830ad66..202074feab09 100644 --- a/src/pages/domain/Admins/DomainAddAdminPage.tsx +++ b/src/pages/domain/Admins/DomainAddAdminPage.tsx @@ -71,7 +71,7 @@ function DomainAddAdminPage({route}: DomainAddAdminProps) { } didInvite.current = true; - addAdminToDomain(domainAccountID, currentlySelectedUser.accountID, currentlySelectedUser.login, domainName); + addAdminToDomain(domainAccountID, currentlySelectedUser.accountID, currentlySelectedUser.login, domainName, !!currentlySelectedUser.isOptimisticAccount); Navigation.dismissModal(); }; diff --git a/tests/actions/DomainTest.ts b/tests/actions/DomainTest.ts index 2af961096ede..b7f9454bb27c 100644 --- a/tests/actions/DomainTest.ts +++ b/tests/actions/DomainTest.ts @@ -1,5 +1,6 @@ import Onyx from 'react-native-onyx'; import { + addAdminToDomain, addMemberToDomain, clearDomainErrors, clearDomainMemberError, @@ -187,6 +188,75 @@ describe('actions/Domain', () => { apiWriteSpy.mockRestore(); }); + it('addAdminToDomain - adds and clears optimistic personal details for optimistic accounts', () => { + const apiWriteSpy = jest.spyOn(require('@libs/API'), 'write').mockImplementation(() => Promise.resolve()); + const domainAccountID = 123; + const accountID = 456; + const targetEmail = 'test@example.com'; + const domainName = 'test.com'; + + addAdminToDomain(domainAccountID, accountID, targetEmail, domainName, true); + + expect(apiWriteSpy).toHaveBeenCalledWith( + WRITE_COMMANDS.ADD_DOMAIN_ADMIN, + {domainName, targetEmail}, + { + optimisticData: expect.arrayContaining([ + expect.objectContaining({ + key: ONYXKEYS.PERSONAL_DETAILS_LIST, + value: { + [accountID]: { + accountID, + login: targetEmail, + displayName: targetEmail, + isOptimisticPersonalDetail: true, + }, + }, + }), + ]), + successData: expect.arrayContaining([ + expect.objectContaining({ + key: ONYXKEYS.PERSONAL_DETAILS_LIST, + value: {[accountID]: null}, + }), + ]), + failureData: expect.arrayContaining([ + expect.objectContaining({ + key: ONYXKEYS.PERSONAL_DETAILS_LIST, + value: {[accountID]: null}, + }), + ]), + }, + ); + + apiWriteSpy.mockRestore(); + }); + + it('addAdminToDomain - does not update optimistic personal details for non-optimistic accounts', () => { + const apiWriteSpy = jest.spyOn(require('@libs/API'), 'write').mockImplementation(() => Promise.resolve()); + const domainAccountID = 123; + const accountID = 456; + const targetEmail = 'test@example.com'; + const domainName = 'test.com'; + + addAdminToDomain(domainAccountID, accountID, targetEmail, domainName, false); + + expect(apiWriteSpy).toHaveBeenCalledWith( + WRITE_COMMANDS.ADD_DOMAIN_ADMIN, + {domainName, targetEmail}, + expect.objectContaining({ + // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment + optimisticData: expect.not.arrayContaining([expect.objectContaining({key: ONYXKEYS.PERSONAL_DETAILS_LIST})]), + // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment + successData: expect.not.arrayContaining([expect.objectContaining({key: ONYXKEYS.PERSONAL_DETAILS_LIST})]), + // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment + failureData: expect.not.arrayContaining([expect.objectContaining({key: ONYXKEYS.PERSONAL_DETAILS_LIST})]), + }), + ); + + apiWriteSpy.mockRestore(); + }); + it('clearAddMemberError - clears member errors and optimistic data', async () => { const domainAccountID = 123; const email = 'test@example.com';