54 lines
1.5 KiB
Swift
54 lines
1.5 KiB
Swift
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
|
|
}
|
|
}
|