-
Notifications
You must be signed in to change notification settings - Fork 9
/
AccountAndPersonaHiding+Reducer.swift
116 lines (97 loc) · 3.15 KB
/
AccountAndPersonaHiding+Reducer.swift
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
// MARK: - AccountAndPersonaHiding
public struct AccountAndPersonaHiding: Sendable, FeatureReducer {
// MARK: - State
public struct State: Hashable, Sendable {
public var hiddenEntityCounts: EntitiesVisibilityClient.HiddenEntityCounts?
@PresentationState
public var destination: Destination.State? = nil
}
public enum ViewAction: Hashable, Sendable {
case task
case unhideAllTapped
case confirmUnhideAllAlert(PresentationAction<ConfirmUnhideAllAlert>)
public enum ConfirmUnhideAllAlert: Hashable, Sendable {
case confirmTapped
case cancelTapped
}
}
public enum InternalAction: Hashable, Sendable {
case hiddenEntityCountsLoaded(EntitiesVisibilityClient.HiddenEntityCounts)
case didUnhideAllEntities
}
public struct Destination: DestinationReducer {
@CasePathable
public enum State: Sendable, Hashable {
case confirmUnhideAllAlert(AlertState<Action.ConfirmUnhideAllAlert>)
}
@CasePathable
public enum Action: Sendable, Equatable {
case confirmUnhideAllAlert(ConfirmUnhideAllAlert)
public enum ConfirmUnhideAllAlert: Hashable, Sendable {
case confirmTapped
case cancelTapped
}
}
public var body: some ReducerOf<Self> {
EmptyReducer()
}
}
// MARK: - Reducer
@Dependency(\.entitiesVisibilityClient) var entitiesVisibilityClient
@Dependency(\.overlayWindowClient) var overlayWindowClient
@Dependency(\.errorQueue) var errorQueue
public var body: some ReducerOf<Self> {
Reduce(core)
.ifLet(destinationPath, action: /Action.destination) {
Destination()
}
}
private let destinationPath: WritableKeyPath<State, PresentationState<Destination.State>> = \.$destination
public func reduce(into state: inout State, viewAction: ViewAction) -> Effect<Action> {
switch viewAction {
case .task:
return .run { send in
let counts = try await entitiesVisibilityClient.getHiddenEntityCounts()
await send(.internal(.hiddenEntityCountsLoaded(counts)))
}
case .unhideAllTapped:
state.destination = .confirmUnhideAllAlert(.init(
title: .init(L10n.AppSettings.EntityHiding.unhideAllSection),
message: .init(L10n.AppSettings.EntityHiding.unhideAllConfirmation),
buttons: [
.default(.init(L10n.Common.continue), action: .send(.confirmTapped)),
.cancel(.init(L10n.Common.cancel), action: .send(.cancelTapped)),
]
))
return .none
case let .confirmUnhideAllAlert(action):
defer {
state.destination = nil
}
switch action {
case .presented(.confirmTapped):
return .run { send in
try await entitiesVisibilityClient.unhideAllEntities()
overlayWindowClient.scheduleHUD(.updatedAccount)
await send(.internal(.didUnhideAllEntities))
} catch: { error, _ in
errorQueue.schedule(error)
}
case .presented(.cancelTapped):
return .none
case .dismiss:
return .none
}
}
}
public func reduce(into state: inout State, internalAction: InternalAction) -> Effect<Action> {
switch internalAction {
case let .hiddenEntityCountsLoaded(counts):
state.hiddenEntityCounts = counts
return .none
case .didUnhideAllEntities:
state.hiddenEntityCounts = .init(hiddenAccountsCount: 0, hiddenPersonasCount: 0)
return .none
}
}
}