Files
workoutsplus/WorkoutsPlus/Components/ItemPicker.swift
T

61 lines
1.3 KiB
Swift

//
// ItemPicker.swift
// WorkoutsPlus
//
// Created by Felix Förtsch on 10.09.24.
//
import SwiftUI
import SwiftData
struct ItemPicker<Item: Nameable>: View {
@Environment(\.dismiss) private var dismiss
@State private var searchText = ""
var filteredItems: [Item] {
if searchText.isEmpty {
return items
} else {
return items.filter { $0.name.localizedCaseInsensitiveContains(searchText) }
}
}
var items: [Item]
@Binding var selectedItem: Item?
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)
}
}
}
}
#Preview {
@Previewable @State var selectedWorkout: Workout? = nil
NavigationStack {
ItemPicker<Workout>(items: Workout.sampleData, selectedItem: $selectedWorkout)
}
.modelContainer(SampleData.shared.modelContainer)
}