Skip to content

Commit 7363a46

Browse files
committed
refactor: 토글의 isOn에 BindingAction 처리
1 parent a384169 commit 7363a46

4 files changed

Lines changed: 75 additions & 41 deletions

File tree

Application/DevLogPresentation/Sources/Profile/ProfileFeature+State.swift

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,33 @@ extension ProfileFeature.State {
3535
}
3636
}
3737

38+
var isCreatedActivitySelected: Bool {
39+
get { selectedActivityKinds.contains(.created) }
40+
set { setActivityKind(.created, isSelected: newValue) }
41+
}
42+
43+
var isCompletedActivitySelected: Bool {
44+
get { selectedActivityKinds.contains(.completed) }
45+
set { setActivityKind(.completed, isSelected: newValue) }
46+
}
47+
48+
var isDeletedActivitySelected: Bool {
49+
get { selectedActivityKinds.contains(.deleted) }
50+
set { setActivityKind(.deleted, isSelected: newValue) }
51+
}
52+
53+
var isCreatedActivityToggleDisabled: Bool {
54+
selectedActivityKinds == [.created]
55+
}
56+
57+
var isCompletedActivityToggleDisabled: Bool {
58+
selectedActivityKinds == [.completed]
59+
}
60+
61+
var isDeletedActivityToggleDisabled: Bool {
62+
selectedActivityKinds == [.deleted]
63+
}
64+
3865
var canMoveToPreviousQuarter: Bool {
3966
ProfileHeatmapBuilder.canMoveToQuarter(offsetMonths: -3, state: self)
4067
}
@@ -73,4 +100,12 @@ extension ProfileFeature.State {
73100
func isQuarterSelectedForPicker(_ quarter: Int) -> Bool {
74101
quarterStartForPicker(quarter: quarter) == selectedQuarterStart
75102
}
103+
104+
private mutating func setActivityKind(_ activityKind: ActivityKind, isSelected: Bool) {
105+
if isSelected {
106+
selectedActivityKinds.insert(activityKind)
107+
} else if 1 < selectedActivityKinds.count {
108+
selectedActivityKinds.remove(activityKind)
109+
}
110+
}
76111
}

Application/DevLogPresentation/Sources/Profile/ProfileFeature.swift

