mirror of
https://github.com/simplex-chat/simplex-chat.git
synced 2025-06-28 20:29:53 +00:00
ios: add chat to created list (#5407)
* ios: add chat to created list * do not include muted chats in unread tags
This commit is contained in:
parent
0160d57e58
commit
ba601552d2
4 changed files with 60 additions and 47 deletions
|
@ -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 } }
|
||||
|
|
|
@ -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))")
|
||||
|
|
|
@ -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 {
|
||||
|
|
|
@ -717,7 +717,7 @@ struct ChatTagsView: View {
|
|||
content: {
|
||||
AnyView(
|
||||
NavigationView {
|
||||
ChatListTag(chat: nil, showEditButton: true)
|
||||
ChatListTag(chat: nil)
|
||||
.modifier(ThemedBackground(grouped: true))
|
||||
}
|
||||
)
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue