Mobile friendly queue revamp

This commit is contained in:
James Barnsley
2019-08-13 16:53:39 +12:00
parent 009e3cee6c
commit d7ab7fb6c5
8 changed files with 838 additions and 712 deletions

View File

@ -6922,22 +6922,34 @@ main .track-view {
position: relative;
z-index: 2; }
.queue-view .current-track__added-from {
padding-top: 2rem; }
.queue-view .current-track__added-from__link {
display: flex;
align-items: center;
border: 0 !important; }
padding-top: 2rem;
display: flex;
align-items: center; }
.queue-view .current-track__added-from__text {
border: 0 !important;
display: block;
padding-left: 15px; }
.queue-view .current-track__added-from__thumbnail {
display: inline-block;
max-width: 30px; }
border: 0 !important; }
.queue-view .current-track__added-from__thumbnail .thumbnail {
width: 30px; }
@media (max-width: 799px) {
.queue-view .current-track {
padding-bottom: 20px; }
.queue-view .current-track .artwork {
width: 80%; } }
display: block;
text-align: center;
padding: 40px 0 20px; }
.queue-view .current-track__artwork {
width: auto;
margin: 0 0 20px 0;
text-align: center; }
.queue-view .current-track__artwork .thumbnail {
width: 90%;
max-width: 30vh; }
.queue-view .current-track__details {
width: auto;
margin: 0; }
.queue-view .current-track__added-from {
display: none; } }
.search-view .search-form {
position: absolute;

File diff suppressed because one or more lines are too long

View File

@ -79938,7 +79938,7 @@ exports.default = (0, _reactRedux.connect)(mapStateToProps, mapDispatchToProps)(
Object.defineProperty(exports, "__esModule", {
value: true
value: true
});
var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
@ -80026,390 +80026,418 @@ function _possibleConstructorReturn(self, call) { if (!self) { throw new Referen
function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
var Queue = function (_React$Component) {
_inherits(Queue, _React$Component);
_inherits(Queue, _React$Component);
function Queue(props) {
_classCallCheck(this, Queue);
function Queue(props) {
_classCallCheck(this, Queue);
var _this = _possibleConstructorReturn(this, (Queue.__proto__ || Object.getPrototypeOf(Queue)).call(this, props));
var _this = _possibleConstructorReturn(this, (Queue.__proto__ || Object.getPrototypeOf(Queue)).call(this, props));
_this.state = {
limit: 50,
per_page: 50
};
return _this;
}
_this.state = {
limit: 50,
per_page: 50
};
return _this;
}
_createClass(Queue, [{
key: 'componentWillMount',
value: function componentWillMount() {
// Before we mount, restore any limit defined in our location state
var state = this.props.location.state ? this.props.location.state : {};
if (state.limit) {
this.setState({
limit: state.limit
});
}
}
}, {
key: 'componentDidMount',
value: function componentDidMount() {
this.props.uiActions.setWindowTitle("Now playing");
}
}, {
key: 'shouldComponentUpdate',
value: function shouldComponentUpdate(nextProps) {
return nextProps !== this.props;
}
}, {
key: 'componentWillReceiveProps',
value: function componentWillReceiveProps(nextProps) {
var added_from_uri = nextProps.added_from_uri;
_createClass(Queue, [{
key: "componentWillMount",
value: function componentWillMount() {
// Before we mount, restore any limit defined in our location state
var state = this.props.location.state ? this.props.location.state : {};
if (state.limit) {
this.setState({
limit: state.limit
});
}
}
}, {
key: "componentDidMount",
value: function componentDidMount() {
this.props.uiActions.setWindowTitle("Now playing");
}
}, {
key: "shouldComponentUpdate",
value: function shouldComponentUpdate(nextProps) {
return nextProps !== this.props;
}
}, {
key: "componentWillReceiveProps",
value: function componentWillReceiveProps(nextProps) {
var added_from_uri = nextProps.added_from_uri;
if (added_from_uri && this.props.added_from_uri !== added_from_uri) {
var item_type = helpers.uriType(added_from_uri);
switch (item_type) {
case 'album':
this.props.coreActions.loadAlbum(added_from_uri);
break;
case 'artist':
this.props.coreActions.loadArtist(added_from_uri);
break;
case 'playlist':
this.props.coreActions.loadPlaylist(added_from_uri);
break;
}
}
}
}, {
key: 'loadMore',
value: function loadMore() {
var new_limit = this.state.limit + this.state.per_page;
if (added_from_uri && this.props.added_from_uri !== added_from_uri) {
var item_type = helpers.uriType(added_from_uri);
switch (item_type) {
case "album":
this.props.coreActions.loadAlbum(added_from_uri);
break;
case "artist":
this.props.coreActions.loadArtist(added_from_uri);
break;
case "playlist":
this.props.coreActions.loadPlaylist(added_from_uri);
break;
}
}
}
}, {
key: "loadMore",
value: function loadMore() {
var new_limit = this.state.limit + this.state.per_page;
this.setState({ limit: new_limit });
this.setState({ limit: new_limit });
// Set our pagination to location state
var state = this.props.location && this.props.location.state ? this.props.location.state : {};
state.limit = new_limit;
this.props.history.replace({ state: state });
}
}, {
key: 'removeTracks',
value: function removeTracks(track_indexes) {
var tlids = [];
for (var i = 0; i < track_indexes.length; i++) {
var track = this.props.queue[track_indexes[i]];
if (track.tlid !== undefined) {
tlids.push(track.tlid);
}
}
// Set our pagination to location state
var state = this.props.location && this.props.location.state ? this.props.location.state : {};
state.limit = new_limit;
this.props.history.replace({ state: state });
}
}, {
key: "removeTracks",
value: function removeTracks(track_indexes) {
var tlids = [];
for (var i = 0; i < track_indexes.length; i++) {
var track = this.props.queue[track_indexes[i]];
if (track.tlid !== undefined) {
tlids.push(track.tlid);
}
}
if (tlids.length > 0) {
this.props.mopidyActions.removeTracks(tlids);
}
}
}, {
key: 'playTrack',
value: function playTrack(track) {
this.props.mopidyActions.changeTrack(track.tlid);
}
}, {
key: 'playTracks',
value: function playTracks(tracks) {
this.props.mopidyActions.changeTrack(tracks[0].tlid);
}
}, {
key: 'reorderTracks',
value: function reorderTracks(indexes, index) {
this.props.mopidyActions.reorderTracklist(indexes, index);
}
}, {
key: 'renderQueueStats',
value: function renderQueueStats() {
var total_time = 0;
if (tlids.length > 0) {
this.props.mopidyActions.removeTracks(tlids);
}
}
}, {
key: "playTrack",
value: function playTrack(track) {
this.props.mopidyActions.changeTrack(track.tlid);
}
}, {
key: "playTracks",
value: function playTracks(tracks) {
this.props.mopidyActions.changeTrack(tracks[0].tlid);
}
}, {
key: "reorderTracks",
value: function reorderTracks(indexes, index) {
this.props.mopidyActions.reorderTracklist(indexes, index);
}
}, {
key: "renderQueueStats",
value: function renderQueueStats() {
var total_time = 0;
return _react2.default.createElement(
'div',
{ className: 'queue-stats mid_grey-text' },
_react2.default.createElement(
'span',
null,
this.props.current_tracklist.length,
' tracks'
),
'\xA0\xA0|\xA0\xA0',
this.props.current_tracklist.length > 0 ? _react2.default.createElement(_Dater2.default, { type: 'total-time', data: this.props.current_tracklist }) : _react2.default.createElement(
'span',
null,
'0 mins'
)
);
}
}, {
key: 'renderArtwork',
value: function renderArtwork(image) {
if (!image) {
return _react2.default.createElement(
'div',
{ className: 'current-track__artwork ' + (this.props.radio_enabled ? 'current-track__artwork--radio-enabled' : '') },
this.props.radio_enabled ? _react2.default.createElement('img', { className: 'radio-overlay', src: '/iris/assets/radio-overlay.png' }) : null,
_react2.default.createElement(_Thumbnail2.default, { circle: this.props.radio_enabled })
);
}
return _react2.default.createElement(
"div",
{ className: "queue-stats mid_grey-text" },
_react2.default.createElement(
"span",
null,
this.props.current_tracklist.length,
" tracks"
),
"\xA0\xA0|\xA0\xA0",
this.props.current_tracklist.length > 0 ? _react2.default.createElement(_Dater2.default, { type: "total-time", data: this.props.current_tracklist }) : _react2.default.createElement(
"span",
null,
"0 mins"
)
);
}
}, {
key: "renderArtwork",
value: function renderArtwork(image) {
if (!image) {
return _react2.default.createElement(
"div",
{
className: "current-track__artwork " + (this.props.radio_enabled ? "current-track__artwork--radio-enabled" : "")
},
this.props.radio_enabled ? _react2.default.createElement("img", {
className: "radio-overlay",
src: "/iris/assets/radio-overlay.png"
}) : null,
_react2.default.createElement(_Thumbnail2.default, { circle: this.props.radio_enabled })
);
}
var uri = null;
if (this.props.current_track.album && this.props.current_track.album.uri) {
uri = this.props.current_track.album.uri;
}
return _react2.default.createElement(
'div',
{ className: 'current-track__artwork ' + (this.props.radio_enabled ? 'current-track__artwork--radio-enabled' : '') },
_react2.default.createElement(
_URILink2.default,
{
type: 'album',
uri: uri },
this.props.radio_enabled ? _react2.default.createElement('img', { className: 'radio-overlay', src: '/iris/assets/radio-overlay.png' }) : null,
_react2.default.createElement(_Thumbnail2.default, { image: image, circle: this.props.radio_enabled })
)
);
}
}, {
key: 'renderAddedFrom',
value: function renderAddedFrom() {
var added_from_uri = this.props.added_from_uri;
var uri = null;
if (this.props.current_track.album && this.props.current_track.album.uri) {
uri = this.props.current_track.album.uri;
}
return _react2.default.createElement(
"div",
{
className: "current-track__artwork " + (this.props.radio_enabled ? "current-track__artwork--radio-enabled" : "")
},
_react2.default.createElement(
_URILink2.default,
{ type: "album", uri: uri },
this.props.radio_enabled ? _react2.default.createElement("img", {
className: "radio-overlay",
src: "/iris/assets/radio-overlay.png"
}) : null,
_react2.default.createElement(_Thumbnail2.default, { image: image, circle: this.props.radio_enabled })
)
);
}
}, {
key: "renderAddedFrom",
value: function renderAddedFrom() {
var added_from_uri = this.props.added_from_uri;
if (!added_from_uri) return null;
if (!added_from_uri) return null;
var item_type = helpers.uriType(added_from_uri);
var item_library = this.props[item_type + 's'];
if (!item_library) return null;
var item_type = helpers.uriType(added_from_uri);
var item_library = this.props[item_type + "s"];
if (!item_library) return null;
var item = item_library[added_from_uri];
if (!item) return null;
var item = item_library[added_from_uri];
if (!item) return null;
return _react2.default.createElement(
'div',
{ className: 'current-track__added-from' },
_react2.default.createElement(
_URILink2.default,
{ type: item_type, uri: item.uri, className: 'current-track__added-from__link' },
_react2.default.createElement(_Thumbnail2.default, { className: 'current-track__added-from__thumbnail', images: item.images, size: 'small', circle: item_type == 'artist' }),
_react2.default.createElement(
'span',
{ className: 'current-track__added-from__text' },
item.name
)
)
);
}
}, {
key: 'render',
value: function render() {
var _this2 = this;
return _react2.default.createElement(
"div",
{ className: "current-track__added-from" },
_react2.default.createElement(
_URILink2.default,
{
type: item_type,
uri: item.uri,
className: "current-track__added-from__thumbnail"
},
_react2.default.createElement(_Thumbnail2.default, {
images: item.images,
size: "small",
circle: item_type == "artist"
})
),
_react2.default.createElement(
"div",
{ className: "current-track__added-from__text" },
"Playing from",
" ",
_react2.default.createElement(
_URILink2.default,
{ type: item_type, uri: item.uri },
item.name
)
)
);
}
}, {
key: "render",
value: function render() {
var _this2 = this;
var _props = this.props,
current_track = _props.current_track,
queue_tracks = _props.queue_tracks;
var _props = this.props,
current_track = _props.current_track,
queue_tracks = _props.queue_tracks;
var total_queue_tracks = queue_tracks.length;
var tracks = queue_tracks.slice(0, this.state.limit);
var total_queue_tracks = queue_tracks.length;
var tracks = queue_tracks.slice(0, this.state.limit);
var current_track_image = null;
if (current_track && this.props.current_track_uri) {
if (current_track.images !== undefined && current_track.images) {
current_track_image = current_track.images.large;
}
}
var current_track_image = null;
if (current_track && this.props.current_track_uri) {
if (current_track.images !== undefined && current_track.images) {
current_track_image = current_track.images.large;
}
}
var options = _react2.default.createElement(
'span',
null,
this.props.spotify_enabled ? _react2.default.createElement(
_Link2.default,
{ className: 'button button--no-hover', to: '/queue/radio' },
_react2.default.createElement(_Icon2.default, { name: 'radio' }),
'Radio',
this.props.radio && this.props.radio.enabled ? _react2.default.createElement(
'span',
{ className: 'flag blue' },
'On'
) : null
) : null,
_react2.default.createElement(
_Link2.default,
{ className: 'button button--no-hover', to: '/queue/history' },
_react2.default.createElement(_Icon2.default, { name: 'history' }),
'History'
),
_react2.default.createElement(
'a',
{ className: 'button button--no-hover', onClick: function onClick(e) {
_this2.props.mopidyActions.clearTracklist();_this2.props.uiActions.hideContextMenu();
} },
_react2.default.createElement(_Icon2.default, { name: 'delete_sweep' }),
'Clear'
),
_react2.default.createElement(
_Link2.default,
{ className: 'button button--no-hover', to: '/queue/add-uri' },
_react2.default.createElement(_Icon2.default, { name: 'playlist_add' }),
'Add URI'
)
);
var options = _react2.default.createElement(
"span",
null,
this.props.spotify_enabled ? _react2.default.createElement(
_Link2.default,
{ className: "button button--no-hover", to: "/queue/radio" },
_react2.default.createElement(_Icon2.default, { name: "radio" }),
"Radio",
this.props.radio && this.props.radio.enabled ? _react2.default.createElement(
"span",
{ className: "flag blue" },
"On"
) : null
) : null,
_react2.default.createElement(
_Link2.default,
{ className: "button button--no-hover", to: "/queue/history" },
_react2.default.createElement(_Icon2.default, { name: "history" }),
"History"
),
_react2.default.createElement(
"a",
{
className: "button button--no-hover",
onClick: function onClick(e) {
_this2.props.mopidyActions.clearTracklist();
_this2.props.uiActions.hideContextMenu();
}
},
_react2.default.createElement(_Icon2.default, { name: "delete_sweep" }),
"Clear"
),
_react2.default.createElement(
_Link2.default,
{ className: "button button--no-hover", to: "/queue/add-uri" },
_react2.default.createElement(_Icon2.default, { name: "playlist_add" }),
"Add URI"
)
);
return _react2.default.createElement(
'div',
{ className: 'view queue-view preserve-3d' },
_react2.default.createElement(
_Header2.default,
{ options: options, uiActions: this.props.uiActions },
_react2.default.createElement(_Icon2.default, { name: 'play_arrow', type: 'material' }),
'Now playing'
),
this.props.theme == 'dark' && _react2.default.createElement(_Parallax2.default, { blur: true, image: current_track_image }),
_react2.default.createElement(
'div',
{ className: 'content-wrapper' },
_react2.default.createElement(
'div',
{ className: 'current-track' },
this.renderArtwork(current_track_image),
_react2.default.createElement(
'div',
{ className: 'current-track__details' },
_react2.default.createElement(
'div',
{ className: 'current-track__title' },
current_track ? _react2.default.createElement(
_URILink2.default,
{ type: 'track', uri: current_track.uri },
current_track.name
) : _react2.default.createElement(
'span',
null,
'-'
)
),
current_track ? _react2.default.createElement(_ArtistSentence2.default, { className: 'current-track__artists', artists: current_track.artists }) : _react2.default.createElement(_ArtistSentence2.default, { className: 'current-track__artists' }),
this.renderAddedFrom()
)
),
_react2.default.createElement(
'section',
{ className: 'list-wrapper' },
_react2.default.createElement(_TrackList2.default, {
show_source_icon: true,
track_context: 'queue',
className: 'queue-track-list',
tracks: tracks,
removeTracks: function removeTracks(track_indexes) {
return _this2.removeTracks(track_indexes);
},
playTracks: function playTracks(tracks) {
return _this2.playTracks(tracks);
},
playTrack: function playTrack(track) {
return _this2.playTrack(track);
},
reorderTracks: function reorderTracks(indexes, index) {
return _this2.reorderTracks(indexes, index);
}
})
),
_react2.default.createElement(_LazyLoadListener2.default, {
loadKey: total_queue_tracks > this.state.limit ? this.state.limit : total_queue_tracks,
showLoader: this.state.limit < total_queue_tracks,
loadMore: function loadMore() {
return _this2.loadMore();
}
})
)
);
}
}]);
return _react2.default.createElement(
"div",
{ className: "view queue-view preserve-3d" },
_react2.default.createElement(
_Header2.default,
{ options: options, uiActions: this.props.uiActions },
_react2.default.createElement(_Icon2.default, { name: "play_arrow", type: "material" }),
"Now playing"
),
this.props.theme == "dark" && _react2.default.createElement(_Parallax2.default, { blur: true, image: current_track_image }),
_react2.default.createElement(
"div",
{ className: "content-wrapper" },
_react2.default.createElement(
"div",
{ className: "current-track" },
this.renderArtwork(current_track_image),
_react2.default.createElement(
"div",
{ className: "current-track__details" },
_react2.default.createElement(
"div",
{ className: "current-track__title" },
current_track ? _react2.default.createElement(
_URILink2.default,
{ type: "track", uri: current_track.uri },
current_track.name
) : _react2.default.createElement(
"span",
null,
"-"
)
),
current_track ? _react2.default.createElement(_ArtistSentence2.default, {
className: "current-track__artists",
artists: current_track.artists
}) : _react2.default.createElement(_ArtistSentence2.default, { className: "current-track__artists" }),
this.renderAddedFrom()
)
),
_react2.default.createElement(
"section",
{ className: "list-wrapper" },
_react2.default.createElement(_TrackList2.default, {
show_source_icon: true,
track_context: "queue",
className: "queue-track-list",
tracks: tracks,
removeTracks: function removeTracks(track_indexes) {
return _this2.removeTracks(track_indexes);
},
playTracks: function playTracks(tracks) {
return _this2.playTracks(tracks);
},
playTrack: function playTrack(track) {
return _this2.playTrack(track);
},
reorderTracks: function reorderTracks(indexes, index) {
return _this2.reorderTracks(indexes, index);
}
})
),
_react2.default.createElement(_LazyLoadListener2.default, {
loadKey: total_queue_tracks > this.state.limit ? this.state.limit : total_queue_tracks,
showLoader: this.state.limit < total_queue_tracks,
loadMore: function loadMore() {
return _this2.loadMore();
}
})
)
);
}
}]);
return Queue;
return Queue;
}(_react2.default.Component);
var mapStateToProps = function mapStateToProps(state, ownProps) {
var current_track = state.core.current_track;
var queue_tracks = [];
var current_track = state.core.current_track;
var queue_tracks = [];
if (state.core.queue && state.core.tracks) {
var _iteratorNormalCompletion = true;
var _didIteratorError = false;
var _iteratorError = undefined;
if (state.core.queue && state.core.tracks) {
var _iteratorNormalCompletion = true;
var _didIteratorError = false;
var _iteratorError = undefined;
try {
for (var _iterator = state.core.queue[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {
var queue_track = _step.value;
try {
for (var _iterator = state.core.queue[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {
var queue_track = _step.value;
var track = Object.assign({}, queue_track);
var track = Object.assign({}, queue_track);
// If we have the track in our index, merge it in.
// We prioritise queue track over index track as queue has unique data, like which track
// is playing and tlids.
if (state.core.tracks.hasOwnProperty(track.uri)) {
track = Object.assign({}, state.core.tracks[track.uri], track, {
playing: current_track && current_track.tlid == track.tlid
});
}
// If we have the track in our index, merge it in.
// We prioritise queue track over index track as queue has unique data, like which track
// is playing and tlids.
if (state.core.tracks.hasOwnProperty(track.uri)) {
track = Object.assign({}, state.core.tracks[track.uri], track, {
playing: current_track && current_track.tlid == track.tlid
});
}
// Now merge in our queue metadata
if (state.core.queue_metadata["tlid_" + track.tlid] !== undefined) {
track = Object.assign({}, track, state.core.queue_metadata["tlid_" + track.tlid]);
}
// Now merge in our queue metadata
if (state.core.queue_metadata["tlid_" + track.tlid] !== undefined) {
track = Object.assign({}, track, state.core.queue_metadata["tlid_" + track.tlid]);
}
// Siphon off this track if it's a full representation of our current track (by tlid)
if (current_track && current_track.uri == track.uri) {
current_track = track;
}
// Siphon off this track if it's a full representation of our current track (by tlid)
if (current_track && current_track.uri == track.uri) {
current_track = track;
}
// Now add our compiled track for our tracklist
queue_tracks.push(track);
}
} catch (err) {
_didIteratorError = true;
_iteratorError = err;
} finally {
try {
if (!_iteratorNormalCompletion && _iterator.return) {
_iterator.return();
}
} finally {
if (_didIteratorError) {
throw _iteratorError;
}
}
}
}
// Now add our compiled track for our tracklist
queue_tracks.push(track);
}
} catch (err) {
_didIteratorError = true;
_iteratorError = err;
} finally {
try {
if (!_iteratorNormalCompletion && _iterator.return) {
_iterator.return();
}
} finally {
if (_didIteratorError) {
throw _iteratorError;
}
}
}
}
return {
theme: state.ui.theme,
spotify_enabled: state.spotify.enabled,
radio: state.core.radio,
radio_enabled: state.core.radio && state.core.radio.enabled ? true : false,
artists: state.core.artists,
albums: state.core.albums,
playlists: state.core.playlists,
queue_tracks: queue_tracks,
current_track_uri: state.core.current_track_uri,
current_track: current_track,
added_from_uri: current_track && current_track.added_from ? current_track.added_from : null
};
return {
theme: state.ui.theme,
spotify_enabled: state.spotify.enabled,
radio: state.core.radio,
radio_enabled: state.core.radio && state.core.radio.enabled ? true : false,
artists: state.core.artists,
albums: state.core.albums,
playlists: state.core.playlists,
queue_tracks: queue_tracks,
current_track_uri: state.core.current_track_uri,
current_track: current_track,
added_from_uri: current_track && current_track.added_from ? current_track.added_from : null
};
};
var mapDispatchToProps = function mapDispatchToProps(dispatch) {
return {
coreActions: (0, _redux.bindActionCreators)(coreActions, dispatch),
uiActions: (0, _redux.bindActionCreators)(uiActions, dispatch),
pusherActions: (0, _redux.bindActionCreators)(pusherActions, dispatch),
spotifyActions: (0, _redux.bindActionCreators)(spotifyActions, dispatch),
mopidyActions: (0, _redux.bindActionCreators)(mopidyActions, dispatch)
};
return {
coreActions: (0, _redux.bindActionCreators)(coreActions, dispatch),
uiActions: (0, _redux.bindActionCreators)(uiActions, dispatch),
pusherActions: (0, _redux.bindActionCreators)(pusherActions, dispatch),
spotifyActions: (0, _redux.bindActionCreators)(spotifyActions, dispatch),
mopidyActions: (0, _redux.bindActionCreators)(mopidyActions, dispatch)
};
};
exports.default = (0, _reactRedux.connect)(mapStateToProps, mapDispatchToProps)(Queue);

File diff suppressed because one or more lines are too long