66//
77
88import Foundation
9+ import Combine
910
1011@Observable
1112final class HomeViewModel : Store {
@@ -15,6 +16,7 @@ final class HomeViewModel: Store {
1516 }
1617 var recentTodos : [ RecentTodoItem ] = [ ]
1718 var webPages : [ WebPageItem ] = [ ]
19+ var isNetworkConnected : Bool = true
1820 var showContentPicker : Bool = false
1921 var showTodoEditor : Bool = false
2022 var showSearchView : Bool = false
@@ -35,6 +37,7 @@ final class HomeViewModel: Store {
3537
3638 enum Action {
3739 case onAppear
40+ case networkStatusChanged( Bool )
3841 case setPresentation( Presentation , Bool )
3942 case setAlert( isPresented: Bool , type: AlertType ? = nil )
4043 case setToast( isPresented: Bool , type: ToastType ? = nil )
@@ -96,30 +99,38 @@ final class HomeViewModel: Store {
9699 private let undoDeleteWebPageUseCase : UndoDeleteWebPageUseCase
97100 private let fetchTodosUseCase : FetchTodosUseCase
98101 private let fetchWebPagesUseCase : FetchWebPagesUseCase
102+ private let networkConnectivityUseCase : ObserveNetworkConnectivityUseCase
99103 private let loadingState = LoadingState ( )
100104 private var deletedWebPageURLString : String ?
105+ private var cancellables = Set < AnyCancellable > ( )
101106
102107 init (
103108 addWebPageUseCase: AddWebPageUseCase ,
104109 deleteWebPageUseCase: DeleteWebPageUseCase ,
105110 undoDeleteWebPageUseCase: UndoDeleteWebPageUseCase ,
106111 upsertTodoUseCase: UpsertTodoUseCase ,
107112 fetchTodosUseCase: FetchTodosUseCase ,
108- fetchWebPagesUseCase: FetchWebPagesUseCase
113+ fetchWebPagesUseCase: FetchWebPagesUseCase ,
114+ networkConnectivityUseCase: ObserveNetworkConnectivityUseCase
109115 ) {
110116 self . addWebPageUseCase = addWebPageUseCase
111117 self . deleteWebPageUseCase = deleteWebPageUseCase
112118 self . undoDeleteWebPageUseCase = undoDeleteWebPageUseCase
113119 self . upsertTodoUseCase = upsertTodoUseCase
114120 self . fetchTodosUseCase = fetchTodosUseCase
115121 self . fetchWebPagesUseCase = fetchWebPagesUseCase
122+ self . networkConnectivityUseCase = networkConnectivityUseCase
123+
124+ setupNetworkObserving ( )
116125 }
117126
118127 func reduce( with action: Action ) -> [ SideEffect ] {
119128 var state = self . state
120129 var effects : [ SideEffect ] = [ ]
121130
122131 switch action {
132+ case . networkStatusChanged( let isConnected) :
133+ state. isNetworkConnected = isConnected
123134 case . onAppear, . setPresentation, . setAlert, . setToast, . tapTodoCategory,
124135 . orderTodoCategoryPreferences, . addTodo, . updateWebPageURLInput,
125136 . addWebPage, . deleteWebPage, . undoDeleteWebPage:
@@ -432,4 +443,14 @@ private extension HomeViewModel {
432443 self ? . send ( . setLoading( target, isLoading) )
433444 }
434445 }
446+
447+ func setupNetworkObserving( ) {
448+ networkConnectivityUseCase. observe ( )
449+ . removeDuplicates ( )
450+ . receive ( on: DispatchQueue . main)
451+ . sink { [ weak self] isConnected in
452+ self ? . send ( . networkStatusChanged( isConnected) )
453+ }
454+ . store ( in: & cancellables)
455+ }
435456}
0 commit comments