Skip to content

Commit 83718a6

Browse files
committed
feat: 프로필 쪽 네트워크를 감지하여 상태 메시지 잠금
1 parent 12bcaeb commit 83718a6

3 files changed

Lines changed: 28 additions & 4 deletions

File tree

DevLog/Presentation/ViewModel/ProfileViewModel.swift

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,12 +6,14 @@
66
//
77

88
import Foundation
9+
import Combine
910

1011
@Observable
1112
final class ProfileViewModel: Store {
1213
struct State: Equatable {
1314
var name: String = ""
1415
var email: String = ""
16+
var isNetworkConnected: Bool = true
1517
var statusMessage: String = ""
1618
var avatarURL: URL?
1719
var earliestQuarterStart: Date?
@@ -31,6 +33,7 @@ final class ProfileViewModel: Store {
3133

3234
enum Action {
3335
case onAppear
36+
case networkStatusChanged(Bool)
3437
case setAlert(Bool)
3538
case tapResetStatusMessageButton
3639
case willUpdateStatusMessage
@@ -66,22 +69,27 @@ final class ProfileViewModel: Store {
6669
private let fetchUserDataUseCase: FetchUserDataUseCase
6770
private let fetchTodosUseCase: FetchTodosUseCase
6871
private let upsertStatusMessageUseCase: UpsertStatusMessageUseCase
72+
private let networkConnectivityUseCase: ObserveNetworkConnectivityUseCase
6973
private let fetchHeatmapActivityTypesUseCase: FetchProfileHeatmapActivityTypesUseCase
7074
private let updateHeatmapActivityTypesUseCase: UpdateProfileHeatmapActivityTypesUseCase
7175
private let calendar = Calendar.current
76+
private var cancellables = Set<AnyCancellable>()
7277

7378
init(
7479
fetchUserDataUseCase: FetchUserDataUseCase,
7580
fetchTodosUseCase: FetchTodosUseCase,
7681
upsertStatusMessageUseCase: UpsertStatusMessageUseCase,
82+
networkConnectivityUseCase: ObserveNetworkConnectivityUseCase,
7783
fetchHeatmapActivityTypesUseCase: FetchProfileHeatmapActivityTypesUseCase,
7884
updateHeatmapActivityTypesUseCase: UpdateProfileHeatmapActivityTypesUseCase
7985
) {
8086
self.fetchUserDataUseCase = fetchUserDataUseCase
8187
self.fetchTodosUseCase = fetchTodosUseCase
8288
self.upsertStatusMessageUseCase = upsertStatusMessageUseCase
89+
self.networkConnectivityUseCase = networkConnectivityUseCase
8390
self.fetchHeatmapActivityTypesUseCase = fetchHeatmapActivityTypesUseCase
8491
self.updateHeatmapActivityTypesUseCase = updateHeatmapActivityTypesUseCase
92+
setupNetworkObserving()
8593
}
8694

8795
// swiftlint:disable cyclomatic_complexity
@@ -107,6 +115,8 @@ final class ProfileViewModel: Store {
107115
if let selectedQuarterStart = state.selectedQuarterStart {
108116
effects.append(.fetchCompletionQuarter(selectedQuarterStart))
109117
}
118+
case .networkStatusChanged(let isConnected):
119+
state.isNetworkConnected = isConnected
110120
case .setAlert(let isPresented):
111121
setAlert(&state, isPresented: isPresented)
112122
case .tapResetStatusMessageButton:
@@ -169,6 +179,7 @@ final class ProfileViewModel: Store {
169179
}
170180
effects = [.updateHeatmapActivityTypes(state.selectedActivityTypes)]
171181
case .willUpdateStatusMessage:
182+
if !state.isNetworkConnected { break }
172183
let message = self.state.statusMessage
173184
effects = [.updateStatusMessage(message)]
174185
case .updateStatusMessage(let message):
@@ -237,6 +248,16 @@ final class ProfileViewModel: Store {
237248
}
238249

239250
extension ProfileViewModel {
251+
private func setupNetworkObserving() {
252+
networkConnectivityUseCase.observe()
253+
.removeDuplicates()
254+
.receive(on: DispatchQueue.main)
255+
.sink { [weak self] isConnected in
256+
self?.send(.networkStatusChanged(isConnected))
257+
}
258+
.store(in: &cancellables)
259+
}
260+
240261
var quarterTitle: String {
241262
guard let start = state.selectedQuarterStart else { return "" }
242263
let year = calendar.component(.year, from: start)

DevLog/UI/Common/MainView.swift

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,7 @@ struct MainView: View {
5454
fetchUserDataUseCase: container.resolve(FetchUserDataUseCase.self),
5555
fetchTodosUseCase: container.resolve(FetchTodosUseCase.self),
5656
upsertStatusMessageUseCase: container.resolve(UpsertStatusMessageUseCase.self),
57+
networkConnectivityUseCase: container.resolve(ObserveNetworkConnectivityUseCase.self),
5758
fetchHeatmapActivityTypesUseCase: container.resolve(FetchProfileHeatmapActivityTypesUseCase.self),
5859
updateHeatmapActivityTypesUseCase: container.resolve(UpdateProfileHeatmapActivityTypesUseCase.self)
5960
))

DevLog/UI/Profile/ProfileView.swift

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -37,18 +37,19 @@ struct ProfileView: View {
3737
.foregroundStyle(Color.gray)
3838
}
3939
}
40+
let connected = viewModel.state.isNetworkConnected
4041
HStack {
4142
HStack {
4243
Image(systemName: "face.smiling")
4344
TextField(text: Binding(
4445
get: { viewModel.state.statusMessage },
4546
set: { viewModel.send(.updateStatusMessage($0)) })
4647
) {
47-
HStack {
48-
Text("상태 설정")
49-
}
48+
Text("상태 설정")
5049
}
50+
.frame(height: UIFont.preferredFont(forTextStyle: .body).lineHeight)
5151
.focused($focused)
52+
.disabled(!connected)
5253

5354
if !viewModel.state.statusMessage.isEmpty && viewModel.state.showDoneButton {
5455
Button(action: {
@@ -63,7 +64,7 @@ struct ProfileView: View {
6364
.padding(8)
6465
.background(
6566
RoundedRectangle(cornerRadius: 10)
66-
.fill(Color(UIColor.systemGray5))
67+
.fill(Color(.secondarySystemGroupedBackground))
6768
)
6869
if viewModel.state.showDoneButton {
6970
Button(action: {
@@ -75,6 +76,7 @@ struct ProfileView: View {
7576
.transition(.move(edge: .trailing).combined(with: .opacity))
7677
}
7778
}
79+
.opacity(connected ? 1 : 0.7)
7880
activityHeatmapSection
7981
}
8082
.padding(.horizontal, 16)

0 commit comments

Comments
 (0)