diff --git a/apps/ios/Shared/Model/ChatModel.swift b/apps/ios/Shared/Model/ChatModel.swift index 2784551361..31bacd1ba7 100644 --- a/apps/ios/Shared/Model/ChatModel.swift +++ b/apps/ios/Shared/Model/ChatModel.swift @@ -118,7 +118,7 @@ class ChatTagsModel: ObservableObject { newPresetTags[tag] = (newPresetTags[tag] ?? 0) + 1 } } - if chat.isUnread, let tags = chat.chatInfo.chatTags { + if chat.unreadTag, let tags = chat.chatInfo.chatTags { for tag in tags { newUnreadTags[tag] = (newUnreadTags[tag] ?? 0) + 1 } @@ -162,14 +162,14 @@ class ChatTagsModel: ObservableObject { } func markChatTagRead(_ chat: Chat) -> Void { - if chat.isUnread, let tags = chat.chatInfo.chatTags { + if chat.unreadTag, let tags = chat.chatInfo.chatTags { markChatTagRead_(chat, tags) } } func updateChatTagRead(_ chat: Chat, wasUnread: Bool) -> Void { guard let tags = chat.chatInfo.chatTags else { return } - let nowUnread = chat.isUnread + let nowUnread = chat.unreadTag if nowUnread && !wasUnread { for tag in tags { unreadTags[tag] = (unreadTags[tag] ?? 0) + 1 @@ -694,7 +694,7 @@ final class ChatModel: ObservableObject { // update preview let markedCount = chat.chatStats.unreadCount - unreadBelow if markedCount > 0 { - let wasUnread = chat.isUnread + let wasUnread = chat.unreadTag chat.chatStats.unreadCount -= markedCount ChatTagsModel.shared.updateChatTagRead(chat, wasUnread: wasUnread) self.decreaseUnreadCounter(user: self.currentUser!, by: markedCount) @@ -709,7 +709,7 @@ final class ChatModel: ObservableObject { func markChatUnread(_ cInfo: ChatInfo, unreadChat: Bool = true) { _updateChat(cInfo.id) { chat in - let wasUnread = chat.isUnread + let wasUnread = chat.unreadTag chat.chatStats.unreadChat = unreadChat ChatTagsModel.shared.updateChatTagRead(chat, wasUnread: wasUnread) } @@ -847,7 +847,7 @@ final class ChatModel: ObservableObject { } func changeUnreadCounter(_ chatIndex: Int, by count: Int) { - let wasUnread = chats[chatIndex].isUnread + let wasUnread = chats[chatIndex].unreadTag chats[chatIndex].chatStats.unreadCount = chats[chatIndex].chatStats.unreadCount + count ChatTagsModel.shared.updateChatTagRead(chats[chatIndex], wasUnread: wasUnread) changeUnreadCounter(user: currentUser!, by: count) @@ -1055,8 +1055,8 @@ final class Chat: ObservableObject, Identifiable, ChatLike { } } - var isUnread: Bool { - chatStats.unreadCount > 0 || chatStats.unreadChat + var unreadTag: Bool { + chatInfo.ntfsEnabled && (chatStats.unreadCount > 0 || chatStats.unreadChat) } var id: ChatId { get { chatInfo.id } } diff --git a/apps/ios/Shared/Views/Chat/ChatView.swift b/apps/ios/Shared/Views/Chat/ChatView.swift index ac4066d23e..32b4fab291 100644 --- a/apps/ios/Shared/Views/Chat/ChatView.swift +++ b/apps/ios/Shared/Views/Chat/ChatView.swift @@ -2009,6 +2009,7 @@ func updateChatSettings(_ chat: Chat, chatSettings: ChatSettings) { await MainActor.run { let wasFavorite = chat.chatInfo.chatSettings?.favorite ?? false ChatTagsModel.shared.updateChatFavorite(favorite: chatSettings.favorite, wasFavorite: wasFavorite) + let wasUnread = chat.unreadTag switch chat.chatInfo { case var .direct(contact): contact.chatSettings = chatSettings @@ -2018,6 +2019,7 @@ func updateChatSettings(_ chat: Chat, chatSettings: ChatSettings) { ChatModel.shared.updateGroup(groupInfo) default: () } + ChatTagsModel.shared.updateChatTagRead(chat, wasUnread: wasUnread) } } catch let error { logger.error("apiSetChatSettings error \(responseError(error))") diff --git a/apps/ios/Shared/Views/ChatList/ChatListNavLink.swift b/apps/ios/Shared/Views/ChatList/ChatListNavLink.swift index 6bf86840a8..117a8fa795 100644 --- a/apps/ios/Shared/Views/ChatList/ChatListNavLink.swift +++ b/apps/ios/Shared/Views/ChatList/ChatListNavLink.swift @@ -568,7 +568,6 @@ struct TagEditorNavParams { struct ChatListTag: View { var chat: Chat? = nil - var showEditButton: Bool = false @Environment(\.dismiss) var dismiss: DismissAction @EnvironmentObject var theme: AppTheme @EnvironmentObject var chatTagsModel: ChatTagsModel @@ -603,7 +602,7 @@ struct ChatListTag: View { .contentShape(Rectangle()) .onTapGesture { if let c = chat { - setTag(tagId: selected ? nil : tagId, chat: c) + setChatTag(tagId: selected ? nil : tagId, chat: c) { dismiss() } } else { tagEditorNavParams = TagEditorNavParams(chat: nil, chatListTag: ChatTagData(emoji: emoji, text: text), tagId: tagId) } @@ -665,7 +664,7 @@ struct ChatListTag: View { Label("Create list", systemImage: "plus") } } header: { - if showEditButton { + if chat == nil { editTagsButton() .textCase(nil) .frame(maxWidth: .infinity, alignment: .trailing) @@ -714,36 +713,6 @@ struct ChatListTag: View { } } - private func setTag(tagId: Int64?, chat: Chat) { - Task { - do { - let tagIds: [Int64] = if let t = tagId { [t] } else {[]} - let (userTags, chatTags) = try await apiSetChatTags( - type: chat.chatInfo.chatType, - id: chat.chatInfo.apiId, - tagIds: tagIds - ) - - await MainActor.run { - chatTagsModel.userTags = userTags - if var contact = chat.chatInfo.contact { - contact.chatTags = chatTags - m.updateContact(contact) - } else if var group = chat.chatInfo.groupInfo { - group.chatTags = chatTags - m.updateGroup(group) - } - dismiss() - } - } catch let error { - showAlert( - NSLocalizedString("Error saving chat list", comment: "alert title"), - message: responseError(error) - ) - } - } - } - private func deleteTag(_ tagId: Int64) { Task { try await apiDeleteChatTag(tagId: tagId) @@ -767,6 +736,37 @@ struct ChatListTag: View { } } +private func setChatTag(tagId: Int64?, chat: Chat, closeSheet: @escaping () -> Void) { + Task { + do { + let tagIds: [Int64] = if let t = tagId { [t] } else {[]} + let (userTags, chatTags) = try await apiSetChatTags( + type: chat.chatInfo.chatType, + id: chat.chatInfo.apiId, + tagIds: tagIds + ) + + await MainActor.run { + let m = ChatModel.shared + ChatTagsModel.shared.userTags = userTags + if var contact = chat.chatInfo.contact { + contact.chatTags = chatTags + m.updateContact(contact) + } else if var group = chat.chatInfo.groupInfo { + group.chatTags = chatTags + m.updateGroup(group) + } + closeSheet() + } + } catch let error { + showAlert( + NSLocalizedString("Error saving chat list", comment: "alert title"), + message: responseError(error) + ) + } + } +} + struct EmojiPickerView: UIViewControllerRepresentable { @Binding var selectedEmoji: String? @Binding var showingPicker: Bool @@ -817,11 +817,11 @@ struct EmojiPickerView: UIViewControllerRepresentable { } struct ChatListTagEditor: View { - var chat: Chat? = nil - var tagId: Int64? = nil @Environment(\.dismiss) var dismiss: DismissAction @EnvironmentObject var chatTagsModel: ChatTagsModel @EnvironmentObject var theme: AppTheme + var chat: Chat? = nil + var tagId: Int64? = nil var emoji: String? var name: String = "" @State private var newEmoji: String? @@ -860,7 +860,13 @@ struct ChatListTagEditor: View { createChatTag() } } label: { - Text(NSLocalizedString(tagId == nil ? "Create list" : "Save list", comment: "list editor button")) + Text( + chat != nil + ? "Add to list" + : tagId == nil + ? "Create list" + : "Save list" + ) } .disabled(saving != nil || (trimmedName == name && newEmoji == emoji) || trimmedName.isEmpty || isDuplicateEmojiOrName) } footer: { @@ -893,13 +899,18 @@ struct ChatListTagEditor: View { private func createChatTag() { Task { do { + let text = trimmedName let userTags = try await apiCreateChatTag( - tag: ChatTagData(emoji: newEmoji , text: trimmedName) + tag: ChatTagData(emoji: newEmoji , text: text) ) await MainActor.run { saving = false chatTagsModel.userTags = userTags - dismiss() + } + if let chat, let tag = userTags.first(where: { $0.chatTagText == text && $0.chatTagEmoji == newEmoji}) { + setChatTag(tagId: tag.chatTagId, chat: chat) { dismiss() } + } else { + await MainActor.run { dismiss() } } } catch let error { await MainActor.run { diff --git a/apps/ios/Shared/Views/ChatList/ChatListView.swift b/apps/ios/Shared/Views/ChatList/ChatListView.swift index 9cb87a4b22..edf9a3e5d2 100644 --- a/apps/ios/Shared/Views/ChatList/ChatListView.swift +++ b/apps/ios/Shared/Views/ChatList/ChatListView.swift @@ -717,7 +717,7 @@ struct ChatTagsView: View { content: { AnyView( NavigationView { - ChatListTag(chat: nil, showEditButton: true) + ChatListTag(chat: nil) .modifier(ThemedBackground(grouped: true)) } )