Proof-of-concept pinned playlist

This commit is contained in:
James Barnsley
2020-08-08 22:17:31 +12:00
parent 7e1d97ed54
commit 55c06454e0
10 changed files with 425 additions and 82 deletions

View File

@ -90413,6 +90413,138 @@ var mapDispatchToProps = function mapDispatchToProps(dispatch) {
/***/ }), /***/ }),
/***/ "./src/js/components/Fields/PinButton.js":
/*!***********************************************!*\
!*** ./src/js/components/Fields/PinButton.js ***!
\***********************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ "./node_modules/react/index.js");
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);
/* harmony import */ var react_redux__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react-redux */ "./node_modules/react-redux/es/index.js");
/* harmony import */ var redux__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! redux */ "./node_modules/redux/es/redux.js");
/* harmony import */ var _services_core_actions__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../services/core/actions */ "./src/js/services/core/actions.js");
/* harmony import */ var _Icon__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../Icon */ "./src/js/components/Icon.js");
function _typeof(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); }
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); if (superClass) _setPrototypeOf(subClass, superClass); }
function _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); }
function _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = _getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; }
function _possibleConstructorReturn(self, call) { if (call && (_typeof(call) === "object" || typeof call === "function")) { return call; } return _assertThisInitialized(self); }
function _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; }
function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Date.prototype.toString.call(Reflect.construct(Date, [], function () {})); return true; } catch (e) { return false; } }
function _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); }
function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
var PinButton = /*#__PURE__*/function (_React$Component) {
_inherits(PinButton, _React$Component);
var _super = _createSuper(PinButton);
function PinButton() {
var _this;
_classCallCheck(this, PinButton);
for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
args[_key] = arguments[_key];
}
_this = _super.call.apply(_super, [this].concat(args));
_defineProperty(_assertThisInitialized(_this), "remove", function () {
var _this$props = _this.props,
removePinned = _this$props.coreActions.removePinned,
uri = _this$props.uri;
removePinned(uri);
});
_defineProperty(_assertThisInitialized(_this), "add", function () {
var _this$props2 = _this.props,
addPinned = _this$props2.coreActions.addPinned,
uri = _this$props2.uri;
addPinned(uri);
});
_defineProperty(_assertThisInitialized(_this), "render", function () {
var _this$props3 = _this.props,
uri = _this$props3.uri,
isPinned = _this$props3.isPinned;
var _this$props$className = _this.props.className,
className = _this$props$className === void 0 ? '' : _this$props$className;
if (!uri) return null;
className += ' button button--discrete';
if (isPinned) {
return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement("button", {
type: "button",
className: "".concat(className, " button--destructive"),
onClick: _this.remove,
"data-qa-node": "button",
"data-qa-file": "PinButton"
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(_Icon__WEBPACK_IMPORTED_MODULE_4__["default"], {
name: "bookmark",
"data-qa-node": "Icon",
"data-qa-file": "PinButton"
}));
}
return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement("button", {
type: "button",
className: "".concat(className, " button--default"),
onClick: _this.add,
"data-qa-node": "button",
"data-qa-file": "PinButton"
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(_Icon__WEBPACK_IMPORTED_MODULE_4__["default"], {
name: "bookmark_border",
"data-qa-node": "Icon",
"data-qa-file": "PinButton"
}));
});
return _this;
}
return PinButton;
}(react__WEBPACK_IMPORTED_MODULE_0___default.a.Component);
var mapStateToProps = function mapStateToProps(state, _ref) {
var uri = _ref.uri;
return {
isPinned: state.core.pinned ? state.core.pinned.find(function (item) {
return item === uri;
}) : false
};
};
var mapDispatchToProps = function mapDispatchToProps(dispatch) {
return {
coreActions: Object(redux__WEBPACK_IMPORTED_MODULE_2__["bindActionCreators"])(_services_core_actions__WEBPACK_IMPORTED_MODULE_3__, dispatch)
};
};
/* harmony default export */ __webpack_exports__["default"] = (Object(react_redux__WEBPACK_IMPORTED_MODULE_1__["connect"])(mapStateToProps, mapDispatchToProps)(PinButton));
/***/ }),
/***/ "./src/js/components/Fields/ProgressSlider.js": /***/ "./src/js/components/Fields/ProgressSlider.js":
/*!****************************************************!*\ /*!****************************************************!*\
!*** ./src/js/components/Fields/ProgressSlider.js ***! !*** ./src/js/components/Fields/ProgressSlider.js ***!
@ -99123,7 +99255,7 @@ module.exports = JSON.parse("{\"name\":\"Svenska\",\"errors\":{\"uri_not_found\"
/*!*****************************************!*\ /*!*****************************************!*\
!*** ./src/js/services/core/actions.js ***! !*** ./src/js/services/core/actions.js ***!
\*****************************************/ \*****************************************/
/*! exports provided: getBroadcasts, startSearch, handleException, debugResponse, set, clearCurrentTrack, cachebustHttpStream, loadItem, loadTrack, loadAlbum, loadArtist, loadPlaylist, loadUser, loadUserPlaylists, trackLoaded, tracksLoaded, artistLoaded, artistsLoaded, albumLoaded, albumsLoaded, playlistLoaded, playlistsLoaded, userLoaded, usersLoaded, userPlaylistsLoaded, loadedMore, removeFromIndex, viewDataLoaded, reorderPlaylistTracks, savePlaylist, createPlaylist, deletePlaylist, removeTracksFromPlaylist, addTracksToPlaylist, getLibraryPlaylists, getLibraryAlbums, getLibraryArtists */ /*! exports provided: getBroadcasts, startSearch, handleException, debugResponse, set, clearCurrentTrack, cachebustHttpStream, loadItem, loadTrack, loadAlbum, loadArtist, loadPlaylist, loadUser, loadUserPlaylists, trackLoaded, tracksLoaded, artistLoaded, artistsLoaded, albumLoaded, albumsLoaded, playlistLoaded, playlistsLoaded, userLoaded, usersLoaded, userPlaylistsLoaded, loadedMore, removeFromIndex, viewDataLoaded, reorderPlaylistTracks, savePlaylist, createPlaylist, deletePlaylist, removeTracksFromPlaylist, addTracksToPlaylist, getLibraryPlaylists, getLibraryAlbums, getLibraryArtists, addPinned, removePinned, updatePinned */
/***/ (function(module, __webpack_exports__, __webpack_require__) { /***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict"; "use strict";
@ -99165,6 +99297,9 @@ __webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getLibraryPlaylists", function() { return getLibraryPlaylists; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getLibraryPlaylists", function() { return getLibraryPlaylists; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getLibraryAlbums", function() { return getLibraryAlbums; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getLibraryAlbums", function() { return getLibraryAlbums; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getLibraryArtists", function() { return getLibraryArtists; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getLibraryArtists", function() { return getLibraryArtists; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "addPinned", function() { return addPinned; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "removePinned", function() { return removePinned; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "updatePinned", function() { return updatePinned; });
/* harmony import */ var _util_arrays__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../util/arrays */ "./src/js/util/arrays.js"); /* harmony import */ var _util_arrays__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../util/arrays */ "./src/js/util/arrays.js");
/* harmony import */ var _util_helpers__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../util/helpers */ "./src/js/util/helpers.js"); /* harmony import */ var _util_helpers__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../util/helpers */ "./src/js/util/helpers.js");
@ -99578,6 +99713,24 @@ function getLibraryArtists() {
type: 'GET_LIBRARY_ARTISTS' type: 'GET_LIBRARY_ARTISTS'
}; };
} }
function addPinned(uri) {
return {
type: 'ADD_PINNED',
uri: uri
};
}
function removePinned(uri) {
return {
type: 'REMOVE_PINNED',
uri: uri
};
}
function updatePinned(pinned) {
return {
type: 'UPDATE_PINNED',
pinned: pinned
};
}
/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! jquery */ "./node_modules/jquery/dist/jquery.js"))) /* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! jquery */ "./node_modules/jquery/dist/jquery.js")))
/***/ }), /***/ }),
@ -100558,6 +100711,18 @@ var CoreMiddleware = function () {
store.dispatch(records_action); store.dispatch(records_action);
next(action); next(action);
break; break;
case 'ADD_PINNED':
store.dispatch(coreActions.updatePinned([].concat(_toConsumableArray(store.getState().core.pinned), [action.uri])));
next(action);
break;
case 'REMOVE_PINNED':
store.dispatch(coreActions.updatePinned(store.getState().core.pinned.filter(function (item) {
return item !== action.uri;
})));
next(action);
break;
// This action is irrelevant to us, pass it on to the next middleware // This action is irrelevant to us, pass it on to the next middleware
default: default:
@ -100963,6 +101128,11 @@ function reducer() {
} }
}); });
case 'UPDATE_PINNED':
return _objectSpread(_objectSpread({}, core), {}, {
pinned: action.pinned
});
default: default:
return core; return core;
} }
@ -102487,6 +102657,12 @@ var localstorageMiddleware = function () {
_util_storage__WEBPACK_IMPORTED_MODULE_0__["default"].set('core', action.data); _util_storage__WEBPACK_IMPORTED_MODULE_0__["default"].set('core', action.data);
break; break;
case 'UPDATE_PINNED':
_util_storage__WEBPACK_IMPORTED_MODULE_0__["default"].set('core', {
pinned: action.pinned
});
break;
case 'UI_SET': case 'UI_SET':
_util_storage__WEBPACK_IMPORTED_MODULE_0__["default"].set('ui', action.data); _util_storage__WEBPACK_IMPORTED_MODULE_0__["default"].set('ui', action.data);
break; break;
@ -111709,6 +111885,7 @@ var state = {
queue: [], queue: [],
queue_metadata: {}, queue_metadata: {},
current_track: null, current_track: null,
pinned: [],
albums: {}, albums: {},
artists: {}, artists: {},
playlists: {}, playlists: {},
@ -116073,27 +116250,26 @@ __webpack_require__.r(__webpack_exports__);
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__); /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);
/* harmony import */ var react_redux__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react-redux */ "./node_modules/react-redux/es/index.js"); /* harmony import */ var react_redux__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react-redux */ "./node_modules/react-redux/es/index.js");
/* harmony import */ var redux__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! redux */ "./node_modules/redux/es/redux.js"); /* harmony import */ var redux__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! redux */ "./node_modules/redux/es/redux.js");
/* harmony import */ var react_ga__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! react-ga */ "./node_modules/react-ga/dist/esm/index.js"); /* harmony import */ var _components_ErrorMessage__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../components/ErrorMessage */ "./src/js/components/ErrorMessage.js");
/* harmony import */ var _components_ErrorMessage__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../components/ErrorMessage */ "./src/js/components/ErrorMessage.js"); /* harmony import */ var _components_Link__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../components/Link */ "./src/js/components/Link.js");
/* harmony import */ var _components_Link__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../components/Link */ "./src/js/components/Link.js"); /* harmony import */ var _components_TrackList__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../components/TrackList */ "./src/js/components/TrackList.js");
/* harmony import */ var _components_TrackList__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../components/TrackList */ "./src/js/components/TrackList.js"); /* harmony import */ var _components_Thumbnail__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../components/Thumbnail */ "./src/js/components/Thumbnail.js");
/* harmony import */ var _components_Thumbnail__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../components/Thumbnail */ "./src/js/components/Thumbnail.js"); /* harmony import */ var _components_Fields_PinButton__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../components/Fields/PinButton */ "./src/js/components/Fields/PinButton.js");
/* harmony import */ var _components_Parallax__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../components/Parallax */ "./src/js/components/Parallax.js"); /* harmony import */ var _components_NiceNumber__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../components/NiceNumber */ "./src/js/components/NiceNumber.js");
/* harmony import */ var _components_NiceNumber__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../components/NiceNumber */ "./src/js/components/NiceNumber.js"); /* harmony import */ var _components_Dater__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../components/Dater */ "./src/js/components/Dater.js");
/* harmony import */ var _components_Dater__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../components/Dater */ "./src/js/components/Dater.js"); /* harmony import */ var _components_LazyLoadListener__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../components/LazyLoadListener */ "./src/js/components/LazyLoadListener.js");
/* harmony import */ var _components_LazyLoadListener__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ../components/LazyLoadListener */ "./src/js/components/LazyLoadListener.js"); /* harmony import */ var _components_Fields_FollowButton__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ../components/Fields/FollowButton */ "./src/js/components/Fields/FollowButton.js");
/* harmony import */ var _components_Fields_FollowButton__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ../components/Fields/FollowButton */ "./src/js/components/Fields/FollowButton.js"); /* harmony import */ var _components_Loader__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ../components/Loader */ "./src/js/components/Loader.js");
/* harmony import */ var _components_Loader__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ../components/Loader */ "./src/js/components/Loader.js"); /* harmony import */ var _components_ContextMenuTrigger__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ../components/ContextMenuTrigger */ "./src/js/components/ContextMenuTrigger.js");
/* harmony import */ var _components_ContextMenuTrigger__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ../components/ContextMenuTrigger */ "./src/js/components/ContextMenuTrigger.js"); /* harmony import */ var _components_URILink__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ../components/URILink */ "./src/js/components/URILink.js");
/* harmony import */ var _components_URILink__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! ../components/URILink */ "./src/js/components/URILink.js"); /* harmony import */ var _components_Icon__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! ../components/Icon */ "./src/js/components/Icon.js");
/* harmony import */ var _components_Icon__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! ../components/Icon */ "./src/js/components/Icon.js"); /* harmony import */ var _services_core_actions__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! ../services/core/actions */ "./src/js/services/core/actions.js");
/* harmony import */ var _services_core_actions__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! ../services/core/actions */ "./src/js/services/core/actions.js"); /* harmony import */ var _services_ui_actions__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! ../services/ui/actions */ "./src/js/services/ui/actions.js");
/* harmony import */ var _services_ui_actions__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(/*! ../services/ui/actions */ "./src/js/services/ui/actions.js"); /* harmony import */ var _services_mopidy_actions__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(/*! ../services/mopidy/actions */ "./src/js/services/mopidy/actions.js");
/* harmony import */ var _services_mopidy_actions__WEBPACK_IMPORTED_MODULE_19__ = __webpack_require__(/*! ../services/mopidy/actions */ "./src/js/services/mopidy/actions.js"); /* harmony import */ var _services_spotify_actions__WEBPACK_IMPORTED_MODULE_19__ = __webpack_require__(/*! ../services/spotify/actions */ "./src/js/services/spotify/actions.js");
/* harmony import */ var _services_spotify_actions__WEBPACK_IMPORTED_MODULE_20__ = __webpack_require__(/*! ../services/spotify/actions */ "./src/js/services/spotify/actions.js"); /* harmony import */ var _util_helpers__WEBPACK_IMPORTED_MODULE_20__ = __webpack_require__(/*! ../util/helpers */ "./src/js/util/helpers.js");
/* harmony import */ var _util_helpers__WEBPACK_IMPORTED_MODULE_21__ = __webpack_require__(/*! ../util/helpers */ "./src/js/util/helpers.js"); /* harmony import */ var _util_format__WEBPACK_IMPORTED_MODULE_21__ = __webpack_require__(/*! ../util/format */ "./src/js/util/format.js");
/* harmony import */ var _util_format__WEBPACK_IMPORTED_MODULE_22__ = __webpack_require__(/*! ../util/format */ "./src/js/util/format.js"); /* harmony import */ var _locale__WEBPACK_IMPORTED_MODULE_22__ = __webpack_require__(/*! ../locale */ "./src/js/locale/index.js");
/* harmony import */ var _locale__WEBPACK_IMPORTED_MODULE_23__ = __webpack_require__(/*! ../locale */ "./src/js/locale/index.js");
function _typeof(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); } function _typeof(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); }
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
@ -116140,7 +116316,6 @@ function _defineProperty(obj, key, value) { if (key in obj) { Object.definePrope
var Playlist = /*#__PURE__*/function (_React$Component) { var Playlist = /*#__PURE__*/function (_React$Component) {
@ -116173,7 +116348,7 @@ var Playlist = /*#__PURE__*/function (_React$Component) {
if (uri !== prevUri) { if (uri !== prevUri) {
loadPlaylist(uri); loadPlaylist(uri);
} else if (!prev_mopidy_connected && mopidy_connected) { } else if (!prev_mopidy_connected && mopidy_connected) {
if (Object(_util_helpers__WEBPACK_IMPORTED_MODULE_21__["uriSource"])(uri) !== 'spotify') { if (Object(_util_helpers__WEBPACK_IMPORTED_MODULE_20__["uriSource"])(uri) !== 'spotify') {
loadPlaylist(uri); loadPlaylist(uri);
} }
} }
@ -116185,9 +116360,9 @@ var Playlist = /*#__PURE__*/function (_React$Component) {
_defineProperty(_assertThisInitialized(_this), "setWindowTitle", function () { _defineProperty(_assertThisInitialized(_this), "setWindowTitle", function () {
var playlist = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : _this.props.playlist; var playlist = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : _this.props.playlist;
var setWindowTitle = _this.props.uiActions.setWindowTitle; var setWindowTitle = _this.props.uiActions.setWindowTitle;
setWindowTitle(playlist ? Object(_locale__WEBPACK_IMPORTED_MODULE_23__["i18n"])('playlist.title_window', { setWindowTitle(playlist ? Object(_locale__WEBPACK_IMPORTED_MODULE_22__["i18n"])('playlist.title_window', {
name: playlist.name name: playlist.name
}) : Object(_locale__WEBPACK_IMPORTED_MODULE_23__["i18n"])('playlist.title')); }) : Object(_locale__WEBPACK_IMPORTED_MODULE_22__["i18n"])('playlist.title'));
}); });
_defineProperty(_assertThisInitialized(_this), "loadMore", function () { _defineProperty(_assertThisInitialized(_this), "loadMore", function () {
@ -116245,18 +116420,32 @@ var Playlist = /*#__PURE__*/function (_React$Component) {
_defineProperty(_assertThisInitialized(_this), "inLibrary", function () { _defineProperty(_assertThisInitialized(_this), "inLibrary", function () {
var uri = _this.props.uri; var uri = _this.props.uri;
var libraryName = "".concat(Object(_util_helpers__WEBPACK_IMPORTED_MODULE_21__["uriSource"])(uri), "_library_playlists"); var libraryName = "".concat(Object(_util_helpers__WEBPACK_IMPORTED_MODULE_20__["uriSource"])(uri), "_library_playlists");
var library = _this.props[libraryName]; var library = _this.props[libraryName];
if (!library) return false; if (!library) return false;
return library.indexOf(uri) > -1; return library.indexOf(uri) > -1;
}); });
_defineProperty(_assertThisInitialized(_this), "renderActions", function () { _defineProperty(_assertThisInitialized(_this), "togglePinned", function () {
var _this$props7 = _this.props, var _this$props7 = _this.props,
uri = _this$props7.uri, uri = _this$props7.uri,
can_edit = _this$props7.playlist.can_edit; _this$props7$coreActi = _this$props7.coreActions,
addPinned = _this$props7$coreActi.addPinned,
removePinned = _this$props7$coreActi.removePinned;
switch (Object(_util_helpers__WEBPACK_IMPORTED_MODULE_21__["uriSource"])(_this.props.uri)) { if (_this.isPinned()) {
removePinned(uri);
} else {
addPinned(uri);
}
});
_defineProperty(_assertThisInitialized(_this), "renderActions", function () {
var _this$props8 = _this.props,
uri = _this$props8.uri,
can_edit = _this$props8.playlist.can_edit;
switch (Object(_util_helpers__WEBPACK_IMPORTED_MODULE_20__["uriSource"])(_this.props.uri)) {
case 'm3u': case 'm3u':
return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement("div", { return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement("div", {
className: "actions", className: "actions",
@ -116267,20 +116456,24 @@ var Playlist = /*#__PURE__*/function (_React$Component) {
onClick: _this.play, onClick: _this.play,
"data-qa-node": "button", "data-qa-node": "button",
"data-qa-file": "Playlist" "data-qa-file": "Playlist"
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(_locale__WEBPACK_IMPORTED_MODULE_23__["I18n"], { }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(_locale__WEBPACK_IMPORTED_MODULE_22__["I18n"], {
path: "actions.play", path: "actions.play",
"data-qa-node": "I18n", "data-qa-node": "I18n",
"data-qa-file": "Playlist" "data-qa-file": "Playlist"
})), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(_components_Link__WEBPACK_IMPORTED_MODULE_5__["default"], { })), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(_components_Link__WEBPACK_IMPORTED_MODULE_4__["default"], {
className: "button button--default", className: "button button--default",
to: "/playlist/".concat(encodeURIComponent(uri), "/edit"), to: "/playlist/".concat(encodeURIComponent(uri), "/edit"),
"data-qa-node": "Link", "data-qa-node": "Link",
"data-qa-file": "Playlist" "data-qa-file": "Playlist"
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(_locale__WEBPACK_IMPORTED_MODULE_23__["I18n"], { }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(_locale__WEBPACK_IMPORTED_MODULE_22__["I18n"], {
path: "actions.edit", path: "actions.edit",
"data-qa-node": "I18n", "data-qa-node": "I18n",
"data-qa-file": "Playlist" "data-qa-file": "Playlist"
})), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(_components_ContextMenuTrigger__WEBPACK_IMPORTED_MODULE_14__["default"], { })), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(_components_Fields_PinButton__WEBPACK_IMPORTED_MODULE_7__["default"], {
uri: uri,
"data-qa-node": "PinButton",
"data-qa-file": "Playlist"
}), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(_components_ContextMenuTrigger__WEBPACK_IMPORTED_MODULE_13__["default"], {
onTrigger: _this.handleContextMenu, onTrigger: _this.handleContextMenu,
"data-qa-node": "ContextMenuTrigger", "data-qa-node": "ContextMenuTrigger",
"data-qa-file": "Playlist" "data-qa-file": "Playlist"
@ -116297,20 +116490,24 @@ var Playlist = /*#__PURE__*/function (_React$Component) {
onClick: _this.play, onClick: _this.play,
"data-qa-node": "button", "data-qa-node": "button",
"data-qa-file": "Playlist" "data-qa-file": "Playlist"
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(_locale__WEBPACK_IMPORTED_MODULE_23__["I18n"], { }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(_locale__WEBPACK_IMPORTED_MODULE_22__["I18n"], {
path: "actions.play", path: "actions.play",
"data-qa-node": "I18n", "data-qa-node": "I18n",
"data-qa-file": "Playlist" "data-qa-file": "Playlist"
})), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(_components_Link__WEBPACK_IMPORTED_MODULE_5__["default"], { })), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(_components_Link__WEBPACK_IMPORTED_MODULE_4__["default"], {
className: "button button--default", className: "button button--default",
to: "/playlist/".concat(encodeURIComponent(uri), "/edit"), to: "/playlist/".concat(encodeURIComponent(uri), "/edit"),
"data-qa-node": "Link", "data-qa-node": "Link",
"data-qa-file": "Playlist" "data-qa-file": "Playlist"
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(_locale__WEBPACK_IMPORTED_MODULE_23__["I18n"], { }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(_locale__WEBPACK_IMPORTED_MODULE_22__["I18n"], {
path: "actions.edit", path: "actions.edit",
"data-qa-node": "I18n", "data-qa-node": "I18n",
"data-qa-file": "Playlist" "data-qa-file": "Playlist"
})), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(_components_ContextMenuTrigger__WEBPACK_IMPORTED_MODULE_14__["default"], { })), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(_components_Fields_PinButton__WEBPACK_IMPORTED_MODULE_7__["default"], {
uri: uri,
"data-qa-node": "PinButton",
"data-qa-file": "Playlist"
}), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(_components_ContextMenuTrigger__WEBPACK_IMPORTED_MODULE_13__["default"], {
onTrigger: _this.handleContextMenu, onTrigger: _this.handleContextMenu,
"data-qa-node": "ContextMenuTrigger", "data-qa-node": "ContextMenuTrigger",
"data-qa-file": "Playlist" "data-qa-file": "Playlist"
@ -116326,16 +116523,20 @@ var Playlist = /*#__PURE__*/function (_React$Component) {
onClick: _this.play, onClick: _this.play,
"data-qa-node": "button", "data-qa-node": "button",
"data-qa-file": "Playlist" "data-qa-file": "Playlist"
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(_locale__WEBPACK_IMPORTED_MODULE_23__["I18n"], { }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(_locale__WEBPACK_IMPORTED_MODULE_22__["I18n"], {
path: "actions.play", path: "actions.play",
"data-qa-node": "I18n", "data-qa-node": "I18n",
"data-qa-file": "Playlist" "data-qa-file": "Playlist"
})), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(_components_Fields_FollowButton__WEBPACK_IMPORTED_MODULE_12__["default"], { })), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(_components_Fields_FollowButton__WEBPACK_IMPORTED_MODULE_11__["default"], {
uri: uri, uri: uri,
is_following: _this.inLibrary(), is_following: _this.inLibrary(),
"data-qa-node": "FollowButton", "data-qa-node": "FollowButton",
"data-qa-file": "Playlist" "data-qa-file": "Playlist"
}), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(_components_ContextMenuTrigger__WEBPACK_IMPORTED_MODULE_14__["default"], { }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(_components_Fields_PinButton__WEBPACK_IMPORTED_MODULE_7__["default"], {
uri: uri,
"data-qa-node": "PinButton",
"data-qa-file": "Playlist"
}), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(_components_ContextMenuTrigger__WEBPACK_IMPORTED_MODULE_13__["default"], {
onTrigger: _this.handleContextMenu, onTrigger: _this.handleContextMenu,
"data-qa-node": "ContextMenuTrigger", "data-qa-node": "ContextMenuTrigger",
"data-qa-file": "Playlist" "data-qa-file": "Playlist"
@ -116351,11 +116552,15 @@ var Playlist = /*#__PURE__*/function (_React$Component) {
onClick: _this.play, onClick: _this.play,
"data-qa-node": "button", "data-qa-node": "button",
"data-qa-file": "Playlist" "data-qa-file": "Playlist"
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(_locale__WEBPACK_IMPORTED_MODULE_23__["I18n"], { }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(_locale__WEBPACK_IMPORTED_MODULE_22__["I18n"], {
path: "actions.play", path: "actions.play",
"data-qa-node": "I18n", "data-qa-node": "I18n",
"data-qa-file": "Playlist" "data-qa-file": "Playlist"
})), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(_components_ContextMenuTrigger__WEBPACK_IMPORTED_MODULE_14__["default"], { })), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(_components_Fields_PinButton__WEBPACK_IMPORTED_MODULE_7__["default"], {
uri: uri,
"data-qa-node": "PinButton",
"data-qa-file": "Playlist"
}), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(_components_ContextMenuTrigger__WEBPACK_IMPORTED_MODULE_13__["default"], {
onTrigger: _this.handleContextMenu, onTrigger: _this.handleContextMenu,
"data-qa-node": "ContextMenuTrigger", "data-qa-node": "ContextMenuTrigger",
"data-qa-file": "Playlist" "data-qa-file": "Playlist"
@ -116364,18 +116569,18 @@ var Playlist = /*#__PURE__*/function (_React$Component) {
}); });
_defineProperty(_assertThisInitialized(_this), "render", function () { _defineProperty(_assertThisInitialized(_this), "render", function () {
var _this$props8 = _this.props, var _this$props9 = _this.props,
uri = _this$props8.uri, uri = _this$props9.uri,
playlistProp = _this$props8.playlist, playlistProp = _this$props9.playlist,
load_queue = _this$props8.load_queue, load_queue = _this$props9.load_queue,
tracks = _this$props8.tracks, tracks = _this$props9.tracks,
users = _this$props8.users, users = _this$props9.users,
slim_mode = _this$props8.slim_mode; slim_mode = _this$props9.slim_mode;
var playlist_id = Object(_util_helpers__WEBPACK_IMPORTED_MODULE_21__["getFromUri"])('playlistid', uri); var playlist_id = Object(_util_helpers__WEBPACK_IMPORTED_MODULE_20__["getFromUri"])('playlistid', uri);
if (!playlistProp) { if (!playlistProp) {
if (Object(_util_helpers__WEBPACK_IMPORTED_MODULE_21__["isLoading"])(load_queue, ["spotify_playlists/".concat(playlist_id, "?")])) { if (Object(_util_helpers__WEBPACK_IMPORTED_MODULE_20__["isLoading"])(load_queue, ["spotify_playlists/".concat(playlist_id, "?")])) {
return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(_components_Loader__WEBPACK_IMPORTED_MODULE_13__["default"], { return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(_components_Loader__WEBPACK_IMPORTED_MODULE_12__["default"], {
body: true, body: true,
loading: true, loading: true,
"data-qa-node": "Loader", "data-qa-node": "Loader",
@ -116383,7 +116588,7 @@ var Playlist = /*#__PURE__*/function (_React$Component) {
}); });
} }
return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(_components_ErrorMessage__WEBPACK_IMPORTED_MODULE_4__["default"], { return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(_components_ErrorMessage__WEBPACK_IMPORTED_MODULE_3__["default"], {
type: "not-found", type: "not-found",
title: "Not found", title: "Not found",
"data-qa-node": "ErrorMessage", "data-qa-node": "ErrorMessage",
@ -116391,7 +116596,7 @@ var Playlist = /*#__PURE__*/function (_React$Component) {
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement("p", { }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement("p", {
"data-qa-node": "p", "data-qa-node": "p",
"data-qa-file": "Playlist" "data-qa-file": "Playlist"
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(_locale__WEBPACK_IMPORTED_MODULE_23__["I18n"], { }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(_locale__WEBPACK_IMPORTED_MODULE_22__["I18n"], {
path: "errors.uri_not_found", path: "errors.uri_not_found",
uri: uri, uri: uri,
"data-qa-node": "I18n", "data-qa-node": "I18n",
@ -116399,7 +116604,7 @@ var Playlist = /*#__PURE__*/function (_React$Component) {
}))); })));
} }
var playlist = Object(_util_format__WEBPACK_IMPORTED_MODULE_22__["collate"])(playlistProp, { var playlist = Object(_util_format__WEBPACK_IMPORTED_MODULE_21__["collate"])(playlistProp, {
tracks: tracks, tracks: tracks,
users: users users: users
}); });
@ -116418,7 +116623,7 @@ var Playlist = /*#__PURE__*/function (_React$Component) {
className: "thumbnail-wrapper", className: "thumbnail-wrapper",
"data-qa-node": "div", "data-qa-node": "div",
"data-qa-file": "Playlist" "data-qa-file": "Playlist"
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(_components_Thumbnail__WEBPACK_IMPORTED_MODULE_7__["default"], { }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(_components_Thumbnail__WEBPACK_IMPORTED_MODULE_6__["default"], {
size: "large", size: "large",
glow: true, glow: true,
canZoom: true, canZoom: true,
@ -116448,23 +116653,23 @@ var Playlist = /*#__PURE__*/function (_React$Component) {
className: "source", className: "source",
"data-qa-node": "li", "data-qa-node": "li",
"data-qa-file": "Playlist" "data-qa-file": "Playlist"
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(_components_Icon__WEBPACK_IMPORTED_MODULE_16__["default"], { }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(_components_Icon__WEBPACK_IMPORTED_MODULE_15__["default"], {
type: "fontawesome", type: "fontawesome",
name: Object(_util_helpers__WEBPACK_IMPORTED_MODULE_21__["sourceIcon"])(playlist.uri), name: Object(_util_helpers__WEBPACK_IMPORTED_MODULE_20__["sourceIcon"])(playlist.uri),
"data-qa-node": "Icon", "data-qa-node": "Icon",
"data-qa-file": "Playlist" "data-qa-file": "Playlist"
})), playlist.user_uri && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement("li", { })), playlist.user_uri && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement("li", {
"data-qa-node": "li", "data-qa-node": "li",
"data-qa-file": "Playlist" "data-qa-file": "Playlist"
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(_components_URILink__WEBPACK_IMPORTED_MODULE_15__["default"], { }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(_components_URILink__WEBPACK_IMPORTED_MODULE_14__["default"], {
type: "user", type: "user",
uri: playlist.user_uri, uri: playlist.user_uri,
"data-qa-node": "URILink", "data-qa-node": "URILink",
"data-qa-file": "Playlist" "data-qa-file": "Playlist"
}, playlist.user ? playlist.user.name : Object(_util_helpers__WEBPACK_IMPORTED_MODULE_21__["getFromUri"])('userid', playlist.user_uri))), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement("li", { }, playlist.user ? playlist.user.name : Object(_util_helpers__WEBPACK_IMPORTED_MODULE_20__["getFromUri"])('userid', playlist.user_uri))), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement("li", {
"data-qa-node": "li", "data-qa-node": "li",
"data-qa-file": "Playlist" "data-qa-file": "Playlist"
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(_locale__WEBPACK_IMPORTED_MODULE_23__["I18n"], { }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(_locale__WEBPACK_IMPORTED_MODULE_22__["I18n"], {
path: "specs.tracks", path: "specs.tracks",
count: playlist.tracks_total || 0, count: playlist.tracks_total || 0,
"data-qa-node": "I18n", "data-qa-node": "I18n",
@ -116472,7 +116677,7 @@ var Playlist = /*#__PURE__*/function (_React$Component) {
})), !slim_mode && playlist.tracks && playlist.tracks_total > 0 && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement("li", { })), !slim_mode && playlist.tracks && playlist.tracks_total > 0 && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement("li", {
"data-qa-node": "li", "data-qa-node": "li",
"data-qa-file": "Playlist" "data-qa-file": "Playlist"
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(_components_Dater__WEBPACK_IMPORTED_MODULE_10__["Dater"], { }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(_components_Dater__WEBPACK_IMPORTED_MODULE_9__["Dater"], {
type: "total-time", type: "total-time",
data: playlist.tracks, data: playlist.tracks,
"data-qa-node": "Dater", "data-qa-node": "Dater",
@ -116480,24 +116685,24 @@ var Playlist = /*#__PURE__*/function (_React$Component) {
})), !slim_mode && playlist.followers !== undefined && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement("li", { })), !slim_mode && playlist.followers !== undefined && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement("li", {
"data-qa-node": "li", "data-qa-node": "li",
"data-qa-file": "Playlist" "data-qa-file": "Playlist"
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(_locale__WEBPACK_IMPORTED_MODULE_23__["I18n"], { }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(_locale__WEBPACK_IMPORTED_MODULE_22__["I18n"], {
path: "specs.followers", path: "specs.followers",
count: Object(_components_NiceNumber__WEBPACK_IMPORTED_MODULE_9__["nice_number"])(playlist.followers), count: Object(_components_NiceNumber__WEBPACK_IMPORTED_MODULE_8__["nice_number"])(playlist.followers),
"data-qa-node": "I18n", "data-qa-node": "I18n",
"data-qa-file": "Playlist" "data-qa-file": "Playlist"
})), !slim_mode && playlist.last_modified_date && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement("li", { })), !slim_mode && playlist.last_modified_date && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement("li", {
"data-qa-node": "li", "data-qa-node": "li",
"data-qa-file": "Playlist" "data-qa-file": "Playlist"
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(_locale__WEBPACK_IMPORTED_MODULE_23__["I18n"], { }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(_locale__WEBPACK_IMPORTED_MODULE_22__["I18n"], {
path: "specs.edited", path: "specs.edited",
date: Object(_components_Dater__WEBPACK_IMPORTED_MODULE_10__["dater"])('ago', playlist.last_modified_date), date: Object(_components_Dater__WEBPACK_IMPORTED_MODULE_9__["dater"])('ago', playlist.last_modified_date),
"data-qa-node": "I18n", "data-qa-node": "I18n",
"data-qa-file": "Playlist" "data-qa-file": "Playlist"
})))), _this.renderActions(), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement("section", { })))), _this.renderActions(), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement("section", {
className: "list-wrapper", className: "list-wrapper",
"data-qa-node": "section", "data-qa-node": "section",
"data-qa-file": "Playlist" "data-qa-file": "Playlist"
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(_components_TrackList__WEBPACK_IMPORTED_MODULE_6__["default"], { }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(_components_TrackList__WEBPACK_IMPORTED_MODULE_5__["default"], {
uri: playlist.uri, uri: playlist.uri,
className: "playlist-track-list", className: "playlist-track-list",
track_context: context, track_context: context,
@ -116506,7 +116711,7 @@ var Playlist = /*#__PURE__*/function (_React$Component) {
reorderTracks: _this.reorderTracks, reorderTracks: _this.reorderTracks,
"data-qa-node": "TrackList", "data-qa-node": "TrackList",
"data-qa-file": "Playlist" "data-qa-file": "Playlist"
}), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(_components_LazyLoadListener__WEBPACK_IMPORTED_MODULE_11__["default"], { }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(_components_LazyLoadListener__WEBPACK_IMPORTED_MODULE_10__["default"], {
loadKey: playlist.tracks_more, loadKey: playlist.tracks_more,
showLoader: is_loading_tracks || playlist.tracks_more, showLoader: is_loading_tracks || playlist.tracks_more,
loadMore: _this.loadMore, loadMore: _this.loadMore,
@ -116529,9 +116734,9 @@ var Playlist = /*#__PURE__*/function (_React$Component) {
_createClass(Playlist, [{ _createClass(Playlist, [{
key: "componentDidMount", key: "componentDidMount",
value: function componentDidMount() { value: function componentDidMount() {
var _this$props9 = this.props, var _this$props10 = this.props,
loadPlaylist = _this$props9.coreActions.loadPlaylist, loadPlaylist = _this$props10.coreActions.loadPlaylist,
uri = _this$props9.uri; uri = _this$props10.uri;
this.setWindowTitle(); this.setWindowTitle();
loadPlaylist(uri); loadPlaylist(uri);
} }
@ -116562,7 +116767,7 @@ var mapStateToProps = function mapStateToProps(state, ownProps) {
_state$mopidy = _state$mopidy === void 0 ? {} : _state$mopidy; _state$mopidy = _state$mopidy === void 0 ? {} : _state$mopidy;
var mopidy_connected = _state$mopidy.connected, var mopidy_connected = _state$mopidy.connected,
local_library_playlists = _state$mopidy.library_playlists; local_library_playlists = _state$mopidy.library_playlists;
var uri = Object(_util_helpers__WEBPACK_IMPORTED_MODULE_21__["decodeMopidyUri"])(ownProps.match.params.uri); var uri = Object(_util_helpers__WEBPACK_IMPORTED_MODULE_20__["decodeMopidyUri"])(ownProps.match.params.uri);
return { return {
uri: uri, uri: uri,
allow_reporting: allow_reporting, allow_reporting: allow_reporting,
@ -116582,10 +116787,10 @@ var mapStateToProps = function mapStateToProps(state, ownProps) {
var mapDispatchToProps = function mapDispatchToProps(dispatch) { var mapDispatchToProps = function mapDispatchToProps(dispatch) {
return { return {
coreActions: Object(redux__WEBPACK_IMPORTED_MODULE_2__["bindActionCreators"])(_services_core_actions__WEBPACK_IMPORTED_MODULE_17__, dispatch), coreActions: Object(redux__WEBPACK_IMPORTED_MODULE_2__["bindActionCreators"])(_services_core_actions__WEBPACK_IMPORTED_MODULE_16__, dispatch),
uiActions: Object(redux__WEBPACK_IMPORTED_MODULE_2__["bindActionCreators"])(_services_ui_actions__WEBPACK_IMPORTED_MODULE_18__, dispatch), uiActions: Object(redux__WEBPACK_IMPORTED_MODULE_2__["bindActionCreators"])(_services_ui_actions__WEBPACK_IMPORTED_MODULE_17__, dispatch),
mopidyActions: Object(redux__WEBPACK_IMPORTED_MODULE_2__["bindActionCreators"])(_services_mopidy_actions__WEBPACK_IMPORTED_MODULE_19__, dispatch), mopidyActions: Object(redux__WEBPACK_IMPORTED_MODULE_2__["bindActionCreators"])(_services_mopidy_actions__WEBPACK_IMPORTED_MODULE_18__, dispatch),
spotifyActions: Object(redux__WEBPACK_IMPORTED_MODULE_2__["bindActionCreators"])(_services_spotify_actions__WEBPACK_IMPORTED_MODULE_20__, dispatch) spotifyActions: Object(redux__WEBPACK_IMPORTED_MODULE_2__["bindActionCreators"])(_services_spotify_actions__WEBPACK_IMPORTED_MODULE_19__, dispatch)
}; };
}; };

File diff suppressed because one or more lines are too long

View File

@ -106,7 +106,7 @@
// Release details // Release details
// These are automatically injected to built HTML // These are automatically injected to built HTML
var build = "1596704531"; var build = "1596880866";
var version = "3.51.0"; var version = "3.51.0";
// Construct the script tag // Construct the script tag

View File

@ -0,0 +1,70 @@
import React from 'react';
import { connect } from 'react-redux';
import { bindActionCreators } from 'redux';
import * as coreActions from '../../services/core/actions';
import Icon from '../Icon';
class PinButton extends React.Component {
remove = () => {
const {
coreActions: {
removePinned,
},
uri,
} = this.props;
removePinned(uri);
}
add = () => {
const {
coreActions: {
addPinned,
},
uri,
} = this.props;
addPinned(uri);
}
render = () => {
const {
uri,
isPinned,
} = this.props;
let { className = '' } = this.props;
if (!uri) return null;
className += ' button button--discrete';
if (isPinned) {
return (
<button
type="button"
className={`${className} button--destructive`}
onClick={this.remove}
>
<Icon name="bookmark" />
</button>
);
}
return (
<button
type="button"
className={`${className} button--default`}
onClick={this.add}
>
<Icon name="bookmark_border" />
</button>
);
}
}
const mapStateToProps = (state, { uri }) => ({
isPinned: state.core.pinned ? state.core.pinned.find((item) => item === uri) : false,
});
const mapDispatchToProps = (dispatch) => ({
coreActions: bindActionCreators(coreActions, dispatch),
});
export default connect(mapStateToProps, mapDispatchToProps)(PinButton);

View File

@ -424,3 +424,24 @@ export function getLibraryArtists() {
type: 'GET_LIBRARY_ARTISTS', type: 'GET_LIBRARY_ARTISTS',
}; };
} }
export function addPinned(uri) {
return {
type: 'ADD_PINNED',
uri,
};
}
export function removePinned(uri) {
return {
type: 'REMOVE_PINNED',
uri,
};
}
export function updatePinned(pinned) {
return {
type: 'UPDATE_PINNED',
pinned,
};
}

View File

@ -807,6 +807,21 @@ const CoreMiddleware = (function () {
next(action); next(action);
break; break;
case 'ADD_PINNED':
store.dispatch(coreActions.updatePinned([
...store.getState().core.pinned,
action.uri,
]));
next(action);
break;
case 'REMOVE_PINNED':
store.dispatch(coreActions.updatePinned(
store.getState().core.pinned.filter((item) => item !== action.uri),
));
next(action);
break;
// This action is irrelevant to us, pass it on to the next middleware // This action is irrelevant to us, pass it on to the next middleware
default: default:
return next(action); return next(action);

View File

@ -294,6 +294,11 @@ export default function reducer(core = {}, action) {
}, },
}; };
case 'UPDATE_PINNED':
return {
...core,
pinned: action.pinned,
};
default: default:
return core; return core;

View File

@ -221,6 +221,13 @@ const localstorageMiddleware = (function () {
); );
break; break;
case 'UPDATE_PINNED':
storage.set(
'core',
{ pinned: action.pinned },
);
break;
case 'UI_SET': case 'UI_SET':
storage.set( storage.set(
'ui', 'ui',

View File

@ -33,6 +33,7 @@ let state = {
queue: [], queue: [],
queue_metadata: {}, queue_metadata: {},
current_track: null, current_track: null,
pinned: [],
albums: {}, albums: {},
artists: {}, artists: {},
playlists: {}, playlists: {},

View File

@ -2,13 +2,12 @@
import React from 'react'; import React from 'react';
import { connect } from 'react-redux'; import { connect } from 'react-redux';
import { bindActionCreators } from 'redux'; import { bindActionCreators } from 'redux';
import ReactGA from 'react-ga';
import ErrorMessage from '../components/ErrorMessage'; import ErrorMessage from '../components/ErrorMessage';
import Link from '../components/Link'; import Link from '../components/Link';
import TrackList from '../components/TrackList'; import TrackList from '../components/TrackList';
import Thumbnail from '../components/Thumbnail'; import Thumbnail from '../components/Thumbnail';
import Parallax from '../components/Parallax'; import PinButton from '../components/Fields/PinButton';
import NiceNumber, { nice_number } from '../components/NiceNumber'; import { nice_number } from '../components/NiceNumber';
import { Dater, dater } from '../components/Dater'; import { Dater, dater } from '../components/Dater';
import LazyLoadListener from '../components/LazyLoadListener'; import LazyLoadListener from '../components/LazyLoadListener';
import FollowButton from '../components/Fields/FollowButton'; import FollowButton from '../components/Fields/FollowButton';
@ -183,6 +182,22 @@ class Playlist extends React.Component {
return library.indexOf(uri) > -1; return library.indexOf(uri) > -1;
} }
togglePinned = () => {
const {
uri,
coreActions: {
addPinned,
removePinned,
},
} = this.props;
if (this.isPinned()) {
removePinned(uri);
} else {
addPinned(uri);
}
}
renderActions = () => { renderActions = () => {
const { const {
uri, uri,
@ -204,6 +219,7 @@ class Playlist extends React.Component {
> >
<I18n path="actions.edit" /> <I18n path="actions.edit" />
</Link> </Link>
<PinButton uri={uri} />
<ContextMenuTrigger onTrigger={this.handleContextMenu} /> <ContextMenuTrigger onTrigger={this.handleContextMenu} />
</div> </div>
); );
@ -221,6 +237,7 @@ class Playlist extends React.Component {
> >
<I18n path="actions.edit" /> <I18n path="actions.edit" />
</Link> </Link>
<PinButton uri={uri} />
<ContextMenuTrigger onTrigger={this.handleContextMenu} /> <ContextMenuTrigger onTrigger={this.handleContextMenu} />
</div> </div>
); );
@ -234,6 +251,7 @@ class Playlist extends React.Component {
uri={uri} uri={uri}
is_following={this.inLibrary()} is_following={this.inLibrary()}
/> />
<PinButton uri={uri} />
<ContextMenuTrigger onTrigger={this.handleContextMenu} /> <ContextMenuTrigger onTrigger={this.handleContextMenu} />
</div> </div>
); );
@ -247,6 +265,7 @@ class Playlist extends React.Component {
> >
<I18n path="actions.play" /> <I18n path="actions.play" />
</button> </button>
<PinButton uri={uri} />
<ContextMenuTrigger onTrigger={this.handleContextMenu} /> <ContextMenuTrigger onTrigger={this.handleContextMenu} />
</div> </div>
); );