fix loading of labels in labels modal

This commit is contained in:
Satindar Dhillon
2022-04-23 19:49:55 -07:00
parent 65b448f262
commit dc733c3ac2
2 changed files with 27 additions and 33 deletions

View File

@ -33,7 +33,6 @@ struct ApplyLabelsView: View {
@EnvironmentObject var dataService: DataService
@Environment(\.presentationMode) private var presentationMode
@StateObject var viewModel = LabelsViewModel()
@State private var labelSearchFilter = ""
var innerBody: some View {
List {
@ -41,7 +40,7 @@ struct ApplyLabelsView: View {
if viewModel.selectedLabels.isEmpty {
Text("No labels are currently assigned.")
}
ForEach(viewModel.selectedLabels.applySearchFilter(labelSearchFilter), id: \.self) { label in
ForEach(viewModel.selectedLabels.applySearchFilter(viewModel.labelSearchFilter), id: \.self) { label in
HStack {
TextChip(feedItemLabel: label)
Spacer()
@ -57,7 +56,7 @@ struct ApplyLabelsView: View {
}
}
Section(header: Text("Available Labels")) {
ForEach(viewModel.unselectedLabels.applySearchFilter(labelSearchFilter), id: \.self) { label in
ForEach(viewModel.unselectedLabels.applySearchFilter(viewModel.labelSearchFilter), id: \.self) { label in
HStack {
TextChip(feedItemLabel: label)
Spacer()
@ -128,7 +127,7 @@ struct ApplyLabelsView: View {
#if os(iOS)
innerBody
.searchable(
text: $labelSearchFilter,
text: $viewModel.labelSearchFilter,
placement: .navigationBarDrawer(displayMode: .always)
)
#else

View File

@ -12,43 +12,38 @@ final class LabelsViewModel: ObservableObject {
@Published var unselectedLabels = [LinkedItemLabel]()
@Published var labels = [LinkedItemLabel]()
@Published var showCreateEmailModal = false
@Published var labelSearchFilter = ""
var subscriptions = Set<AnyCancellable>()
/// Loads initial set of labels when a edit labels list is displayed
/// - Parameters:
/// - dataService: `DataService` reference
/// - item: Optional `FeedItem` for applying labels to a single item
/// - initiallySelectedLabels: Optional `[FeedItemLabel]` for filtering a list of items
func loadLabels(
dataService _: DataService,
item _: LinkedItem? = nil,
initiallySelectedLabels _: [LinkedItemLabel]? = nil
dataService: DataService,
item: LinkedItem? = nil,
initiallySelectedLabels: [LinkedItemLabel]? = nil
) {
guard !hasLoadedInitialLabels else { return }
isLoading = true
// dataService.labelsPublisher().sink(
// receiveCompletion: { _ in },
// receiveValue: { [weak self] allLabels in
// self?.isLoading = false
// self?.labels = allLabels
// self?.hasLoadedInitialLabels = true
// if let item = item {
// self?.selectedLabels = item.labels.asArray(of: LinkedItemLabel.self)
// self?.unselectedLabels = allLabels.filter { label in
// !item.labels.contains(where: { $0.id == label.id })
// }
// }
// if let initiallySelectedLabels = initiallySelectedLabels {
// self?.selectedLabels = initiallySelectedLabels
// self?.unselectedLabels = allLabels.filter { label in
// !initiallySelectedLabels.contains(where: { $0.id == label.id })
// }
// }
// }
// )
// .store(in: &subscriptions)
dataService.labelsPublisher().sink(
receiveCompletion: { _ in },
receiveValue: { [weak self] labelIDs in
guard let self = self else { return }
dataService.viewContext.performAndWait {
self.labels = labelIDs.compactMap { dataService.viewContext.object(with: $0) as? LinkedItemLabel }
}
let selLabels = initiallySelectedLabels ?? item?.labels.asArray(of: LinkedItemLabel.self) ?? []
for label in self.labels {
if selLabels.contains(label) {
self.selectedLabels.append(label)
} else {
self.unselectedLabels.append(label)
}
}
self.hasLoadedInitialLabels = true
self.isLoading = false
}
)
.store(in: &subscriptions)
}
func createLabel(dataService _: DataService, name _: String, color _: Color, description _: String?) {