@@ -11,6 +11,8 @@ import OrderedCollections
1111@Observable
1212final class TodoEditorViewModel : Store {
1313 private struct Draft : Equatable {
14+ let isCompleted : Bool
15+ let completedAt : Date ?
1416 let isPinned : Bool
1517 let title : String
1618 let content : String
@@ -19,6 +21,8 @@ final class TodoEditorViewModel: Store {
1921 let kind : TodoKind
2022
2123 init ( todo: Todo ) {
24+ self . isCompleted = todo. isCompleted
25+ self . completedAt = todo. completedAt
2226 self . isPinned = todo. isPinned
2327 self . title = todo. title
2428 self . content = todo. content
@@ -28,6 +32,8 @@ final class TodoEditorViewModel: Store {
2832 }
2933
3034 init ( state: State ) {
35+ self . isCompleted = state. isCompleted
36+ self . completedAt = state. completedAt
3137 self . isPinned = state. isPinned
3238 self . title = state. title
3339 self . content = state. content
@@ -38,6 +44,8 @@ final class TodoEditorViewModel: Store {
3844 }
3945
4046 struct State : Equatable {
47+ var isCompleted : Bool = false
48+ var completedAt : Date ?
4149 var isPinned : Bool = false
4250 var title : String = " "
4351 var content : String = " "
@@ -61,6 +69,7 @@ final class TodoEditorViewModel: Store {
6169 case addTag( String )
6270 case removeTag( String )
6371 case setContent( String )
72+ case setCompleted( Bool )
6473 case setDueDate( Date ? )
6574 case setKind( TodoKind )
6675 case setPinned( Bool )
@@ -78,7 +87,6 @@ final class TodoEditorViewModel: Store {
7887 private let isCompleted : Bool
7988 private let isChecked : Bool
8089 private let createdAt : Date ?
81- private let completedAt : Date ?
8290 private let originalDraft : Draft ?
8391
8492 var navigationTitle : String {
@@ -104,7 +112,6 @@ final class TodoEditorViewModel: Store {
104112 self . isCompleted = false
105113 self . isChecked = false
106114 self . createdAt = nil
107- self . completedAt = nil
108115 self . originalDraft = nil
109116 state. kind = kind
110117 }
@@ -115,8 +122,9 @@ final class TodoEditorViewModel: Store {
115122 self . isCompleted = todo. isCompleted
116123 self . isChecked = todo. isChecked
117124 self . createdAt = todo. createdAt
118- self . completedAt = todo. completedAt
119125 self . originalDraft = Draft ( todo: todo)
126+ state. isCompleted = todo. isCompleted
127+ state. completedAt = todo. completedAt
120128 state. isPinned = todo. isPinned
121129 state. title = todo. title
122130 state. content = todo. content
@@ -145,6 +153,11 @@ final class TodoEditorViewModel: Store {
145153 } else {
146154 state. dueDate = nil
147155 }
156+ case . setCompleted( let isCompleted) :
157+ if state. isCompleted != isCompleted {
158+ state. completedAt = isCompleted ? Date ( ) : nil
159+ }
160+ state. isCompleted = isCompleted
148161 case . setKind( let todoKind) :
149162 state. kind = todoKind
150163 case . setPinned( let isPinned) :
@@ -183,13 +196,13 @@ extension TodoEditorViewModel {
183196 return Todo (
184197 id: self . id,
185198 isPinned: state. isPinned,
186- isCompleted: self . isCompleted,
199+ isCompleted: state . isCompleted,
187200 isChecked: self . isChecked,
188201 title: state. title,
189202 content: state. content,
190203 createdAt: self . createdAt ?? date,
191204 updatedAt: date,
192- completedAt: self . completedAt,
205+ completedAt: state . completedAt,
193206 dueDate: state. dueDate,
194207 tags: state. tags. map { $0 } ,
195208 kind: state. kind
0 commit comments