113 lines
3.7 KiB
Swift
113 lines
3.7 KiB
Swift
//
|
|
// CreateWorkoutItemPicker.swift
|
|
// Werkout_ios
|
|
//
|
|
// Created by Trey Tartt on 6/25/23.
|
|
//
|
|
|
|
import SwiftUI
|
|
import Combine
|
|
|
|
struct CreateWorkoutItemPickerModel {
|
|
let id: Int
|
|
let name: String
|
|
}
|
|
|
|
class CreateWorkoutItemPickerViewModel: Identifiable, ObservableObject {
|
|
let allValues: [CreateWorkoutItemPickerModel]
|
|
@Published var selectedIds: [Int]
|
|
|
|
init(allValues: [CreateWorkoutItemPickerModel], selectedIds: [Int]) {
|
|
self.allValues = allValues
|
|
self.selectedIds = selectedIds
|
|
}
|
|
|
|
func toggleAll() {
|
|
if selectedIds.isEmpty {
|
|
selectedIds.append(contentsOf: allValues.map({ $0.id }))
|
|
} else {
|
|
selectedIds.removeAll()
|
|
}
|
|
}
|
|
}
|
|
|
|
struct CreateWorkoutItemPickerView: View {
|
|
@ObservedObject var viewModel: CreateWorkoutItemPickerViewModel
|
|
var completed: (([Int]) -> Void)
|
|
@Environment(\.dismiss) var dismiss
|
|
@State var searchString: String = ""
|
|
|
|
var body: some View {
|
|
VStack {
|
|
List() {
|
|
ForEach(viewModel.allValues, id:\.self.id) { value in
|
|
if searchString.isEmpty || value.name.lowercased().contains(searchString.lowercased()) {
|
|
HStack {
|
|
Circle()
|
|
.stroke(.blue, lineWidth: 1)
|
|
.background(Circle().fill(viewModel.selectedIds.contains(value.id) ? .blue :.clear))
|
|
.frame(width: 33, height: 33)
|
|
|
|
Text(value.name)
|
|
}
|
|
.contentShape(Rectangle())
|
|
.onTapGesture {
|
|
if viewModel.selectedIds.contains(value.id) {
|
|
if let idx = viewModel.selectedIds.firstIndex(of: value.id){
|
|
viewModel.selectedIds.remove(at: idx)
|
|
}
|
|
} else {
|
|
viewModel.selectedIds.append(value.id)
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
TextField("Filter", text: $searchString)
|
|
.padding()
|
|
|
|
HStack {
|
|
Button(action: {
|
|
viewModel.toggleAll()
|
|
}, label: {
|
|
Image(systemName: "checklist")
|
|
.font(.title)
|
|
})
|
|
.frame(maxWidth: 44, alignment: .center)
|
|
.frame(height: 44)
|
|
.foregroundColor(.green)
|
|
.background(.white)
|
|
.cornerRadius(8)
|
|
.padding()
|
|
|
|
Button(action: {
|
|
completed(viewModel.selectedIds)
|
|
dismiss()
|
|
}, label: {
|
|
Text("done")
|
|
})
|
|
.frame(maxWidth: .infinity, alignment: .center)
|
|
.frame(height: 44)
|
|
.foregroundColor(.blue)
|
|
.background(.yellow)
|
|
.cornerRadius(8)
|
|
.padding()
|
|
.frame(maxWidth: .infinity)
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
struct CreateWorkoutItemPickerView_Previews: PreviewProvider {
|
|
static let fakeValues = [CreateWorkoutItemPickerModel(id: 1, name: "one"),
|
|
CreateWorkoutItemPickerModel(id: 2, name: "two"),
|
|
CreateWorkoutItemPickerModel(id: 3, name: "three")]
|
|
|
|
static var previews: some View {
|
|
CreateWorkoutItemPickerView(viewModel: CreateWorkoutItemPickerViewModel(allValues: fakeValues, selectedIds: [1]), completed: { selectedIds in
|
|
|
|
})
|
|
}
|
|
}
|