// /* * SwiftFin is subject to the terms of the Mozilla Public * License, v2.0. If a copy of the MPL was not distributed with this * file, you can obtain one at https://mozilla.org/MPL/2.0/. * * Copyright 2021 Aiden Vigue & Jellyfin Contributors */ import Foundation import SwiftUI private struct SearchablePickerView: View { @Environment(\.presentationMode) var presentationMode let options: [Selectable] let optionToString: (Selectable) -> String let label: String @State var text = "" @Binding var selected: Selectable var body: some View { VStack { SearchBar(text: $text) List(options.filter { guard !text.isEmpty else { return true } return optionToString($0).lowercased().contains(text.lowercased()) }, id: \.self) { selectable in Button(action: { selected = selectable presentationMode.wrappedValue.dismiss() }) { HStack { Text(optionToString(selectable)).foregroundColor(Color.primary) Spacer() if selected == selectable { Image(systemName: "checkmark").foregroundColor(.accentColor) } } } }.listStyle(GroupedListStyle()) } } } struct SearchablePicker: View { let label: String let options: [Selectable] let optionToString: (Selectable) -> String @Binding var selected: Selectable var body: some View { NavigationLink(destination: searchablePickerView()) { HStack { Text(label) Spacer() Text(optionToString(selected)) .foregroundColor(.gray) .multilineTextAlignment(.trailing) } } } private func searchablePickerView() -> some View { SearchablePickerView(options: options, optionToString: optionToString, label: label, selected: $selected) } }