-
Notifications
You must be signed in to change notification settings - Fork 5
/
ForEachStoreExample.swift
90 lines (79 loc) · 2.18 KB
/
ForEachStoreExample.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
import ComposableArchitecture
import ComposablePresentation
import SwiftUI
struct ForEachStoreExample: ReducerProtocol {
struct State {
var timers: IdentifiedArrayOf<TimerExample.State> = []
}
enum Action {
case didTapAddTimer
case didTapDeleteTimer(id: TimerExample.State.ID)
case timer(id: TimerExample.State.ID, action: TimerExample.Action)
}
var body: some ReducerProtocol<State, Action> {
Reduce { state, action in
switch action {
case .didTapAddTimer:
state.timers.insert(TimerExample.State(), at: state.timers.startIndex)
return .none
case let .didTapDeleteTimer(id):
state.timers.remove(id: id)
return .none
case .timer(_, _):
return .none
}
}
.presentingForEach(
state: \.timers,
action: /Action.timer(id:action:),
element: TimerExample.init
)
}
}
struct ForEachStoreExampleView: View {
let store: StoreOf<ForEachStoreExample>
var body: some View {
VStack {
Button {
ViewStore(store.stateless).send(.didTapAddTimer, animation: .default)
} label: {
Text("Add timer").padding()
}
ScrollView {
LazyVStack {
ForEachStore(
store.scope(
state: \.timers,
action: ForEachStoreExample.Action.timer(id:action:)
),
content: { timerStore in
HStack {
TimerExampleView(store: timerStore)
Spacer()
WithViewStore(timerStore, observe: \.id) { viewStore in
Button {
ViewStore(store.stateless).send(
.didTapDeleteTimer(id: viewStore.state),
animation: .default
)
} label: {
Text("Delete").padding()
}
}
}
.padding()
}
)
}
}
}
}
}
struct ForEachStoreExample_Previews: PreviewProvider {
static var previews: some View {
ForEachStoreExampleView(store: Store(
initialState: ForEachStoreExample.State(),
reducer: ForEachStoreExample()
))
}
}