Skip to content

Commit f9255b6

Browse files
authored
Merge pull request #49 from blackcandy-org/playing-behavior
Add new playing begin with behavior on songs in album or playlist
2 parents 63025a0 + 02f11e4 commit f9255b6

File tree

3 files changed

+97
-35
lines changed

3 files changed

+97
-35
lines changed

BlackCandy/Store/PlayerReducer.swift

+60-20
Original file line numberDiff line numberDiff line change
@@ -63,12 +63,16 @@ struct PlayerReducer: Reducer {
6363
case moveSongsResponse(TaskResult<APIClient.NoContentResponse>)
6464
case getCurrentPlaylist
6565
case currentPlaylistResponse(TaskResult<[Song]>)
66-
case playAll(String, Int)
67-
case playAllResponse(TaskResult<[Song]>)
68-
case playSong(Int)
66+
case playAlbum(Int)
67+
case playAlbumBeginWith(Int, Int)
68+
case playPlaylist(Int)
69+
case playPlaylistBeginWith(Int, Int)
70+
case playSongsResponse(TaskResult<[Song]>)
71+
case playSongsBeginWithResponse(TaskResult<[Song]>, Int)
72+
case playNow(Int)
6973
case playNext(Int)
7074
case playLast(Int)
71-
case playSongResponse(TaskResult<Song>)
75+
case playNowResponse(TaskResult<Song>)
7276
case playNextResponse(TaskResult<Song>)
7377
case playLastResponse(TaskResult<Song>)
7478
}
@@ -285,37 +289,72 @@ struct PlayerReducer: Reducer {
285289

286290
return .none
287291

288-
case let .playAll(resourceType, resourceId):
292+
case let .playAlbum(albumId):
289293
return .run { send in
290294
await send(
291-
.playAllResponse(
295+
.playSongsResponse(
292296
TaskResult {
293-
switch resourceType {
294-
case "album":
295-
return try await apiClient.replaceCurrentPlaylistWithAlbumSongs(resourceId)
296-
case "playlist":
297-
return try await apiClient.replaceCurrentPlaylistWithPlaylistSongs(resourceId)
298-
default:
299-
throw APIClient.APIError.invalidRequest
300-
}
297+
try await apiClient.replaceCurrentPlaylistWithAlbumSongs(albumId)
298+
}
299+
)
300+
)
301+
}
302+
303+
case let .playAlbumBeginWith(albumId, songId):
304+
return .run { send in
305+
await send(
306+
.playSongsBeginWithResponse(
307+
TaskResult { try await apiClient.replaceCurrentPlaylistWithAlbumSongs(albumId) },
308+
songId
309+
)
310+
)
311+
}
312+
313+
case let .playPlaylist(playlistId):
314+
return .run { send in
315+
await send(
316+
.playSongsResponse(
317+
TaskResult {
318+
try await apiClient.replaceCurrentPlaylistWithPlaylistSongs(playlistId)
301319
}
302320
)
303321
)
304322
}
305323

306-
case let .playAllResponse(.success(songs)):
324+
case let .playPlaylistBeginWith(playlistId, songId):
325+
return .run { send in
326+
await send(
327+
.playSongsBeginWithResponse(
328+
TaskResult { try await apiClient.replaceCurrentPlaylistWithPlaylistSongs(playlistId) },
329+
songId
330+
)
331+
)
332+
}
333+
334+
case let .playSongsResponse(.success(songs)):
307335
state.playlist.update(songs: songs)
308336
state.currentSong = songs.first
309337

310338
return self.playOn(state: &state, index: 0)
311339

312-
case let .playSong(songId):
340+
case let .playSongsBeginWithResponse(.success(songs), songId):
341+
state.playlist.update(songs: songs)
342+
343+
if let songIndex = state.playlist.index(by: songId) {
344+
state.currentSong = state.playlist.find(byIndex: songIndex)
345+
return self.playOn(state: &state, index: songIndex)
346+
} else {
347+
state.currentSong = songs.first
348+
return self.playOn(state: &state, index: 0)
349+
}
350+
351+
case let .playNow(songId):
313352
if let songIndex = state.playlist.index(by: songId) {
314353
return self.playOn(state: &state, index: songIndex)
315354
} else {
316355
return .run { [currentSong = state.currentSong] send in
317356
await send(
318-
.playSongResponse(
357+
.playNowResponse(
319358
TaskResult { try await apiClient.addSongToCurrentPlaylist(songId, currentSong, nil) }
320359
)
321360
)
@@ -340,7 +379,7 @@ struct PlayerReducer: Reducer {
340379
)
341380
}
342381

343-
case let .playSongResponse(.success(song)):
382+
case let .playNowResponse(.success(song)):
344383
let insertIndex = state.insertSongNextToCurrent(song: song)
345384
return self.playOn(state: &state, index: insertIndex)
346385

@@ -359,8 +398,9 @@ struct PlayerReducer: Reducer {
359398
case let .deleteSongsResponse(.failure(error)),
360399
let .moveSongsResponse(.failure(error)),
361400
let .currentPlaylistResponse(.failure(error)),
362-
let .playAllResponse(.failure(error)),
363-
let .playSongResponse(.failure(error)),
401+
let .playSongsResponse(.failure(error)),
402+
let .playSongsBeginWithResponse(.failure(error), _),
403+
let .playNowResponse(.failure(error)),
364404
let .playNextResponse(.failure(error)),
365405
let .playLastResponse(.failure(error)),
366406
let .toggleFavoriteResponse(.failure(error)):

BlackCandy/Turbo/TurboScriptMessageHandler.swift

+28-6
Original file line numberDiff line numberDiff line change
@@ -17,29 +17,51 @@ class TurboScriptMessageHandler: NSObject, WKScriptMessageHandler {
1717
let actionName = body["name"] as? String else { return }
1818

1919
switch actionName {
20-
case "playAll":
21-
guard let resourceType = body["resourceType"] as? String,
22-
let resourceId = body["resourceId"] as? Int else { return }
20+
case "playAlbum":
21+
guard let albumId = body["albumId"] as? Int else { return }
22+
store.send(.player(.playAlbum(albumId)))
2323

24-
store.send(.player(.playAll(resourceType, resourceId)))
25-
case "playSong":
24+
case "playAlbumBeginWith":
25+
guard
26+
let albumId = body["albumId"] as? Int,
27+
let songId = body["songId"] as? Int else { return }
28+
29+
store.send(.player(.playAlbumBeginWith(albumId, songId)))
30+
31+
case "playPlaylist":
32+
guard let playlistId = body["playlistId"] as? Int else { return }
33+
store.send(.player(.playPlaylist(playlistId)))
34+
35+
case "playPlaylistBeginWith":
36+
guard
37+
let playlistId = body["playlistId"] as? Int,
38+
let songId = body["songId"] as? Int else { return }
39+
40+
store.send(.player(.playPlaylistBeginWith(playlistId, songId)))
41+
42+
case "playNow":
2643
guard let songId = body["songId"] as? Int else { return }
27-
store.send(.player(.playSong(songId)))
44+
store.send(.player(.playNow(songId)))
45+
2846
case "playNext":
2947
guard let songId = body["songId"] as? Int else { return }
3048
store.send(.player(.playNext(songId)))
49+
3150
case "playLast":
3251
guard let songId = body["songId"] as? Int else { return }
3352
store.send(.player(.playLast(songId)))
53+
3454
case "showFlashMessage":
3555
guard let message = body["message"] as? String else { return }
3656
flashMessageClient.showMessage(message)
57+
3758
case "updateTheme":
3859
guard
3960
let theme = body["theme"] as? String,
4061
let currentTheme = AppReducer.State.Theme(rawValue: theme) else { return }
4162

4263
store.send(.updateTheme(currentTheme))
64+
4365
default:
4466
return
4567
}

BlackCandyTests/Store/PlayerReducerTests.swift

+9-9
Original file line numberDiff line numberDiff line change
@@ -534,9 +534,9 @@ final class PlayerReducerTests: XCTestCase {
534534

535535
store.exhaustivity = .off
536536

537-
await store.send(.playAll("album", 1))
537+
await store.send(.playAlbum(1))
538538

539-
await store.receive(.playAllResponse(.success(songs))) {
539+
await store.receive(.playSongsResponse(.success(songs))) {
540540
$0.playlist.orderedSongs = songs
541541
$0.currentSong = songs.first
542542
}
@@ -555,9 +555,9 @@ final class PlayerReducerTests: XCTestCase {
555555

556556
store.exhaustivity = .off
557557

558-
await store.send(.playAll("playlist", 1))
558+
await store.send(.playPlaylist(1))
559559

560-
await store.receive(.playAllResponse(.success(songs))) {
560+
await store.receive(.playSongsResponse(.success(songs))) {
561561
$0.playlist.orderedSongs = songs
562562
$0.currentSong = songs.first
563563
}
@@ -574,7 +574,7 @@ final class PlayerReducerTests: XCTestCase {
574574
reducer: { PlayerReducer() }
575575
)
576576

577-
await store.send(.playSong(1)) {
577+
await store.send(.playNow(1)) {
578578
$0.currentSong = songs.first
579579
}
580580
}
@@ -598,9 +598,9 @@ final class PlayerReducerTests: XCTestCase {
598598

599599
store.exhaustivity = .off
600600

601-
await store.send(.playSong(2))
601+
await store.send(.playNow(2))
602602

603-
await store.receive(.playSongResponse(.success(playingSong))) {
603+
await store.receive(.playNowResponse(.success(playingSong))) {
604604
$0.playlist.orderedSongs = [song, playingSong]
605605
$0.currentSong = playingSong
606606
}
@@ -621,9 +621,9 @@ final class PlayerReducerTests: XCTestCase {
621621

622622
store.exhaustivity = .off
623623

624-
await store.send(.playSong(1))
624+
await store.send(.playNow(1))
625625

626-
await store.receive(.playSongResponse(.success(song))) {
626+
await store.receive(.playNowResponse(.success(song))) {
627627
$0.playlist.orderedSongs = [song]
628628
$0.currentSong = song
629629
}

0 commit comments

Comments
 (0)