diff --git a/src/libs/actions/Policy/Member.ts b/src/libs/actions/Policy/Member.ts index 25dd8e134aa7..2560e94ad028 100644 --- a/src/libs/actions/Policy/Member.ts +++ b/src/libs/actions/Policy/Member.ts @@ -678,7 +678,8 @@ function buildUpdateWorkspaceMembersRoleOnyxData(policy: OnyxEntry, sele failureData.push(...(preferredExporterOnyxData.failureData ?? [])); } - const adminRoom = ReportUtils.getAllPolicyReports(policyID).find(ReportUtils.isAdminRoom); + const policyReports = ReportUtils.getAllPolicyReports(policyID); + const adminRoom = policyReports.find(ReportUtils.isAdminRoom); if (adminRoom) { const failureDataParticipants: Record = {...adminRoom.participants}; const optimisticParticipants: Record = {}; @@ -716,6 +717,48 @@ function buildUpdateWorkspaceMembersRoleOnyxData(policy: OnyxEntry, sele } } + if (newRole === CONST.POLICY.ROLE.GUEST) { + for (const report of policyReports) { + if (!ReportUtils.isUserCreatedPolicyRoom(report) || report?.visibility !== CONST.REPORT.VISIBILITY.RESTRICTED) { + continue; + } + const reportActions = allReportActions?.[`${ONYXKEYS.COLLECTION.REPORT_ACTIONS}${report.reportID}`] ?? {}; + const invitedAccountIDs = new Set(); + for (const action of Object.values(reportActions)) { + if (!ReportActionsUtils.isInviteMemberAction(action)) { + continue; + } + for (const targetAccountID of ReportActionsUtils.getOriginalMessage(action)?.targetAccountIDs ?? []) { + invitedAccountIDs.add(targetAccountID); + } + } + const optimisticParticipants: Record = {}; + const failureDataParticipants: Record = {...report.participants}; + for (const accountID of selectedMemberAccountIDs) { + if (!report.participants?.[accountID] || invitedAccountIDs.has(accountID)) { + continue; + } + optimisticParticipants[accountID] = null; + } + if (!isEmptyObject(optimisticParticipants)) { + optimisticData.push({ + onyxMethod: Onyx.METHOD.MERGE, + key: `${ONYXKEYS.COLLECTION.REPORT}${report.reportID}`, + value: { + participants: optimisticParticipants, + }, + }); + failureData.push({ + onyxMethod: Onyx.METHOD.MERGE, + key: `${ONYXKEYS.COLLECTION.REPORT}${report.reportID}`, + value: { + participants: failureDataParticipants, + }, + }); + } + } + } + return {optimisticData, successData, failureData, memberRoles}; } diff --git a/tests/actions/PolicyMemberTest.ts b/tests/actions/PolicyMemberTest.ts index 332f9f26b14e..4eaef413ab53 100644 --- a/tests/actions/PolicyMemberTest.ts +++ b/tests/actions/PolicyMemberTest.ts @@ -115,7 +115,36 @@ describe('actions/PolicyMember', () => { }, }; + const selfJoinedRoom: Report = { + ...createRandomReport(10, CONST.REPORT.CHAT_TYPE.POLICY_ROOM), + policyID: policy.id, + visibility: CONST.REPORT.VISIBILITY.RESTRICTED, + participants: { + [member.accountID]: {notificationPreference: CONST.REPORT.NOTIFICATION_PREFERENCE.ALWAYS}, + }, + }; + const invitedRoom: Report = { + ...createRandomReport(11, CONST.REPORT.CHAT_TYPE.POLICY_ROOM), + policyID: policy.id, + visibility: CONST.REPORT.VISIBILITY.RESTRICTED, + participants: { + [member.accountID]: {notificationPreference: CONST.REPORT.NOTIFICATION_PREFERENCE.ALWAYS}, + }, + }; + await Onyx.set(`${ONYXKEYS.COLLECTION.POLICY}${policy.id}`, policy); + await Onyx.set(`${ONYXKEYS.COLLECTION.REPORT}${selfJoinedRoom.reportID}`, selfJoinedRoom); + await Onyx.set(`${ONYXKEYS.COLLECTION.REPORT}${invitedRoom.reportID}`, invitedRoom); + await Onyx.set(`${ONYXKEYS.COLLECTION.REPORT_ACTIONS}${invitedRoom.reportID}`, { + inviteAction1: { + reportActionID: 'inviteAction1', + actionName: CONST.REPORT.ACTIONS.TYPE.ROOM_CHANGE_LOG.INVITE_TO_ROOM, + created: '2026-01-01 00:00:00.000', + originalMessage: { + targetAccountIDs: [member.accountID], + }, + }, + }); mockFetch?.pause?.(); Member.updateWorkspaceMembersRole(policy, [memberLogin], [member.accountID], CONST.POLICY.ROLE.GUEST); await waitForBatchedUpdates(); @@ -124,6 +153,12 @@ describe('actions/PolicyMember', () => { expect(optimisticPolicy?.employeeList?.[memberLogin]?.role).toBe(CONST.POLICY.ROLE.GUEST); expect(optimisticPolicy?.employeeList?.[memberLogin]?.pendingAction).toBe(CONST.RED_BRICK_ROAD_PENDING_ACTION.UPDATE); + const optimisticSelfJoinedRoom = await getOnyxValue(`${ONYXKEYS.COLLECTION.REPORT}${selfJoinedRoom.reportID}`); + expect(optimisticSelfJoinedRoom?.participants?.[member.accountID]).toBeUndefined(); + + const optimisticInvitedRoom = await getOnyxValue(`${ONYXKEYS.COLLECTION.REPORT}${invitedRoom.reportID}`); + expect(optimisticInvitedRoom?.participants?.[member.accountID]?.notificationPreference).toBe(CONST.REPORT.NOTIFICATION_PREFERENCE.ALWAYS); + await mockFetch?.resume?.(); });