import Foundation import Combine #if canImport(WidgetKit) import WidgetKit #endif final class TaskStore: ObservableObject { static let groupIdentifier = "group.com.example.utrello" private static let tasksKey = "tasks" @Published private(set) var tasks: [TaskItem] { didSet { save() } } init() { tasks = Self.loadTasks() } func add(title: String, to list: TaskList = .todo) { let title = title.trimmingCharacters(in: .whitespacesAndNewlines) guard !title.isEmpty else { return } tasks.insert(TaskItem(title: title, list: list), at: 0) } func move(_ task: TaskItem, to list: TaskList) { guard let index = tasks.firstIndex(of: task) else { return } tasks[index].list = list } func delete(_ task: TaskItem) { tasks.removeAll { $0.id == task.id } } private func save() { guard let data = try? JSONEncoder().encode(tasks) else { return } Self.defaults.set(data, forKey: Self.tasksKey) #if canImport(WidgetKit) WidgetCenter.shared.reloadTimelines(ofKind: "UTrelloTasksWidget") #endif } static func loadTasks() -> [TaskItem] { guard let data = defaults.data(forKey: tasksKey), let tasks = try? JSONDecoder().decode([TaskItem].self, from: data) else { return [] } return tasks } private static var defaults: UserDefaults { UserDefaults(suiteName: groupIdentifier) ?? .standard } }