Skip to content

Commit

Permalink
Merge pull request #909 from Infomaniak/unread-filter
Browse files Browse the repository at this point in the history
fix(UnreadFilter): Delete message on iPad
  • Loading branch information
Ambrdctr committed Aug 3, 2023
2 parents 0766c9c + 89579ab commit e1202d2
Show file tree
Hide file tree
Showing 2 changed files with 31 additions and 52 deletions.
8 changes: 8 additions & 0 deletions Mail/Views/SplitView.swift
Original file line number Diff line number Diff line change
Expand Up @@ -78,6 +78,14 @@ struct SplitView: View {

if let thread = navigationState.threadPath.last {
ThreadView(thread: thread)
.onChange(of: thread) { newValue in
if newValue.hasUnseenMessages {
Task {
try? await mailboxManager
.toggleRead(threads: [newValue])
}
}
}
} else {
EmptyStateView.emptyThread(from: splitViewManager.selectedFolder)
}
Expand Down
75 changes: 23 additions & 52 deletions Mail/Views/Thread List/ThreadListViewModel+Observation.swift
Original file line number Diff line number Diff line change
Expand Up @@ -61,21 +61,7 @@ extension ThreadListViewModel {
}
}
case .update(let results, _, _, _):
let filteredThreads = Array(results.freezeIfNeeded())
guard let newSections = sortThreadsIntoSections(threads: filteredThreads) else { return }

DispatchQueue.main.sync {
self.nextThreadIfNeeded(from: filteredThreads)
self.filteredThreads = filteredThreads
if self.filter != .all,
filteredThreads.count == 1,
!self.filter.accepts(thread: filteredThreads[0]) {
self.filter = .all
}
withAnimation {
self.sections = newSections
}
}
updateThreadResults(results: results)
case .error:
break
}
Expand Down Expand Up @@ -107,6 +93,25 @@ extension ThreadListViewModel {
observationLastUpdateToken?.invalidate()
}

private func updateThreadResults(results: Results<Thread>) {
let filteredThreads = Array(results.freezeIfNeeded())
guard let newSections = sortThreadsIntoSections(threads: filteredThreads)
else { return }

DispatchQueue.main.sync {
self.nextThreadIfNeeded(from: filteredThreads)
self.filteredThreads = filteredThreads
if self.filter != .all,
filteredThreads.count == 1,
!self.filter.accepts(thread: filteredThreads[0]) {
self.filter = .all
}
withAnimation {
self.sections = newSections
}
}
}

// MARK: - Observe filtered results

static let containAnyOfUIDs = "uid IN %@"
Expand All @@ -125,7 +130,7 @@ extension ThreadListViewModel {

let containAnyOf = NSPredicate(format: Self.containAnyOfUIDs, allThreadsUIDs)
let realm = mailboxManager.getRealm()
let allThreads = realm.objects(Thread.self).filter(containAnyOf)
let allThreads = realm.objects(Thread.self).filter(containAnyOf).sorted(by: \.date, ascending: false)

observeFilteredThreadsToken = allThreads.observe(on: observeQueue) { [weak self] changes in
guard let self else {
Expand All @@ -135,8 +140,8 @@ extension ThreadListViewModel {
switch changes {
case .initial:
break
case .update(let all, _, _, let modificationIndexes):
refreshInFilterMode(all: all, changes: modificationIndexes)
case .update(let results, _, _, _):
updateThreadResults(results: results)
case .error:
break
}
Expand All @@ -147,40 +152,6 @@ extension ThreadListViewModel {
observeFilteredThreadsToken?.invalidate()
}

/// Update filtered threads on observation change.
private func refreshInFilterMode(all: Results<Thread>, changes: [Int]) {
for index in changes {
let updatedThread = all[index]
let uid = updatedThread.uid

let threadToUpdate: Thread? = sections.reduce(nil as Thread?) { partialResult, section in
partialResult ?? section.threads.first { $0.uid == uid }
}

let sectionToUpdate = sections.first { section in
section.threads.contains { $0.uid == uid }
}

guard let threadToUpdate,
let sectionToUpdate else {
continue
}

let threadToUpdateIndex = sectionToUpdate.threads.firstIndex(of: threadToUpdate)
guard let threadToUpdateIndex else {
continue
}

sectionToUpdate.threads[threadToUpdateIndex] = updatedThread.freeze()

Task {
await MainActor.run {
objectWillChange.send()
}
}
}
}

// MARK: - Observe unread count

/// Observe the unread count to disable filtering when it reaches 0
Expand Down

0 comments on commit e1202d2

Please sign in to comment.