Skip to content

Commit bd9a7e5

Browse files
committed
feat: HomeView에서 네트워크가 끊어지면 컨텐츠를 추가하는 버튼을 잠금
1 parent 36541a7 commit bd9a7e5

3 files changed

Lines changed: 25 additions & 2 deletions

File tree

DevLog/Presentation/ViewModel/HomeViewModel.swift

Lines changed: 22 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
//
77

88
import Foundation
9+
import Combine
910

1011
@Observable
1112
final 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
}

DevLog/UI/Common/MainView.swift

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,8 @@ struct MainView: View {
1919
undoDeleteWebPageUseCase: container.resolve(UndoDeleteWebPageUseCase.self),
2020
upsertTodoUseCase: container.resolve(UpsertTodoUseCase.self),
2121
fetchTodosUseCase: container.resolve(FetchTodosUseCase.self),
22-
fetchWebPagesUseCase: container.resolve(FetchWebPagesUseCase.self)
22+
fetchWebPagesUseCase: container.resolve(FetchWebPagesUseCase.self),
23+
networkConnectivityUseCase: container.resolve(ObserveNetworkConnectivityUseCase.self)
2324
))
2425
.tabItem {
2526
Image(systemName: "house.fill")

DevLog/UI/Home/HomeView.swift

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -259,6 +259,7 @@ struct HomeView: View {
259259
} label: {
260260
Image(systemName: "plus")
261261
}
262+
.disabled(!viewModel.state.isNetworkConnected)
262263
}
263264
if #available(iOS 26.0, *) {
264265
ToolbarSpacer(.fixed, placement: .topBarTrailing)

0 commit comments

Comments
 (0)