@@ -11,7 +11,7 @@ import Foundation
1111final class HomeViewModel : Store {
1212 struct State : Equatable {
1313 var todoKindPreferences = TodoKind . allCases. map { TodoKindPreference ( kind: $0, isVisible: true ) }
14- var pinnedTodos : [ PinnedTodoItem ] = [ ]
14+ var recentTodos : [ RecentTodoItem ] = [ ]
1515 var webPages : [ WebPageItem ] = [ ]
1616 var showContentPicker : Bool = false
1717 var showTodoEditor : Bool = false
@@ -21,7 +21,7 @@ final class HomeViewModel: Store {
2121 var searchText : String = " "
2222 var isSearching : Bool = false
2323 var reorderTodo : Bool = false
24- var isPinnedLoading : Bool = false
24+ var isRecentTodosLoading : Bool = false
2525 var isWebPageLoading : Bool = false
2626 var isWebPageInputLoading : Bool = false
2727 var showAlert : Bool = false
@@ -51,9 +51,9 @@ final class HomeViewModel: Store {
5151 case undoDeleteWebPage
5252 case confirmDeleteWebPage
5353 case setToast( isPresented: Bool , type: ToastType ? = nil )
54- case fetchPinnedTodos ( [ PinnedTodoItem ] )
54+ case fetchRecentTodos ( [ RecentTodoItem ] )
5555 case fetchWebPages( [ WebPageItem ] )
56- case setPinnedLoading ( Bool )
56+ case setRecentTodosLoading ( Bool )
5757 case setWebPageLoading( Bool )
5858 case setWebPageInputLoading( Bool )
5959 }
@@ -62,7 +62,7 @@ final class HomeViewModel: Store {
6262 case upsertTodo( Todo )
6363 case addWebPage( String )
6464 case deleteWebPage( String )
65- case fetchPinnedTodos
65+ case fetchRecentTodos
6666 case fetchWebPages
6767 case showModalAfterDelay( ModalType )
6868 }
@@ -119,7 +119,7 @@ final class HomeViewModel: Store {
119119 . addWebPage, . confirmDeleteWebPage:
120120 effects = reduceByView ( action, state: & state)
121121
122- case . fetchPinnedTodos , . fetchWebPages, . setPinnedLoading ,
122+ case . fetchRecentTodos , . fetchWebPages, . setRecentTodosLoading ,
123123 . setWebPageLoading, . setWebPageInputLoading:
124124 effects = reduceByRun ( action, state: & state)
125125 }
@@ -134,6 +134,27 @@ final class HomeViewModel: Store {
134134 Task {
135135 do {
136136 try await upsertTodoUseCase. execute ( todo)
137+ let page = try await fetchRecentTodos ( )
138+ let items = page. items
139+ . filter { $0. createdAt != $0. updatedAt }
140+ . prefix ( 5 )
141+ . map { RecentTodoItem ( from: $0) }
142+ send ( . fetchRecentTodos( items) )
143+ } catch {
144+ send ( . setAlert( isPresented: true , type: . error) )
145+ }
146+ }
147+ case . fetchRecentTodos:
148+ Task {
149+ do {
150+ defer { send ( . setRecentTodosLoading( false ) ) }
151+ send ( . setRecentTodosLoading( true ) )
152+ let page = try await fetchRecentTodos ( )
153+ let items = page. items
154+ . filter { $0. createdAt != $0. updatedAt }
155+ . prefix ( 5 )
156+ . map { RecentTodoItem ( from: $0) }
157+ send ( . fetchRecentTodos( items) )
137158 } catch {
138159 send ( . setAlert( isPresented: true , type: . error) )
139160 }
@@ -164,18 +185,6 @@ final class HomeViewModel: Store {
164185 send ( . setAlert( isPresented: true , type: . error) )
165186 }
166187 }
167- case . fetchPinnedTodos:
168- Task {
169- do {
170- defer { send ( . setPinnedLoading( false ) ) }
171- send ( . setPinnedLoading( true ) )
172- let page = try await fetchTodosUseCase. execute ( TodoQuery ( isPinned: true ) , cursor: nil )
173- let todos = page. items
174- send ( . fetchPinnedTodos( todos. map { PinnedTodoItem ( from: $0) } ) )
175- } catch {
176- send ( . setAlert( isPresented: true , type: . error) )
177- }
178- }
179188 case . fetchWebPages:
180189 Task {
181190 do {
@@ -249,7 +258,7 @@ private extension HomeViewModel {
249258 func reduceByView( _ action: Action , state: inout State ) -> [ SideEffect ] {
250259 switch action {
251260 case . onAppear:
252- return [ . fetchPinnedTodos , . fetchWebPages]
261+ return [ . fetchRecentTodos , . fetchWebPages]
253262 case . updateSearching( let isSearching) :
254263 state. isSearching = isSearching
255264 case . updateSearchText( let text) :
@@ -275,8 +284,8 @@ private extension HomeViewModel {
275284
276285 func reduceByRun( _ action: Action , state: inout State ) -> [ SideEffect ] {
277286 switch action {
278- case . fetchPinnedTodos ( let todos) :
279- state. pinnedTodos = todos
287+ case . fetchRecentTodos ( let todos) :
288+ state. recentTodos = todos
280289 case . fetchWebPages( let pages) :
281290 let filteredPages : [ WebPageItem ]
282291 if let ( pendingPage, _) = pendingTask {
@@ -285,8 +294,8 @@ private extension HomeViewModel {
285294 filteredPages = pages
286295 }
287296 state. webPages = filteredPages
288- case . setPinnedLoading ( let isLoading) :
289- state. isPinnedLoading = isLoading
297+ case . setRecentTodosLoading ( let isLoading) :
298+ state. isRecentTodosLoading = isLoading
290299 case . setWebPageLoading( let isLoading) :
291300 state. isWebPageLoading = isLoading
292301 case . setWebPageInputLoading( let isLoading) :
@@ -350,4 +359,15 @@ private extension HomeViewModel {
350359 }
351360 return " https:// " + trimmed
352361 }
362+
363+ func fetchRecentTodos( ) async throws -> TodoPage {
364+ try await fetchTodosUseCase. execute (
365+ TodoQuery (
366+ sortTarget: . updatedAt,
367+ sortOrder: . latest,
368+ pageSize: 100
369+ ) ,
370+ cursor: nil
371+ )
372+ }
353373}
0 commit comments