Files
2026-02-26 21:24:20 -05:00

85 lines
2.1 KiB
Swift

import Foundation
import SwiftUI
@Observable
final class TodoViewModel {
var todos: [Todo] = []
var currentFilter: TodoFilter = .all
// MARK: - Computed Properties
var filteredTodos: [Todo] {
switch currentFilter {
case .all:
return todos
case .active:
return todos.filter { !$0.completed }
case .done:
return todos.filter { $0.completed }
}
}
var allCount: Int {
todos.count
}
var activeCount: Int {
todos.filter { !$0.completed }.count
}
var doneCount: Int {
todos.filter { $0.completed }.count
}
func count(for filter: TodoFilter) -> Int {
switch filter {
case .all: return allCount
case .active: return activeCount
case .done: return doneCount
}
}
// MARK: - Initialization
init() {
loadTodos()
}
// MARK: - Actions
func loadTodos() {
todos = DatabaseManager.shared.loadTodos()
}
func addTodo(title: String, category: String, priority: Priority) {
if let todo = DatabaseManager.shared.insertTodo(title: title, category: category, priority: priority) {
todos.insert(todo, at: 0)
}
}
func updateTodo(id: Int64, title: String, category: String, priority: Priority) {
DatabaseManager.shared.updateTodo(id: id, title: title, category: category, priority: priority)
if let index = todos.firstIndex(where: { $0.id == id }) {
todos[index].title = title
todos[index].category = category
todos[index].priority = priority
}
}
func toggleTodo(id: Int64) {
if let index = todos.firstIndex(where: { $0.id == id }) {
todos[index].completed.toggle()
DatabaseManager.shared.toggleTodo(id: id, completed: todos[index].completed)
}
}
func deleteTodo(id: Int64) {
DatabaseManager.shared.deleteTodo(id: id)
todos.removeAll { $0.id == id }
}
func setFilter(_ filter: TodoFilter) {
currentFilter = filter
}
}