Lines changed: 14 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,6 @@ struct ProfileFeature {
5353
case selectQuarter(Date)
5454
case moveToCurrentQuarter
5555
case moveQuarter(Int)
56-
case toggleActivityKind(ActivityKind)
5756
case selectDay(HeatmapDay?)
5857
case updateStatusTextFieldFocus(Bool)
5958
case store(StoreAction)
@@ -89,6 +88,12 @@ struct ProfileFeature {
8988
state.alert = nil
9089
case .alert:
9190
break
91+
case .binding(\.isCreatedActivitySelected):
92+
return updateHeatmapActivityKindsEffectIfNeeded(.created, state: state)
93+
case .binding(\.isCompletedActivitySelected):
94+
return updateHeatmapActivityKindsEffectIfNeeded(.completed, state: state)
95+
case .binding(\.isDeletedActivitySelected):
96+
return updateHeatmapActivityKindsEffectIfNeeded(.deleted, state: state)
9297
case .binding:
9398
break
9499
case .startObserving:
@@ -144,18 +149,6 @@ struct ProfileFeature {
144149
) else { break }
145150
guard ProfileHeatmapBuilder.canSelectQuarter(nextQuarterStart, state: state) else { break }
146151
return updateSelectedQuarter(to: nextQuarterStart, state: &state)
147-
case .toggleActivityKind(let activityKind):
148-
if state.selectedActivityKinds.contains(activityKind),
149-
state.selectedActivityKinds.count == 1 {
150-
break
151-
}
152-
153-
if state.selectedActivityKinds.contains(activityKind) {
154-
state.selectedActivityKinds.remove(activityKind)
155-
} else {
156-
state.selectedActivityKinds.insert(activityKind)
157-
}
158-
return updateHeatmapActivityKindsEffect(state.selectedActivityKinds)
159152
case .selectDay(let day):
160153
if let day, state.selectedDay?.date == day.date {
161154
state.selectedDay = nil
@@ -277,6 +270,14 @@ private extension ProfileFeature {
277270
}
278271
}
279272

273+
func updateHeatmapActivityKindsEffectIfNeeded(
274+
_ activityKind: ActivityKind,
275+
state: State
276+
) -> Effect<Action> {
277+
guard state.selectedActivityKinds != [activityKind] else { return .none }
278+
return updateHeatmapActivityKindsEffect(state.selectedActivityKinds)
279+
}
280+
280281
func updateSelectedQuarter(
281282
to quarterStart: Date,
282283
state: inout State

Application/DevLogPresentation/Sources/Profile/ProfileView.swift

Lines changed: 12 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -157,34 +157,19 @@ struct ProfileView: View {
157157
}
158158
Menu {
159159
ForEach(ActivityKindItem.selectableItems) { activityKindItem in
160-
Toggle(
161-
activityKindItem.title,
162-
isOn: Binding(
163-
get: {
164-
guard let activityKind = ActivityKind(
165-
rawValue: activityKindItem.rawValue
166-
) else {
167-
return false
168-
}
169-
return store.selectedActivityKinds.contains(activityKind)
170-
},
171-
set: { _ in
172-
guard let activityKind = ActivityKind(
173-
rawValue: activityKindItem.rawValue
174-
) else {
175-
return
176-
}
177-
store.send(.toggleActivityKind(activityKind))
178-
}
179-
)
180-
)
181-
.disabled({
182-
guard let activityKind = ActivityKind(rawValue: activityKindItem.rawValue) else {
183-
return false
160+
if let activityKind = ActivityKind(rawValue: activityKindItem.rawValue) {
161+
switch activityKind {
162+
case .created:
163+
Toggle(activityKindItem.title, isOn: $store.isCreatedActivitySelected)
164+
.disabled(store.isCreatedActivityToggleDisabled)
165+
case .completed:
166+
Toggle(activityKindItem.title, isOn: $store.isCompletedActivitySelected)
167+
.disabled(store.isCompletedActivityToggleDisabled)
168+
case .deleted:
169+
Toggle(activityKindItem.title, isOn: $store.isDeletedActivitySelected)
170+
.disabled(store.isDeletedActivityToggleDisabled)
184171
}
185-
return store.selectedActivityKinds.count == 1
186-
&& store.selectedActivityKinds.contains(activityKind)
187-
}())
172+
}
188173
}
189174
} label: {
190175
Image(systemName: "line.3.horizontal.decrease")

Application/DevLogPresentation/Tests/Profile/ProfileViewModelTests.swift

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -207,7 +207,20 @@ private struct ProfileStoreTestAdapter {
207207
}
208208

209209
func toggleActivityKind(_ activityKind: ActivityKind) async {
210-
await store.send(.toggleActivityKind(activityKind))
210+
switch activityKind {
211+
case .created:
212+
await store.send(.binding(.set(\.isCreatedActivitySelected, !store.state.isCreatedActivitySelected))) {
213+
$0.isCreatedActivitySelected.toggle()
214+
}
215+
case .completed:
216+
await store.send(.binding(.set(\.isCompletedActivitySelected, !store.state.isCompletedActivitySelected))) {
217+
$0.isCompletedActivitySelected.toggle()
218+
}
219+
case .deleted:
220+
await store.send(.binding(.set(\.isDeletedActivitySelected, !store.state.isDeletedActivitySelected))) {
221+
$0.isDeletedActivitySelected.toggle()
222+
}
223+
}
211224
await drainReceivedActions()
212225
}
213226

0 commit comments

Comments
 (0)