fix loading of labels in labels modal
This commit is contained in:
@ -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
|
||||
|
||||
@ -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?) {
|
||||
|
||||
Reference in New Issue
Block a user