Files
Nextcloud-Cookbook-iOS/Nextcloud Cookbook iOS Client/Views/KeywordPickerView.swift

128 lines
4.2 KiB
Swift

//
// KeywordPickerView.swift
// Nextcloud Cookbook iOS Client
//
// Created by Vincent Meilinger on 03.10.23.
//
import Foundation
import SwiftUI
struct Keyword: Identifiable {
let id = UUID()
let name: String
init(_ name: String) {
self.name = name
}
}
struct KeywordPickerView: View {
@State var title: String
@State var searchSuggestions: [Keyword]
@Binding var selection: [String]
@State var searchText: String = ""
var columns: [GridItem] = [GridItem(.adaptive(minimum: 150), spacing: 5)]
var body: some View {
VStack(alignment: .leading) {
TextField(title, text: $searchText)
.textFieldStyle(.roundedBorder)
.padding()
ScrollView {
LazyVGrid(columns: columns, spacing: 5) {
if searchText != "" {
KeywordItemView(
keyword: Keyword(searchText),
isSelected: selection.contains(searchText)
) { keyword in
if selection.contains(keyword.name) {
selection.removeAll(where: { s in
s == keyword.name ? true : false
})
searchSuggestions.removeAll(where: { s in
s.name == keyword.name ? true : false
})
} else {
selection.append(keyword.name)
}
}
}
ForEach(suggestionsFiltered(), id: \.id) { suggestion in
KeywordItemView(
keyword: suggestion,
isSelected: selection.contains(suggestion.name)
) { keyword in
if selection.contains(keyword.name) {
selection.removeAll(where: { s in
s == keyword.name ? true : false
})
} else {
selection.append(keyword.name)
}
}
}
}
Divider().padding()
HStack {
Text("Selected keywords:")
.font(.headline)
.padding()
Spacer()
}
LazyVGrid(columns: columns, spacing: 5) {
ForEach(selection, id: \.self) { suggestion in
KeywordItemView(
keyword: Keyword(suggestion),
isSelected: true
) { keyword in
if selection.contains(keyword.name) {
selection.removeAll(where: { s in
s == keyword.name ? true : false
})
} else {
selection.append(keyword.name)
}
}
}
}
Spacer()
}
}
.navigationTitle(title)
}
func suggestionsFiltered() -> [Keyword] {
guard searchText != "" else { return searchSuggestions }
return searchSuggestions.filter { suggestion in
suggestion.name.lowercased().contains(searchText.lowercased())
}
}
}
struct KeywordItemView: View {
var keyword: Keyword
var isSelected: Bool
var tapped: (Keyword) -> ()
var body: some View {
HStack {
if isSelected {
Image(systemName: "checkmark.circle.fill")
}
Text(keyword.name)
.lineLimit(2)
}
.padding()
.background(
RoundedRectangle(cornerRadius: 15)
.foregroundStyle(Color("backgroundHighlight"))
)
.onTapGesture {
tapped(keyword)
}
}
}