1
1
mirror of https://github.com/danbee/persephone synced 2025-03-04 08:39:11 +00:00

Refactor more of the things!

1. Move all the mpdClient actions into a reducer.
2. Move global stuff into their own global struct
This commit is contained in:
Daniel Barber 2019-04-30 09:11:50 -04:00
parent 4d2a8087ed
commit 8bab7c2bf5
Signed by: danbarber
GPG Key ID: 931D8112E0103DD8
26 changed files with 191 additions and 72 deletions

View File

@ -39,6 +39,10 @@
E435E3E4221CD75D00184CFC /* NSImage.swift in Sources */ = {isa = PBXBuildFile; fileRef = E435E3E3221CD75D00184CFC /* NSImage.swift */; };
E439109822640213002982E9 /* SongNotifierService.swift in Sources */ = {isa = PBXBuildFile; fileRef = E439109722640213002982E9 /* SongNotifierService.swift */; };
E4405192227644340090CD6F /* MPDServerController.swift in Sources */ = {isa = PBXBuildFile; fileRef = E4405191227644340090CD6F /* MPDServerController.swift */; };
E44051942278765A0090CD6F /* App.swift in Sources */ = {isa = PBXBuildFile; fileRef = E44051932278765A0090CD6F /* App.swift */; };
E4405196227879960090CD6F /* MPDActions.swift in Sources */ = {isa = PBXBuildFile; fileRef = E4405195227879960090CD6F /* MPDActions.swift */; };
E440519822787CB40090CD6F /* MPDState.swift in Sources */ = {isa = PBXBuildFile; fileRef = E440519722787CB40090CD6F /* MPDState.swift */; };
E440519A22787CF60090CD6F /* MPDReducer.swift in Sources */ = {isa = PBXBuildFile; fileRef = E440519922787CF60090CD6F /* MPDReducer.swift */; };
E450AD7E222620A10091BED3 /* Album.swift in Sources */ = {isa = PBXBuildFile; fileRef = E450AD7D222620A10091BED3 /* Album.swift */; };
E450AD8F22262C620091BED3 /* PromiseKit.framework.dSYM in Resources */ = {isa = PBXBuildFile; fileRef = E450AD8E22262C620091BED3 /* PromiseKit.framework.dSYM */; };
E450AD9122262C780091BED3 /* SwiftyJSON.framework.dSYM in Resources */ = {isa = PBXBuildFile; fileRef = E450AD9022262C780091BED3 /* SwiftyJSON.framework.dSYM */; };
@ -239,6 +243,10 @@
E435E3E3221CD75D00184CFC /* NSImage.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NSImage.swift; sourceTree = "<group>"; };
E439109722640213002982E9 /* SongNotifierService.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SongNotifierService.swift; sourceTree = "<group>"; };
E4405191227644340090CD6F /* MPDServerController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MPDServerController.swift; sourceTree = "<group>"; };
E44051932278765A0090CD6F /* App.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = App.swift; sourceTree = "<group>"; };
E4405195227879960090CD6F /* MPDActions.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MPDActions.swift; sourceTree = "<group>"; };
E440519722787CB40090CD6F /* MPDState.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MPDState.swift; sourceTree = "<group>"; };
E440519922787CF60090CD6F /* MPDReducer.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MPDReducer.swift; sourceTree = "<group>"; };
E450AD7D222620A10091BED3 /* Album.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Album.swift; sourceTree = "<group>"; };
E450AD8522262AE60091BED3 /* SwiftyJSON.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = SwiftyJSON.framework; path = Carthage/Build/Mac/SwiftyJSON.framework; sourceTree = "<group>"; };
E450AD8C22262C590091BED3 /* PromiseKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = PromiseKit.framework; path = Carthage/Build/Mac/PromiseKit.framework; sourceTree = "<group>"; };
@ -370,6 +378,7 @@
children = (
E4B11BAE2274F7030075461B /* Protocols */,
E407861B2110CE6E006887B1 /* AppDelegate.swift */,
E44051932278765A0090CD6F /* App.swift */,
E407861F2110CE70006887B1 /* Assets.xcassets */,
E4D1B597220BA3A20026F233 /* Controllers */,
E4F6B45E221E117600ACF42A /* DataSources */,
@ -598,6 +607,7 @@
E4B11B74226CC4D30075461B /* QueueReducer.swift */,
E4B11B78226D346B0075461B /* AlbumListReducer.swift */,
E4FF718F227601B400D4C412 /* PreferencesReducer.swift */,
E440519922787CF60090CD6F /* MPDReducer.swift */,
);
path = Reducers;
sourceTree = "<group>";
@ -612,6 +622,7 @@
E4B11B67226A4FA00075461B /* QueueState.swift */,
E4B11B69226A4FBC0075461B /* AlbumListState.swift */,
E4FF718D2276010E00D4C412 /* PreferencesState.swift */,
E440519722787CB40090CD6F /* MPDState.swift */,
);
path = State;
sourceTree = "<group>";
@ -623,6 +634,7 @@
E4B11BBD2275EDAA0075461B /* PlayerActions.swift */,
E4B11BBF2275EE150075461B /* QueueActions.swift */,
E4FF71912276029000D4C412 /* PreferencesActions.swift */,
E4405195227879960090CD6F /* MPDActions.swift */,
);
path = Actions;
sourceTree = "<group>";
@ -889,6 +901,7 @@
E4B11BB62275374B0075461B /* UserNotificationsController.swift in Sources */,
E4B11B68226A4FA00075461B /* QueueState.swift in Sources */,
E4928E0B2218D62A001D4BEA /* CGColor.swift in Sources */,
E4405196227879960090CD6F /* MPDActions.swift in Sources */,
E4405192227644340090CD6F /* MPDServerController.swift in Sources */,
E4C8B53E22349002009A20F3 /* MPDIdle.swift in Sources */,
E4F6B460221E119B00ACF42A /* QueueDataSource.swift in Sources */,
@ -897,6 +910,7 @@
E41E5307223C019100173814 /* MPDClient+Status.swift in Sources */,
E41E5310223EF6CE00173814 /* CoverArtService+Remote.swift in Sources */,
E41E530B223C033700173814 /* MPDClient+Album.swift in Sources */,
E440519822787CB40090CD6F /* MPDState.swift in Sources */,
E42410B62241B956005ED6DF /* MPDClient+Database.swift in Sources */,
E4A642DA22090CBE00067D21 /* MPDStatus.swift in Sources */,
E4B11BC02275EE150075461B /* QueueActions.swift in Sources */,
@ -926,6 +940,7 @@
E41E5309223C020400173814 /* MPDClient+Command.swift in Sources */,
E4B11BB02274F71A0075461B /* EnumEquatable.swift in Sources */,
E4B11B73226A6C770075461B /* TrackTimer.swift in Sources */,
E44051942278765A0090CD6F /* App.swift in Sources */,
E4B11B79226D346B0075461B /* AlbumListReducer.swift in Sources */,
E47E2FE52220AA0700F747E6 /* AlbumViewLayout.swift in Sources */,
E41E52FF223BF95E00173814 /* MPDClient+Transport.swift in Sources */,
@ -949,6 +964,7 @@
E41E5303223BF9C300173814 /* MPDClient+Idle.swift in Sources */,
E4B11B53226928F20075461B /* AppState.swift in Sources */,
E435E3E4221CD75D00184CFC /* NSImage.swift in Sources */,
E440519A22787CF60090CD6F /* MPDReducer.swift in Sources */,
E4B11B6A226A4FBC0075461B /* AlbumListState.swift in Sources */,
E41E5305223BFB0700173814 /* MPDClient+Error.swift in Sources */,
E435E3E2221CD4E200184CFC /* NSFont.swift in Sources */,

