Skip to content

Commit 93ed007

Browse files
committed
refactor: AlertState 적용
1 parent ad55cb1 commit 93ed007

3 files changed

Lines changed: 30 additions & 33 deletions

File tree

Application/DevLogPresentation/Sources/Root/RootFeature.swift

Lines changed: 16 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -21,9 +21,7 @@ struct RootFeature {
2121

2222
@ObservableState
2323
struct State: Equatable {
24-
var showAlert = false
25-
var alertTitle = ""
26-
var alertMessage = ""
24+
@Presents var alert: AlertState<Never>?
2725
var isNetworkConnected = true
2826
var signIn: Bool?
2927
var theme: SystemTheme = .automatic
@@ -33,12 +31,12 @@ struct RootFeature {
3331
}
3432

3533
enum Action: Equatable {
34+
case alert(PresentationAction<Never>)
3635
case view(ViewAction)
3736
case store(StoreAction)
3837

3938
enum ViewAction: Equatable {
4039
case onAppear
41-
case setAlert(Bool)
4240
}
4341

4442
enum StoreAction: Equatable {
@@ -57,6 +55,8 @@ struct RootFeature {
5755
var body: some ReducerOf<Self> {
5856
Reduce { state, action in
5957
switch action {
58+
case .alert:
59+
break
6060
case .view(.onAppear):
6161
var effect = clearApplicationBadgeCountEffect()
6262

@@ -76,13 +76,11 @@ struct RootFeature {
7676
}
7777

7878
return effect
79-
case .view(.setAlert(let isPresented)):
80-
Self.setAlert(&state, isPresented: isPresented)
8179
case .store(.networkStatusChanged(let isConnected)):
8280
let wasConnected = state.isNetworkConnected
8381
state.isNetworkConnected = isConnected
8482
if wasConnected && !isConnected {
85-
Self.setAlert(&state, isPresented: true)
83+
state.alert = Self.alertState()
8684
}
8785
case .store(.setTheme(let theme)):
8886
state.theme = theme
@@ -95,6 +93,7 @@ struct RootFeature {
9593

9694
return .none
9795
}
96+
.ifLet(\.$alert, action: \.alert)
9897
}
9998
}
10099

@@ -154,9 +153,15 @@ private extension RootFeature {
154153
}
155154
}
156155

157-
static func setAlert(_ state: inout State, isPresented: Bool) {
158-
state.alertTitle = String(localized: "root_network_disconnected_title")
159-
state.alertMessage = String(localized: "root_network_disconnected_message")
160-
state.showAlert = isPresented
156+
static func alertState() -> AlertState<Never> {
157+
AlertState {
158+
TextState(String(localized: "root_network_disconnected_title"))
159+
} actions: {
160+
ButtonState(role: .cancel) {
161+
TextState(String(localized: "common_close"))
162+
}
163+
} message: {
164+
TextState(String(localized: "root_network_disconnected_message"))
165+
}
161166
}
162167
}

Application/DevLogPresentation/Sources/Root/RootView.swift

Lines changed: 1 addition & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -79,14 +79,7 @@ public struct RootView: View {
7979
break
8080
}
8181
}
82-
.alert(store.alertTitle, isPresented: Binding(
83-
get: { store.showAlert },
84-
set: { store.send(.view(.setAlert($0))) }
85-
)) {
86-
Button(String(localized: "common_close"), role: .cancel) { }
87-
} message: {
88-
Text(store.alertMessage)
89-
}
82+
.alert($store.scope(state: \.alert, action: \.alert))
9083
.sheet(item: $selectedRoute) { route in
9184
switch route {
9285
case .todoDetail(let todoId):

Application/DevLogPresentation/Tests/Root/RootFeatureTestSupport.swift

Lines changed: 13 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -24,9 +24,8 @@ protocol RootStateDriving {
2424
}
2525

2626
struct RootStateSnapshot: Equatable {
27-
let showAlert: Bool
28-
let alertTitle: String
29-
let alertMessage: String
27+
let alertTitle: String?
28+
let alertMessage: String?
3029
let isNetworkConnected: Bool
3130
let signIn: Bool?
3231
let theme: SystemTheme
@@ -38,9 +37,8 @@ struct RootStoreTestAdapter: RootStateDriving {
3837

3938
var snapshot: RootStateSnapshot {
4039
RootStateSnapshot(
41-
showAlert: store.state.showAlert,
42-
alertTitle: store.state.alertTitle,
43-
alertMessage: store.state.alertMessage,
40+
alertTitle: store.state.alert.map { String(state: $0.title) },
41+
alertMessage: store.state.alert?.message.map { String(state: $0) },
4442
isNetworkConnected: store.state.isNetworkConnected,
4543
signIn: store.state.signIn,
4644
theme: store.state.theme
@@ -78,7 +76,11 @@ struct RootStoreTestAdapter: RootStateDriving {
7876
}
7977

8078
func setAlert(_ isPresented: Bool) async {
81-
await store.send(.view(.setAlert(isPresented)))
79+
if isPresented {
80+
await store.send(.store(.networkStatusChanged(false)))
81+
} else {
82+
await store.send(.alert(.dismiss))
83+
}
8284
}
8385

8486
func networkStatusChanged(_ isConnected: Bool) async {
@@ -107,7 +109,6 @@ func verifyNetworkDisconnectedAlert(adapter: some RootStateDriving) async {
107109
#expect(
108110
adapter.snapshot
109111
== RootStateSnapshot(
110-
showAlert: true,
111112
alertTitle: String(localized: "root_network_disconnected_title"),
112113
alertMessage: String(localized: "root_network_disconnected_message"),
113114
isNetworkConnected: false,
@@ -125,9 +126,8 @@ func verifySetAlert(adapter: some RootStateDriving) async {
125126
#expect(
126127
adapter.snapshot
127128
== RootStateSnapshot(
128-
showAlert: false,
129-
alertTitle: String(localized: "root_network_disconnected_title"),
130-
alertMessage: String(localized: "root_network_disconnected_message"),
129+
alertTitle: nil,
130+
alertMessage: nil,
131131
isNetworkConnected: false,
132132
signIn: nil,
133133
theme: .automatic
@@ -140,7 +140,7 @@ func verifyThemeUpdate(adapter: some RootStateDriving) async {
140140
await adapter.setTheme(.dark)
141141

142142
#expect(adapter.snapshot.theme == .dark)
143-
#expect(!adapter.snapshot.showAlert)
143+
#expect(adapter.snapshot.alertTitle == nil)
144144
}
145145

146146
@MainActor
@@ -176,13 +176,12 @@ func verifyObservedInitialValues(adapter: some RootStateDriving) async {
176176
return snapshot.signIn == false
177177
&& !snapshot.isNetworkConnected
178178
&& snapshot.theme == .dark
179-
&& snapshot.showAlert
179+
&& snapshot.alertTitle == String(localized: "root_network_disconnected_title")
180180
}
181181

182182
#expect(
183183
adapter.snapshot
184184
== RootStateSnapshot(
185-
showAlert: true,
186185
alertTitle: String(localized: "root_network_disconnected_title"),
187186
alertMessage: String(localized: "root_network_disconnected_message"),
188187
isNetworkConnected: false,

0 commit comments

Comments
 (0)