add native examples
This commit is contained in:
@@ -0,0 +1,90 @@
|
||||
import SwiftUI
|
||||
|
||||
struct ContentView: View {
|
||||
@State private var viewModel = TodoViewModel()
|
||||
@State private var showingAddSheet = false
|
||||
@State private var editingTodo: Todo? = nil
|
||||
|
||||
var body: some View {
|
||||
NavigationStack {
|
||||
VStack(spacing: 0) {
|
||||
// Filter bar
|
||||
FilterBar(
|
||||
currentFilter: viewModel.currentFilter,
|
||||
countForFilter: { viewModel.count(for: $0) },
|
||||
onFilterSelected: { viewModel.setFilter($0) }
|
||||
)
|
||||
|
||||
Divider()
|
||||
|
||||
// Todo list or empty state
|
||||
if viewModel.filteredTodos.isEmpty {
|
||||
EmptyStateView()
|
||||
} else {
|
||||
List {
|
||||
ForEach(viewModel.filteredTodos) { todo in
|
||||
TodoItemView(
|
||||
todo: todo,
|
||||
onToggle: {
|
||||
viewModel.toggleTodo(id: todo.id)
|
||||
},
|
||||
onTap: {
|
||||
editingTodo = todo
|
||||
}
|
||||
)
|
||||
.listRowInsets(EdgeInsets())
|
||||
.listRowSeparator(.visible)
|
||||
}
|
||||
.onDelete { indexSet in
|
||||
let filtered = viewModel.filteredTodos
|
||||
for index in indexSet {
|
||||
let todo = filtered[index]
|
||||
viewModel.deleteTodo(id: todo.id)
|
||||
}
|
||||
}
|
||||
}
|
||||
.listStyle(.plain)
|
||||
}
|
||||
}
|
||||
.navigationTitle("Todos \u{2013} SwiftUI")
|
||||
.navigationBarTitleDisplayMode(.large)
|
||||
.toolbar {
|
||||
ToolbarItem(placement: .primaryAction) {
|
||||
Button {
|
||||
showingAddSheet = true
|
||||
} label: {
|
||||
Image(systemName: "plus")
|
||||
.fontWeight(.semibold)
|
||||
}
|
||||
}
|
||||
}
|
||||
.sheet(isPresented: $showingAddSheet) {
|
||||
TodoFormView(
|
||||
editingTodo: nil,
|
||||
onSave: { title, category, priority in
|
||||
viewModel.addTodo(title: title, category: category, priority: priority)
|
||||
showingAddSheet = false
|
||||
},
|
||||
onCancel: {
|
||||
showingAddSheet = false
|
||||
}
|
||||
)
|
||||
.presentationDetents([.medium, .large])
|
||||
}
|
||||
.sheet(item: $editingTodo) { todo in
|
||||
TodoFormView(
|
||||
editingTodo: todo,
|
||||
onSave: { title, category, priority in
|
||||
viewModel.updateTodo(id: todo.id, title: title, category: category, priority: priority)
|
||||
editingTodo = nil
|
||||
},
|
||||
onCancel: {
|
||||
editingTodo = nil
|
||||
}
|
||||
)
|
||||
.presentationDetents([.medium, .large])
|
||||
}
|
||||
}
|
||||
.tint(Color(red: 0x62/255.0, green: 0x00/255.0, blue: 0xEE/255.0))
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user