1
1
mirror of https://github.com/danbee/persephone synced 2025-03-04 08:39:11 +00:00
persephone/Persephone/State/Reducers/QueueReducer.swift
Daniel Barber d075a06c41
Fix queuepos out of bounds error
Sometimes the status gets updated before the queue has been retrieved.
In these cases we want to skip setting the current song until it has
been.
2020-01-20 13:35:50 -05:00

64 lines
1.4 KiB
Swift

//
// QueueReducer.swift
// Persephone
//
// Created by Daniel Barber on 2019/4/21.
// Copyright © 2019 Dan Barber. All rights reserved.
//
import AppKit
import ReSwift
func queueReducer(action: Action, state: QueueState?) -> QueueState {
var state = state ?? QueueState()
switch action {
case let action as UpdateQueueAction:
if state.queuePos >= action.queue.count {
state.queuePos = -1
}
state.queue = action.queue.enumerated().map { index, mpdSong in
let song = Song(mpdSong: mpdSong)
return QueueItem(
song: song,
queuePos: index,
isPlaying: index == state.queuePos
)
}
case let action as UpdateQueuePosAction:
let oldSongRowPos = state.queuePos
let newSongRowPos = action.queuePos
state.queuePos = action.queuePos
if oldSongRowPos >= 0 {
state.queue[oldSongRowPos].isPlaying = false
}
if newSongRowPos >= 0 && state.queue.count > newSongRowPos {
state.queue[newSongRowPos].isPlaying = true
DispatchQueue.main.async {
App.store.dispatch(
UpdateCurrentSongAction(currentSong: state.queue[newSongRowPos].song)
)
}
} else {
DispatchQueue.main.async {
App.store.dispatch(
UpdateCurrentSongAction(currentSong: nil)
)
}
}
case let action as UpdateQueuePlayerStateAction:
state.state = action.state
default:
break
}
return state
}