ListlessiOS/Extensions/ItemListView+Undo.swift (2457B)
1import SwiftUI
2
3extension ItemListView {
4
5 func deleteItemWithUndo(itemID: UUID) {
6 deleteItem(itemID: itemID)
7 showUndoToast(message: "Item deleted")
8 }
9
10 func deleteSelectedItemWithUndo() -> KeyPress.Result {
11 guard focusedField == .scrollView else {
12 return .ignored
13 }
14 guard let currentID = fState.selectedItemID else {
15 return .handled
16 }
17 guard allItemsInDisplayOrder.contains(where: { $0.id == currentID }) else {
18 return .handled
19 }
20 deleteItemWithUndo(itemID: currentID)
21 return .handled
22 }
23
24 func deleteAllItemsWithUndo() {
25 let ids = items.map(\.id)
26 guard !ids.isEmpty else { return }
27 let count = ids.count
28 managedObjectContext.undoManager?.beginUndoGrouping()
29 do {
30 try store.deleteMultiple(itemIDs: ids)
31 } catch {
32 presentStoreError(error)
33 managedObjectContext.undoManager?.endUndoGrouping()
34 return
35 }
36 managedObjectContext.undoManager?.endUndoGrouping()
37 fState.pruneDeletedItems(displayOrder: allItemsInDisplayOrder.map(\.id))
38 let noun = count == 1 ? "item" : "items"
39 showUndoToast(message: "\(count) \(noun) deleted")
40 }
41
42 func clearCompletedItemsWithUndo() {
43 let ids = completedItems.map(\.id)
44 guard !ids.isEmpty else { return }
45 let count = ids.count
46 managedObjectContext.undoManager?.beginUndoGrouping()
47 do {
48 try store.deleteMultiple(itemIDs: ids)
49 } catch {
50 presentStoreError(error)
51 managedObjectContext.undoManager?.endUndoGrouping()
52 return
53 }
54 managedObjectContext.undoManager?.endUndoGrouping()
55 fState.pruneDeletedItems(displayOrder: allItemsInDisplayOrder.map(\.id))
56 let noun = count == 1 ? "item" : "items"
57 showUndoToast(message: "\(count) \(noun) cleared")
58 }
59
60 func showUndoToast(message: String) {
61 withAnimation {
62 iState.undoToast = UndoToastData(id: UUID(), message: message)
63 }
64 }
65
66 func performUndo() {
67 managedObjectContext.undoManager?.undo()
68 do {
69 try store.save()
70 } catch {
71 presentStoreError(error)
72 }
73 dismissUndoToast()
74 }
75
76 func dismissUndoToast() {
77 withAnimation {
78 iState.undoToast = nil
79 }
80 }
81}