Files
workoutsplus/WorkoutsPlus/Components/ItemPicker.swift

69 lines
1.5 KiB
Swift

//
// ItemPicker.swift
// WorkoutsPlus
// Advanced Version of Picker.pickerStyle(NavigationLinkPickerStyle()) that's searchable and has a ContentUnavailableView
//
// Created by Felix Förtsch on 10.09.24.
//
import SwiftUI
struct ItemPicker<Item: Nameable>: View {
@Environment(\.dismiss) private var dismiss
@Binding var selectedItem: Item?
var items: [Item]
@State private var searchText = ""
var filteredItems: [Item] {
if searchText.isEmpty {
return items
} else {
return items.filter { $0.name.localizedCaseInsensitiveContains(searchText) }
}
}
var body: some View {
List {
ForEach(filteredItems) { item in
HStack {
Text(item.name)
Spacer()
if item == selectedItem {
Image(systemName: "checkmark")
.foregroundColor(.blue)
}
}
// This .contentShape makes the whole row tappable
.contentShape(Rectangle())
.onTapGesture {
selectedItem = item
dismiss()
}
}
}
.searchable(text: $searchText)
.overlay {
if filteredItems.isEmpty {
ContentUnavailableView.search(text: searchText)
}
}
}
}
private struct Item: Nameable {
var id = UUID()
var name: String
}
#Preview {
@Previewable @State var selectedItem: Item? = nil
NavigationStack {
ItemPicker<Item>(selectedItem: $selectedItem, items: [
Item(name: "Item 1"),
Item(name: "Item 2"),
Item(name: "Item 3")
])
}
}