Skip to content

Commit b398b00

Browse files
committed
feat: SettingsView에서 네트워크가 끊어지면 서버와 연관된 버튼들은 비활성화
1 parent bd9a7e5 commit b398b00

4 files changed

Lines changed: 23 additions & 1 deletion

File tree

DevLog/Presentation/ViewModel/SettingViewModel.swift

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ final class SettingViewModel: Store {
1313
struct State: Equatable {
1414
var theme: SystemTheme = .automatic
1515
var dirSize: Int64 = 0
16+
var isNetworkConnected = true
1617
var isLoading = false
1718
var showAlert: Bool = false
1819
var alertTitle: String = ""
@@ -21,6 +22,7 @@ final class SettingViewModel: Store {
2122
}
2223

2324
enum Action {
25+
case networkStatusChanged(Bool)
2426
case setAlert(isPresented: Bool, type: AlertType? = nil)
2527
case setLoading(Bool)
2628
case setTheme(SystemTheme)
@@ -43,6 +45,7 @@ final class SettingViewModel: Store {
4345
private(set) var state = State()
4446
private let deleteAuthuseCase: DeleteAuthUseCase
4547
private let signOutUseCase: SignOutUseCase
48+
private let networkConnectivityUseCase: ObserveNetworkConnectivityUseCase
4649
private let systemThemeUseCase: ObserveSystemThemeUseCase
4750
private let updateSystemThemeUseCase: UpdateSystemThemeUseCase
4851
private let loadingState = LoadingState()
@@ -55,13 +58,16 @@ final class SettingViewModel: Store {
5558
init(
5659
deleteAuthUseCase: DeleteAuthUseCase,
5760
signOutUseCase: SignOutUseCase,
61+
networkConnectivityUseCase: ObserveNetworkConnectivityUseCase,
5862
systemThemeUseCase: ObserveSystemThemeUseCase,
5963
updateSystemThemeUseCase: UpdateSystemThemeUseCase
6064
) {
6165
self.deleteAuthuseCase = deleteAuthUseCase
6266
self.signOutUseCase = signOutUseCase
67+
self.networkConnectivityUseCase = networkConnectivityUseCase
6368
self.systemThemeUseCase = systemThemeUseCase
6469
self.updateSystemThemeUseCase = updateSystemThemeUseCase
70+
setupNetworkObserving()
6571
setupThemeMonitoring()
6672
}
6773

@@ -70,6 +76,8 @@ final class SettingViewModel: Store {
7076
var effects: [SideEffect] = []
7177

7278
switch action {
79+
case .networkStatusChanged(let isConnected):
80+
state.isNetworkConnected = isConnected
7381
case .setAlert(let isPresented, let type):
7482
setAlert(&state, isPresented: isPresented, type: type)
7583
case .setLoading(let value):
@@ -164,6 +172,16 @@ private extension SettingViewModel {
164172
.store(in: &cancellables)
165173
}
166174

175+
func setupNetworkObserving() {
176+
networkConnectivityUseCase.observe()
177+
.removeDuplicates()
178+
.receive(on: DispatchQueue.main)
179+
.sink { [weak self] isConnected in
180+
self?.send(.networkStatusChanged(isConnected))
181+
}
182+
.store(in: &cancellables)
183+
}
184+
167185
func dirSizeInBytes() -> Int64 {
168186
do {
169187
let cachesDir = try FileManager.default.url(

DevLog/UI/Home/TodoListView.swift

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -305,7 +305,6 @@ struct TodoListView: View {
305305
.onChange(of: geometry.size.height, initial: true) { _, height in
306306
headerHeight = height.rounded()
307307
}
308-
309308
}
310309
}
311310
}

DevLog/UI/Profile/ProfileView.swift

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -98,6 +98,7 @@ struct ProfileView: View {
9898
SettingView(viewModel: SettingViewModel(
9999
deleteAuthUseCase: container.resolve(DeleteAuthUseCase.self),
100100
signOutUseCase: container.resolve(SignOutUseCase.self),
101+
networkConnectivityUseCase: container.resolve(ObserveNetworkConnectivityUseCase.self),
101102
systemThemeUseCase: container.resolve(ObserveSystemThemeUseCase.self),
102103
updateSystemThemeUseCase: container.resolve(UpdateSystemThemeUseCase.self)
103104
))

DevLog/UI/Setting/SettingView.swift

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ struct SettingView: View {
3333
Text("알림")
3434
.foregroundStyle(Color.primary)
3535
}
36+
.disabled(!viewModel.state.isNetworkConnected)
3637

3738
let dirSize = viewModel.state.dirSize
3839
Button {
@@ -85,11 +86,13 @@ struct SettingView: View {
8586
} label: {
8687
Text("계정 연동")
8788
}
89+
.disabled(!viewModel.state.isNetworkConnected)
8890
Button(role: .destructive, action: {
8991
viewModel.send(.setAlert(isPresented: true, type: .signOut))
9092
}) {
9193
Text("로그아웃")
9294
}
95+
.disabled(!viewModel.state.isNetworkConnected)
9396
}
9497

9598
HStack {
@@ -100,6 +103,7 @@ struct SettingView: View {
100103
Text("회원 탈퇴")
101104
.font(.headline)
102105
}
106+
.disabled(!viewModel.state.isNetworkConnected)
103107
Spacer()
104108
}
105109
}

0 commit comments

Comments
 (0)