18
Persephone/App.swift Normal file
View File

@ -0,0 +1,18 @@
//
// App.swift
// Persephone
//
// Created by Daniel Barber on 2019/4/30.
// Copyright © 2019 Dan Barber. All rights reserved.
//
import Foundation
import ReSwift
struct App {
static let userNotificationsController = UserNotificationsController()
static let mpdServerController = MPDServerController()
static let mpdClient = MPDClient(withDelegate: NotificationsController())
static let trackTimer = TrackTimer()
static let store = Store<AppState>(reducer: appReducer, state: nil)
}

View File

@ -15,45 +15,35 @@ class AppDelegate: NSObject,
NSApplicationDelegate,
MediaKeyTapDelegate {
var mediaKeyTap: MediaKeyTap?
var userNotificationsController = UserNotificationsController()
var mpdServerController = MPDServerController()
static let mpdClient = MPDClient(
withDelegate: NotificationsController()
)
static let trackTimer = TrackTimer()
static let store = Store<AppState>(reducer: appReducer, state: nil)
func applicationDidFinishLaunching(_ aNotification: Notification) {
mpdServerController.connect()
App.mpdServerController.connect()
mediaKeyTap = MediaKeyTap(delegate: self)
mediaKeyTap?.start()
AppDelegate.store.subscribe(self) {
App.store.subscribe(self) {
$0.select { $0.playerState.databaseUpdating }
}
}
func applicationWillTerminate(_ aNotification: Notification) {
mpdServerController.disconnect()
App.mpdServerController.disconnect()
}
func handle(mediaKey: MediaKey, event: KeyEvent) {
switch mediaKey {
case .playPause:
AppDelegate.mpdClient.playPause()
App.store.dispatch(MPDPlayPauseAction())
case .next, .fastForward:
AppDelegate.mpdClient.nextTrack()
App.store.dispatch(MPDNextTrackAction())
case .previous, .rewind:
AppDelegate.mpdClient.prevTrack()
App.store.dispatch(MPDPrevTrackAction())
}
}
@IBAction func updateDatabase(_ sender: NSMenuItem) {
AppDelegate.mpdClient.updateDatabase()
App.store.dispatch(MPDUpdateDatabaseAction())
}
@IBOutlet weak var updateDatabaseMenuItem: NSMenuItem!

View File

@ -21,7 +21,7 @@ class AlbumViewController: NSViewController,
override func viewDidLoad() {
super.viewDidLoad()
AppDelegate.store.subscribe(self) {
App.store.subscribe(self) {
$0.select { $0.albumListState }
}
@ -59,7 +59,7 @@ class AlbumViewController: NSViewController,
case "mpdLibraryDir":
albumCollectionView.reloadData()
case "fetchMissingArtworkFromInternet":
AppDelegate.store.dispatch(ResetAlbumListCoverArtAction())
App.store.dispatch(ResetAlbumListCoverArtAction())
default:
break
}

View File

@ -53,8 +53,8 @@ class AlbumViewItem: NSCollectionViewItem {
@IBAction func playAlbum(_ sender: Any) {
guard let album = album else { return }
AppDelegate.mpdClient.playAlbum(album.mpdAlbum)
App.store.dispatch(MPDPlayAlbum(album: album.mpdAlbum))
}
@IBOutlet var albumCoverView: NSImageView!

View File

@ -11,20 +11,22 @@ import ReSwift
class MPDServerController {
init() {
AppDelegate.store.subscribe(self) {
App.store.subscribe(self) {
$0.select { $0.preferencesState.mpdServer }
}
}
func connect() {
AppDelegate.mpdClient.connect(
host: AppDelegate.store.state.preferencesState.mpdServer.hostOrDefault,
port: AppDelegate.store.state.preferencesState.mpdServer.portOrDefault
App.store.dispatch(
MPDConnectAction(
host: App.store.state.preferencesState.mpdServer.hostOrDefault,
port: App.store.state.preferencesState.mpdServer.portOrDefault
)
)
}
func disconnect() {
AppDelegate.mpdClient.disconnect()
App.store.dispatch(MPDDisconnectAction())
}
}

View File

@ -17,44 +17,44 @@ class NotificationsController: MPDClientDelegate {
func willDisconnect(mpdClient: MPDClient) {
DispatchQueue.main.async {
AppDelegate.store.dispatch(UpdateAlbumListAction(albums: []))
App.store.dispatch(UpdateAlbumListAction(albums: []))
}
sendNotification(name: Notification.willDisconnect)
}
func didUpdateStatus(mpdClient: MPDClient, status: MPDClient.MPDStatus) {
DispatchQueue.main.async {
AppDelegate.store.dispatch(UpdateStatusAction(status: status))
App.store.dispatch(UpdateStatusAction(status: status))
}
}
func willStartDatabaseUpdate(mpdClient: MPDClient) {
DispatchQueue.main.async {
AppDelegate.store.dispatch(StartedDatabaseUpdateAction())
App.store.dispatch(StartedDatabaseUpdateAction())
}
}
func didFinishDatabaseUpdate(mpdClient: MPDClient) {
DispatchQueue.main.async {
AppDelegate.store.dispatch(FinishedDatabaseUpdateAction())
App.store.dispatch(FinishedDatabaseUpdateAction())
}
}
func didUpdateQueue(mpdClient: MPDClient, queue: [MPDClient.MPDSong]) {
DispatchQueue.main.async {
AppDelegate.store.dispatch(UpdateQueueAction(queue: queue))
App.store.dispatch(UpdateQueueAction(queue: queue))
}
}
func didUpdateQueuePos(mpdClient: MPDClient, song: Int) {
DispatchQueue.main.async {
AppDelegate.store.dispatch(UpdateQueuePosAction(queuePos: song))
App.store.dispatch(UpdateQueuePosAction(queuePos: song))
}
}
func didLoadAlbums(mpdClient: MPDClient, albums: [MPDClient.MPDAlbum]) {
DispatchQueue.main.async {
AppDelegate.store.dispatch(UpdateAlbumListAction(albums: albums))
App.store.dispatch(UpdateAlbumListAction(albums: albums))
}
}
@ -62,7 +62,7 @@ class NotificationsController: MPDClientDelegate {
self.notificationQueue.async {
NotificationCenter.default.post(
name: name,
object: AppDelegate.mpdClient,
object: App.mpdClient,
userInfo: userInfo
)
}

View File

@ -19,7 +19,7 @@ class QueueViewController: NSViewController,
override func viewDidLoad() {
super.viewDidLoad()
AppDelegate.store.subscribe(self) {
App.store.subscribe(self) {
$0.select { $0.queueState }
}
@ -40,7 +40,7 @@ class QueueViewController: NSViewController,
let newQueuePos = queueView.selectedRow - 1
if newQueuePos >= 0 {
AppDelegate.mpdClient.playTrack(at: newQueuePos)
App.store.dispatch(MPDPlayTrack(queuePos: newQueuePos))
}
}

View File

@ -11,14 +11,14 @@ import ReSwift
class UserNotificationsController {
init() {
AppDelegate.store.subscribe(self) {
App.store.subscribe(self) {
$0.select { $0.playerState.currentSong }
}
}
func notifyTrack(_ state: Song?) {
guard let currentSong = state,
let status = AppDelegate.mpdClient.status,
let status = App.mpdClient.status,
status.state == .playing
else { return }

View File

@ -21,7 +21,7 @@ class WindowController: NSWindowController {
super.windowDidLoad()
window?.titleVisibility = .hidden
AppDelegate.store.subscribe(self) {
App.store.subscribe(self) {
$0.select { $0.playerState }
}
@ -32,7 +32,7 @@ class WindowController: NSWindowController {
override func keyDown(with event: NSEvent) {
switch event.keyCode {
case NSEvent.keyCodeSpace:
AppDelegate.mpdClient.playPause()
App.store.dispatch(MPDPlayPauseAction())
default:
nextResponder?.keyDown(with: event)
}
@ -112,13 +112,13 @@ class WindowController: NSWindowController {
case .leftMouseDown:
trackTimer?.invalidate()
case .leftMouseDragged:
AppDelegate.store.dispatch(
App.store.dispatch(
UpdateElapsedTimeAction(elapsedTimeMs: UInt(sender.integerValue))
)
case .leftMouseUp:
let seekTime = Float(sender.integerValue) / 1000
AppDelegate.mpdClient.seekCurrentSong(timeInSeconds: seekTime)
App.store.dispatch(MPDSeekCurrentSong(timeInSeconds: seekTime))
default:
break
}
@ -130,13 +130,13 @@ class WindowController: NSWindowController {
switch transportAction {
case .prevTrack:
AppDelegate.mpdClient.prevTrack()
App.store.dispatch(MPDPrevTrackAction())
case .playPause:
AppDelegate.mpdClient.playPause()
App.store.dispatch(MPDPlayPauseAction())
case .stop:
AppDelegate.mpdClient.stop()
App.store.dispatch(MPDStopAction())
case .nextTrack:
AppDelegate.mpdClient.nextTrack()
App.store.dispatch(MPDNextTrackAction())
}
}

View File

@ -25,14 +25,14 @@ class AlbumDataSource: NSObject, NSCollectionViewDataSource {
switch albums[indexPath.item].coverArt {
case .notLoaded:
AppDelegate.mpdClient.getAlbumFirstSong(for: albums[indexPath.item].mpdAlbum) {
App.mpdClient.getAlbumFirstSong(for: albums[indexPath.item].mpdAlbum) {
guard let song = $0 else { return }
CoverArtService(song: Song(mpdSong: song))
.fetchCoverArt()
.done { image in
DispatchQueue.main.async {
AppDelegate.store.dispatch(
App.store.dispatch(
UpdateCoverArtAction(coverArt: image, albumIndex: indexPath.item)
)
}

View File

@ -31,7 +31,7 @@ class TrackTimer: NSObject {
let timeDiff = currentTime - self.startTime
let newElapsedTimeMs = UInt((self.startElapsed + timeDiff) * 1000)
AppDelegate.store.dispatch(
App.store.dispatch(
UpdateElapsedTimeAction(elapsedTimeMs: newElapsedTimeMs)
)
}
@ -44,7 +44,7 @@ class TrackTimer: NSObject {
DispatchQueue.main.async {
self.timer?.invalidate()
AppDelegate.store.dispatch(
App.store.dispatch(
UpdateElapsedTimeAction(elapsedTimeMs: elapsedTimeMs)
)
}

View File

@ -12,11 +12,11 @@ class CoverArtPrefsController: NSViewController {
override func viewDidLoad() {
super.viewDidLoad()
if let mpdLibraryDir = AppDelegate.store.state.preferencesState.mpdLibraryDir {
if let mpdLibraryDir = App.store.state.preferencesState.mpdLibraryDir {
mpdLibraryDirField.stringValue = mpdLibraryDir
}
if AppDelegate.store.state.preferencesState.fetchMissingArtworkFromInternet {
if App.store.state.preferencesState.fetchMissingArtworkFromInternet {
fetchMissingArtworkFromInternet.state = .on
} else {
fetchMissingArtworkFromInternet.state = .off
@ -34,13 +34,13 @@ class CoverArtPrefsController: NSViewController {
}
@IBAction func updateMpdLibraryDir(_ sender: NSTextField) {
AppDelegate.store.dispatch(UpdateMPDLibraryDir(mpdLibraryDir: sender.stringValue))
App.store.dispatch(UpdateMPDLibraryDir(mpdLibraryDir: sender.stringValue))
}
@IBOutlet var mpdLibraryDirField: NSTextField!
@IBAction func updateFetchMissingArtworkFromInternet(_ sender: NSButton) {
AppDelegate.store.dispatch(
App.store.dispatch(
UpdateFetchMissingArtworkFromInternet(
fetchMissingArtworkFromInternet: sender.state == .on
)

View File

@ -13,11 +13,11 @@ class GeneralPrefsViewController: NSViewController {
override func viewDidLoad() {
super.viewDidLoad()
if let mpdHost = AppDelegate.store.state.preferencesState.mpdServer.host {
if let mpdHost = App.store.state.preferencesState.mpdServer.host {
mpdHostField.stringValue = mpdHost
}
if let mpdPort = AppDelegate.store.state.preferencesState.mpdServer.port {
if let mpdPort = App.store.state.preferencesState.mpdServer.port {
print(mpdPort)
mpdPortField.stringValue = "\(mpdPort)"
}
@ -34,11 +34,11 @@ class GeneralPrefsViewController: NSViewController {
}
@IBAction func updateMpdHost(_ sender: NSTextField) {
AppDelegate.store.dispatch(UpdateServerHost(host: sender.stringValue))
App.store.dispatch(UpdateServerHost(host: sender.stringValue))
}
@IBAction func updateMpdPort(_ sender: NSTextField) {
AppDelegate.store.dispatch(UpdateServerPort(port: sender.integerValue))
App.store.dispatch(UpdateServerPort(port: sender.integerValue))
}
@IBOutlet var mpdHostField: NSTextField!

View File

@ -14,7 +14,7 @@ class PreferencesWindowController: NSWindowController, NSWindowDelegate {
}
func windowShouldClose(_ sender: NSWindow) -> Bool {
AppDelegate.store.dispatch(SavePreferences())
App.store.dispatch(SavePreferences())
self.window?.orderOut(sender)
return false
}

View File

@ -19,7 +19,7 @@ extension CoverArtService {
}
var musicDir: String {
return AppDelegate.store.state.preferencesState.expandedMpdLibraryDir
return App.store.state.preferencesState.expandedMpdLibraryDir
}
func getArtworkFromFilesystem() -> Promise<NSImage?> {
@ -48,7 +48,7 @@ extension CoverArtService {
}
func fileSystemArtworkFilePath() -> String? {
let musicDir = AppDelegate.store.state.preferencesState.expandedMpdLibraryDir
let musicDir = App.store.state.preferencesState.expandedMpdLibraryDir
return self.coverArtFilenames
.lazy

View File

@ -19,7 +19,7 @@ extension CoverArtService {
func getRemoteArtwork() -> Promise<NSImage?> {
return Promise { seal in
if AppDelegate.store.state.preferencesState .fetchMissingArtworkFromInternet {
if App.store.state.preferencesState .fetchMissingArtworkFromInternet {
coverArtQueue.async {
let coverArtWorkItem = DispatchWorkItem {
self.getArtworkFromMusicBrainz().map(Optional.some).pipe(to: seal.resolve)

View File

@ -0,0 +1,34 @@
//
// MPDActions.swift
// Persephone
//
// Created by Daniel Barber on 2019/4/30.
// Copyright © 2019 Dan Barber. All rights reserved.
//
import ReSwift
struct MPDConnectAction: Action {
let host: String
let port: Int
}
struct MPDDisconnectAction: Action {}
struct MPDPlayPauseAction: Action {}
struct MPDStopAction: Action {}
struct MPDNextTrackAction: Action {}
struct MPDPrevTrackAction: Action {}
struct MPDPlayTrack: Action {
let queuePos: Int
}
struct MPDPlayAlbum: Action {
let album: MPDClient.MPDAlbum
}
struct MPDSeekCurrentSong: Action {
let timeInSeconds: Float
}
struct MPDUpdateDatabaseAction: Action {}

View File

@ -13,4 +13,5 @@ struct AppState: StateType {
var queueState = QueueState()
var albumListState = AlbumListState()
var preferencesState = PreferencesState()
var mpdState = MPDState()
}

View File

@ -0,0 +1,11 @@
//
// MPDState.swift
// Persephone
//
// Created by Daniel Barber on 2019/4/30.
// Copyright © 2019 Dan Barber. All rights reserved.
//
import ReSwift
struct MPDState: StateType {}

View File

@ -19,7 +19,7 @@ func albumListReducer(action: Action, state: AlbumListState?) -> AlbumListState
state.albums[action.albumIndex].coverArt = .loaded(action.coverArt)
case is ResetAlbumListCoverArtAction:
state.albums = AppDelegate.store.state.albumListState.albums.map {
state.albums = App.store.state.albumListState.albums.map {
var album = $0
switch album.coverArt {
case .loaded(let coverArt):

View File

@ -13,6 +13,7 @@ func appReducer(action: Action, state: AppState?) -> AppState {
playerState: playerReducer(action: action, state: state?.playerState),
queueState: queueReducer(action: action, state: state?.queueState),
albumListState: albumListReducer(action: action, state: state?.albumListState),
preferencesState: preferencesReducer(action: action, state: state?.preferencesState)
preferencesState: preferencesReducer(action: action, state: state?.preferencesState),
mpdState: mpdReducer(action: action, state: state?.mpdState)
)
}

View File

@ -0,0 +1,46 @@
//
// MPDReducer.swift
// Persephone
//
// Created by Daniel Barber on 2019/4/30.
// Copyright © 2019 Dan Barber. All rights reserved.
//
import ReSwift
func mpdReducer(action: Action, state: MPDState?) -> MPDState {
let state = state ?? MPDState()
switch action {
case let action as MPDConnectAction:
App.mpdClient.connect(host: action.host, port: action.port)
case is MPDDisconnectAction:
App.mpdClient.disconnect()
case is MPDPlayPauseAction:
App.mpdClient.playPause()
case is MPDStopAction:
App.mpdClient.stop()
case is MPDNextTrackAction:
App.mpdClient.nextTrack()
case is MPDPrevTrackAction:
App.mpdClient.prevTrack()
case let action as MPDPlayTrack:
App.mpdClient.playTrack(at: action.queuePos)
case let action as MPDPlayAlbum:
App.mpdClient.playAlbum(action.album)
case let action as MPDSeekCurrentSong:
App.mpdClient.seekCurrentSong(timeInSeconds: action.timeInSeconds)
case is MPDUpdateDatabaseAction:
App.mpdClient.updateDatabase()
default:
break
}
return state
}

View File

@ -20,13 +20,13 @@ func playerReducer(action: Action, state: PlayerState?) -> PlayerState {
state.elapsedTimeMs = action.status.elapsedTimeMs
if state.state == .playing {
AppDelegate.trackTimer.start(elapsedTimeMs: state.elapsedTimeMs)
App.trackTimer.start(elapsedTimeMs: state.elapsedTimeMs)
} else {
AppDelegate.trackTimer.stop(elapsedTimeMs: state.elapsedTimeMs)
App.trackTimer.stop(elapsedTimeMs: state.elapsedTimeMs)
}
DispatchQueue.main.async {
AppDelegate.store.dispatch(
App.store.dispatch(
UpdateQueuePlayerStateAction(state: state.state)
)
}
@ -41,16 +41,16 @@ func playerReducer(action: Action, state: PlayerState?) -> PlayerState {
.done() { image in
DispatchQueue.main.async {
if let image = image {
AppDelegate.store.dispatch(UpdateCurrentCoverArtAction(coverArt: image))
App.store.dispatch(UpdateCurrentCoverArtAction(coverArt: image))
} else {
AppDelegate.store.dispatch(UpdateCurrentCoverArtAction(coverArt: .defaultCoverArt))
App.store.dispatch(UpdateCurrentCoverArtAction(coverArt: .defaultCoverArt))
}
}
}
.cauterize()
} else {
DispatchQueue.main.async {
AppDelegate.store.dispatch(UpdateCurrentCoverArtAction(coverArt: .defaultCoverArt))
App.store.dispatch(UpdateCurrentCoverArtAction(coverArt: .defaultCoverArt))
}
}

View File

@ -39,7 +39,7 @@ func queueReducer(action: Action, state: QueueState?) -> QueueState {
}
DispatchQueue.main.async {
AppDelegate.store.dispatch(
App.store.dispatch(
UpdateCurrentSongAction(currentSong: state.queue[newSongRowPos].song)
)
}

View File

@ -13,7 +13,7 @@ class CurrentCoverArtView: NSImageView {
required init?(coder: NSCoder) {
super.init(coder: coder)
AppDelegate.store.subscribe(self) {
App.store.subscribe(self) {
$0.select { $0.playerState.currentArtwork }
}
}