From 1210d7c86b2caec3e7f15be4d0cd27e9d9b0d0fe Mon Sep 17 00:00:00 2001 From: shum Date: Wed, 22 Apr 2026 13:13:15 +0000 Subject: [PATCH] ios: remove member items from chat when fullDelete is on --- apps/ios/Shared/Model/ChatModel.swift | 77 ++++++++++++++++++++------- 1 file changed, 57 insertions(+), 20 deletions(-) diff --git a/apps/ios/Shared/Model/ChatModel.swift b/apps/ios/Shared/Model/ChatModel.swift index 9c23ac6307..d84ea0e873 100644 --- a/apps/ios/Shared/Model/ChatModel.swift +++ b/apps/ios/Shared/Model/ChatModel.swift @@ -809,6 +809,63 @@ final class ChatModel: ObservableObject { } func removeMemberItems(_ removedMember: GroupMember, byMember: GroupMember, _ groupInfo: GroupInfo) { + func isMemberItem(_ item: ChatItem) -> Bool { + if case .groupSnd = item.chatDir, removedMember.groupMemberId == groupInfo.membership.groupMemberId { + return true + } else if case let .groupRcv(groupMember) = item.chatDir, groupMember.groupMemberId == removedMember.groupMemberId { + return true + } + return false + } + + let cInfo = ChatInfo.group(groupInfo: groupInfo, groupChatScope: nil) + // When fullDelete is on, items are fully deleted from DB by backend — + // remove them from UI immediately so no "moderated" bubbles are shown. + if groupInfo.fullGroupPreferences.fullDelete.on { + // Update chat list preview + if let chat = getChat(groupInfo.id), + chat.chatItems.count > 0, + isMemberItem(chat.chatItems[0]) { + chat.chatItems = [ChatItem.deletedItemDummy()] + } + // Remove from open chat view + if chatId == groupInfo.id { + var indicesToRemove: [Int] = [] + for i in 0.. ChatItem? { + if !isMemberItem(item) { return nil } + var updatedItem = item + updatedItem.meta.itemDeleted = .moderated(deletedTs: Date.now, byGroupMember: byMember) + if item.isActiveReport { + decreaseGroupReportsCounter(groupInfo.id) + } + return updatedItem + } if chatId == groupInfo.id { for i in 0.. ChatItem? { - let newContent: CIContent - if case .groupSnd = item.chatDir, removedMember.groupMemberId == groupInfo.membership.groupMemberId { - newContent = .sndModerated - } else if case let .groupRcv(groupMember) = item.chatDir, groupMember.groupMemberId == removedMember.groupMemberId { - newContent = .rcvModerated - } else { - return nil - } - var updatedItem = item - updatedItem.meta.itemDeleted = .moderated(deletedTs: Date.now, byGroupMember: byMember) - if groupInfo.fullGroupPreferences.fullDelete.on { - updatedItem.content = newContent - } - if item.isActiveReport { - decreaseGroupReportsCounter(groupInfo.id) - } - return updatedItem - } } func nextChatItemData(_ chatItemId: Int64, previous: Bool, map: @escaping (ChatItem) -> T?) -> T? {