From 8e12b144e63d63b5dfd86ae5d20e4c870717c9e9 Mon Sep 17 00:00:00 2001 From: Christian Tietze Date: Fri, 2 Aug 2019 20:31:13 +0200 Subject: [PATCH] transition MPDReducer to middleware --- Persephone.xcodeproj/project.pbxproj | 20 +++-- Persephone/App.swift | 2 +- Persephone/State/AppState.swift | 1 - Persephone/State/MPDState.swift | 11 --- .../Middleware/MPDClientMiddleware.swift | 73 +++++++++++++++++++ Persephone/State/Reducers/AppReducer.swift | 1 - Persephone/State/Reducers/MPDReducer.swift | 71 ------------------ 7 files changed, 86 insertions(+), 93 deletions(-) delete mode 100644 Persephone/State/MPDState.swift create mode 100644 Persephone/State/Middleware/MPDClientMiddleware.swift delete mode 100644 Persephone/State/Reducers/MPDReducer.swift diff --git a/Persephone.xcodeproj/project.pbxproj b/Persephone.xcodeproj/project.pbxproj index cafb356..ed57c03 100644 --- a/Persephone.xcodeproj/project.pbxproj +++ b/Persephone.xcodeproj/project.pbxproj @@ -7,6 +7,7 @@ objects = { /* Begin PBXBuildFile section */ + 50F87A9722F4B7B90064BEFA /* MPDClientMiddleware.swift in Sources */ = {isa = PBXBuildFile; fileRef = 50F87A9622F4B7B90064BEFA /* MPDClientMiddleware.swift */; }; E407861C2110CE6E006887B1 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = E407861B2110CE6E006887B1 /* AppDelegate.swift */; }; E40786202110CE70006887B1 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = E407861F2110CE70006887B1 /* Assets.xcassets */; }; E40786232110CE70006887B1 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = E40786212110CE70006887B1 /* Main.storyboard */; }; @@ -47,8 +48,6 @@ 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 */; }; E440519C227BAF2E0090CD6F /* UIActions.swift in Sources */ = {isa = PBXBuildFile; fileRef = E440519B227BAF2E0090CD6F /* UIActions.swift */; }; E440519E227BB0720090CD6F /* UIReducer.swift in Sources */ = {isa = PBXBuildFile; fileRef = E440519D227BB0720090CD6F /* UIReducer.swift */; }; E44051A0227BB0AB0090CD6F /* UIState.swift in Sources */ = {isa = PBXBuildFile; fileRef = E440519F227BB0AB0090CD6F /* UIState.swift */; }; @@ -183,6 +182,7 @@ /* End PBXCopyFilesBuildPhase section */ /* Begin PBXFileReference section */ + 50F87A9622F4B7B90064BEFA /* MPDClientMiddleware.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MPDClientMiddleware.swift; sourceTree = ""; }; E40786182110CE6E006887B1 /* Persephone.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Persephone.app; sourceTree = BUILT_PRODUCTS_DIR; }; E407861B2110CE6E006887B1 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; E407861F2110CE70006887B1 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; @@ -268,8 +268,6 @@ E4405191227644340090CD6F /* MPDServerController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MPDServerController.swift; sourceTree = ""; }; E44051932278765A0090CD6F /* App.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = App.swift; sourceTree = ""; }; E4405195227879960090CD6F /* MPDActions.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MPDActions.swift; sourceTree = ""; }; - E440519722787CB40090CD6F /* MPDState.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MPDState.swift; sourceTree = ""; }; - E440519922787CF60090CD6F /* MPDReducer.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MPDReducer.swift; sourceTree = ""; }; E440519B227BAF2E0090CD6F /* UIActions.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UIActions.swift; sourceTree = ""; }; E440519D227BB0720090CD6F /* UIReducer.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UIReducer.swift; sourceTree = ""; }; E440519F227BB0AB0090CD6F /* UIState.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UIState.swift; sourceTree = ""; }; @@ -381,6 +379,14 @@ /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ + 50F87A9522F4B7AA0064BEFA /* Middleware */ = { + isa = PBXGroup; + children = ( + 50F87A9622F4B7B90064BEFA /* MPDClientMiddleware.swift */, + ); + path = Middleware; + sourceTree = ""; + }; E407860F2110CE6E006887B1 = { isa = PBXGroup; children = ( @@ -648,7 +654,6 @@ E4B11B74226CC4D30075461B /* QueueReducer.swift */, E4B11B78226D346B0075461B /* AlbumListReducer.swift */, E4FF718F227601B400D4C412 /* PreferencesReducer.swift */, - E440519922787CF60090CD6F /* MPDReducer.swift */, E440519D227BB0720090CD6F /* UIReducer.swift */, ); path = Reducers; @@ -659,13 +664,13 @@ children = ( E4B11B6B226A5AF50075461B /* Actions */, E4B11B5F226A4BED0075461B /* Reducers */, + 50F87A9522F4B7AA0064BEFA /* Middleware */, E4B11B52226928F20075461B /* AppState.swift */, E440519F227BB0AB0090CD6F /* UIState.swift */, E4B11B65226A4F830075461B /* PlayerState.swift */, E4B11B67226A4FA00075461B /* QueueState.swift */, E4B11B69226A4FBC0075461B /* AlbumListState.swift */, E4FF718D2276010E00D4C412 /* PreferencesState.swift */, - E440519722787CB40090CD6F /* MPDState.swift */, ); path = State; sourceTree = ""; @@ -956,7 +961,6 @@ 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 */, E4235640228623D2001216D6 /* QueueSongTitleView.swift in Sources */, E451E36E22BD2501008BE9B2 /* DraggedSong.swift in Sources */, @@ -977,6 +981,7 @@ E4E7A6AD22AAAF98006D566C /* AlbumDetailView+NSTableViewDelegate.swift in Sources */, E4FF7190227601B400D4C412 /* PreferencesReducer.swift in Sources */, E4F6B463221E125900ACF42A /* QueueItem.swift in Sources */, + 50F87A9722F4B7B90064BEFA /* MPDClientMiddleware.swift in Sources */, E4A83BF12221FAA00098FED6 /* PreferencesViewController.swift in Sources */, E4B11BC22275EE410075461B /* AlbumListActions.swift in Sources */, E4B11B61226A4C000075461B /* PlayerReducer.swift in Sources */, @@ -1023,7 +1028,6 @@ E4A3A6A122A457B600EA2C40 /* AlbumDetailSongListView.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 */, diff --git a/Persephone/App.swift b/Persephone/App.swift index 39e8615..e908231 100644 --- a/Persephone/App.swift +++ b/Persephone/App.swift @@ -10,7 +10,7 @@ import Foundation import ReSwift struct App { - static let store = Store(reducer: appReducer, state: nil) + static let store = Store(reducer: appReducer, state: nil, middleware: [mpdClientMiddleware], automaticallySkipsRepeats: true) static let trackTimer = TrackTimer() static let userNotificationsController = UserNotificationsController() static let mpdServerController = MPDServerController() diff --git a/Persephone/State/AppState.swift b/Persephone/State/AppState.swift index 70fd2b5..cec9ba0 100644 --- a/Persephone/State/AppState.swift +++ b/Persephone/State/AppState.swift @@ -13,6 +13,5 @@ struct AppState: StateType { var queueState = QueueState() var albumListState = AlbumListState() var preferencesState = PreferencesState() - var mpdState = MPDState() var uiState = UIState() } diff --git a/Persephone/State/MPDState.swift b/Persephone/State/MPDState.swift deleted file mode 100644 index 30cbfd1..0000000 --- a/Persephone/State/MPDState.swift +++ /dev/null @@ -1,11 +0,0 @@ -// -// MPDState.swift -// Persephone -// -// Created by Daniel Barber on 2019/4/30. -// Copyright © 2019 Dan Barber. All rights reserved. -// - -import ReSwift - -struct MPDState: StateType {} diff --git a/Persephone/State/Middleware/MPDClientMiddleware.swift b/Persephone/State/Middleware/MPDClientMiddleware.swift new file mode 100644 index 0000000..23ce0fe --- /dev/null +++ b/Persephone/State/Middleware/MPDClientMiddleware.swift @@ -0,0 +1,73 @@ +// +// MPDClientMiddleware.swift +// Persephone +// +// Created by Christian Tietze on 2019-08-02 +// Copyright © 2019 Dan Barber. All rights reserved. +// + +import ReSwift + +let mpdClientMiddleware: Middleware = { dispatch, getState in + return { next in + return { action in + next(action) + + switch action { + case is MPDConnectAction: + let mpdServer = App.store.state.preferencesState.mpdServer + App.mpdClient.connect( + host: mpdServer.hostOrDefault, + port: mpdServer.portOrDefault + ) + 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 is MPDClearQueue: + App.mpdClient.clearQueue() + + case let action as MPDMoveSongInQueue: + App.mpdClient.moveSongInQueue(at: action.oldQueuePos, to: action.newQueuePos) + + case let action as MPDAddSongToQueue: + App.mpdClient.addSongToQueue(songUri: action.songUri, at: action.queuePos) + + case let action as MPDAppendTrack: + App.mpdClient.appendSong(action.song) + + case let action as MPDRemoveTrack: + App.mpdClient.removeSong(at: action.queuePos) + + 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 let action as MPDSetShuffleAction: + App.mpdClient.setShuffleState(shuffleState: action.shuffleState) + + case let action as MPDSetRepeatAction: + App.mpdClient.setRepeatState(repeatState: action.repeatState) + + case is MPDUpdateDatabaseAction: + App.mpdClient.updateDatabase() + + default: + break + } + } + } +} diff --git a/Persephone/State/Reducers/AppReducer.swift b/Persephone/State/Reducers/AppReducer.swift index c66228a..ed0a499 100644 --- a/Persephone/State/Reducers/AppReducer.swift +++ b/Persephone/State/Reducers/AppReducer.swift @@ -14,7 +14,6 @@ func appReducer(action: Action, state: AppState?) -> AppState { queueState: queueReducer(action: action, state: state?.queueState), albumListState: albumListReducer(action: action, state: state?.albumListState), preferencesState: preferencesReducer(action: action, state: state?.preferencesState), - mpdState: mpdReducer(action: action, state: state?.mpdState), uiState: uiReducer(action: action, state: state?.uiState) ) } diff --git a/Persephone/State/Reducers/MPDReducer.swift b/Persephone/State/Reducers/MPDReducer.swift deleted file mode 100644 index 56d2dbe..0000000 --- a/Persephone/State/Reducers/MPDReducer.swift +++ /dev/null @@ -1,71 +0,0 @@ -// -// 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 is MPDConnectAction: - let mpdServer = App.store.state.preferencesState.mpdServer - App.mpdClient.connect( - host: mpdServer.hostOrDefault, - port: mpdServer.portOrDefault - ) - 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 is MPDClearQueue: - App.mpdClient.clearQueue() - - case let action as MPDMoveSongInQueue: - App.mpdClient.moveSongInQueue(at: action.oldQueuePos, to: action.newQueuePos) - - case let action as MPDAddSongToQueue: - App.mpdClient.addSongToQueue(songUri: action.songUri, at: action.queuePos) - - case let action as MPDAppendTrack: - App.mpdClient.appendSong(action.song) - - case let action as MPDRemoveTrack: - App.mpdClient.removeSong(at: action.queuePos) - - 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 let action as MPDSetShuffleAction: - App.mpdClient.setShuffleState(shuffleState: action.shuffleState) - - case let action as MPDSetRepeatAction: - App.mpdClient.setRepeatState(repeatState: action.repeatState) - - case is MPDUpdateDatabaseAction: - App.mpdClient.updateDatabase() - - default: - break - } - - return state -}