@@ -29,6 +29,7 @@ struct VoiceMemo: Equatable {
29
29
enum VoiceMemoAction : Equatable {
30
30
case audioPlayerClient( Result < AudioPlayerClient . Action , AudioPlayerClient . Failure > )
31
31
case playButtonTapped
32
+ case delete
32
33
case timerUpdated( TimeInterval )
33
34
case titleTextFieldChanged( String )
34
35
}
@@ -48,6 +49,12 @@ let voiceMemoReducer = Reducer<VoiceMemo, VoiceMemoAction, VoiceMemoEnvironment>
48
49
memo. mode = . notPlaying
49
50
return . cancel( id: TimerId ( ) )
50
51
52
+ case . delete:
53
+ return . merge(
54
+ . cancel( id: PlayerId ( ) ) ,
55
+ . cancel( id: TimerId ( ) )
56
+ )
57
+
51
58
case . playButtonTapped:
52
59
switch memo. mode {
53
60
case . notPlaying:
@@ -57,7 +64,8 @@ let voiceMemoReducer = Reducer<VoiceMemo, VoiceMemoAction, VoiceMemoEnvironment>
57
64
environment. audioPlayerClient
58
65
. play ( PlayerId ( ) , memo. url)
59
66
. catchToEffect ( )
60
- . map ( VoiceMemoAction . audioPlayerClient) ,
67
+ . map ( VoiceMemoAction . audioPlayerClient)
68
+ . cancellable ( id: PlayerId ( ) ) ,
61
69
Effect . timer ( id: TimerId ( ) , every: . milliseconds( 500 ) , on: environment. mainQueue)
62
70
. map { date -> VoiceMemoAction in
63
71
. timerUpdated(
@@ -121,7 +129,6 @@ enum VoiceMemosAction: Equatable {
121
129
case alertDismissed
122
130
case audioRecorderClient( Result < AudioRecorderClient . Action , AudioRecorderClient . Failure > )
123
131
case currentRecordingTimerUpdated
124
- case deleteVoiceMemo( IndexSet )
125
132
case finalRecordingTime( TimeInterval )
126
133
case openSettingsButtonTapped
127
134
case recordButtonTapped
@@ -140,6 +147,12 @@ struct VoiceMemosEnvironment {
140
147
}
141
148
142
149
let voiceMemosReducer = Reducer < VoiceMemosState , VoiceMemosAction , VoiceMemosEnvironment > . combine (
150
+ voiceMemoReducer. forEach (
151
+ state: \. voiceMemos,
152
+ action: / VoiceMemosAction. voiceMemo ( index: action: ) ,
153
+ environment: {
154
+ VoiceMemoEnvironment ( audioPlayerClient: $0. audioPlayerClient, mainQueue: $0. mainQueue)
155
+ } ) ,
143
156
. init { state, action, environment in
144
157
struct RecorderId : Hashable { }
145
158
struct RecorderTimerId : Hashable { }
@@ -199,10 +212,6 @@ let voiceMemosReducer = Reducer<VoiceMemosState, VoiceMemosAction, VoiceMemosEnv
199
212
state. currentRecording? . duration += 1
200
213
return . none
201
214
202
- case let . deleteVoiceMemo( indexSet) :
203
- state. voiceMemos. remove ( atOffsets: indexSet)
204
- return . none
205
-
206
215
case let . finalRecordingTime( duration) :
207
216
state. currentRecording? . duration = duration
208
217
return . none
@@ -257,6 +266,10 @@ let voiceMemosReducer = Reducer<VoiceMemosState, VoiceMemosAction, VoiceMemosEnv
257
266
state. alertMessage = " Voice memo playback failed. "
258
267
return . none
259
268
269
+ case let . voiceMemo( index: index, action: . delete) :
270
+ state. voiceMemos. remove ( at: index)
271
+ return . none
272
+
260
273
case let . voiceMemo( index: index, action: . playButtonTapped) :
261
274
for idx in state. voiceMemos. indices where idx != index {
262
275
state. voiceMemos [ idx] . mode = . notPlaying
@@ -266,13 +279,7 @@ let voiceMemosReducer = Reducer<VoiceMemosState, VoiceMemosAction, VoiceMemosEnv
266
279
case . voiceMemo:
267
280
return . none
268
281
}
269
- } ,
270
- voiceMemoReducer. forEach (
271
- state: \. voiceMemos,
272
- action: / VoiceMemosAction. voiceMemo ( index: action: ) ,
273
- environment: {
274
- VoiceMemoEnvironment ( audioPlayerClient: $0. audioPlayerClient, mainQueue: $0. mainQueue)
275
- } )
282
+ }
276
283
)
277
284
278
285
struct VoiceMemosView : View {
@@ -290,7 +297,11 @@ struct VoiceMemosView: View {
290
297
id: \. url,
291
298
content: VoiceMemoView . init ( store: )
292
299
)
293
- . onDelete { viewStore. send ( . deleteVoiceMemo( $0) ) }
300
+ . onDelete { indexSet in
301
+ for index in indexSet {
302
+ viewStore. send ( . voiceMemo( index: index, action: . delete) )
303
+ }
304
+ }
294
305
}
295
306
VStack {
296
307
ZStack {
0 commit comments