diff --git a/src/js/components/Fields/Dropzone.js b/src/js/components/Fields/Dropzone.js index 4d08193b..1d09bf62 100755 --- a/src/js/components/Fields/Dropzone.js +++ b/src/js/components/Fields/Dropzone.js @@ -43,7 +43,7 @@ export default class Dropzone extends React.Component { return (
handleMouseUp(data)} > { data.title } diff --git a/src/js/components/Fields/Dropzones.js b/src/js/components/Fields/Dropzones.js index 277212c8..36117cfe 100755 --- a/src/js/components/Fields/Dropzones.js +++ b/src/js/components/Fields/Dropzones.js @@ -1,106 +1,81 @@ import React from 'react'; -import { connect } from 'react-redux'; -import { bindActionCreators } from 'redux'; -import { withRouter } from 'react-router'; - +import { useDispatch, useSelector } from 'react-redux'; +import { useHistory } from 'react-router-dom'; import Dropzone from './Dropzone'; - import * as uiActions from '../../services/ui/actions'; import * as mopidyActions from '../../services/mopidy/actions'; -import * as spotifyActions from '../../services/spotify/actions'; import { arrayOf } from '../../util/arrays'; import { i18n } from '../../locale'; import { encodeUri } from '../../util/format'; -class Dropzones extends React.Component { - constructor(props) { - super(props); +const Dropzones = () => { + const dispatch = useDispatch(); + const history = useHistory(); + const { + victims, + from_uri, + active, + } = useSelector((state) => state.ui.dragger || {}); + const zones = [ + { + title: i18n('actions.add_to_queue'), + icon: 'play_arrow', + action: 'enqueue', + }, + { + title: i18n('actions.play_next'), + icon: 'play_arrow', + action: 'enqueue_next', + }, + { + title: i18n('actions.add_to_playlist'), + icon: 'playlist_add', + action: 'add_to_playlist', + accepts: ['tltrack', 'track', 'album', 'playlist', 'artist'], + }, + { + title: i18n('modal.edit_playlist.create_playlist'), + icon: 'playlist_add', + action: 'create_playlist_and_add', + accepts: ['tltrack', 'track', 'album', 'playlist', 'artist'], + }, + ]; - this._zones = [ - { - title: i18n('actions.add_to_queue'), - icon: 'play_arrow', - action: 'enqueue', - }, - { - title: i18n('actions.play_next'), - icon: 'play_arrow', - action: 'enqueue_next', - }, - { - title: i18n('actions.add_to_playlist'), - icon: 'playlist_add', - action: 'add_to_playlist', - accepts: ['tltrack', 'track', 'album', 'playlist', 'artist'], - }, - ]; - } + if (!active) return null; - handleMouseMove = (e) => { - const { dragger = {}, uiActions: { dragMove } } = this.props; - if (!dragger || !dragger.active) return null; - return dragMove(e); - } - - handleMouseUp = (zone) => { - const { - dragger: { - victims = [], - from_uri, - }, - mopidyActions: { - enqueueURIs, - }, - history, - } = this.props; + const handleMouseUp = (zone) => { const uris = arrayOf('uri', victims); - switch (zone.action) { case 'enqueue': - enqueueURIs(uris, from_uri); + dispatch(mopidyActions.enqueueURIs(uris, from_uri)); break; case 'enqueue_next': - enqueueURIs(uris, from_uri, true); + dispatch(mopidyActions.enqueueURIs(uris, from_uri, true)); break; case 'add_to_playlist': history.push(`/add-to-playlist/${encodeUri(uris.join(','))}`); - // uris + break; + case 'create_playlist_and_add': + history.push(`/playlist/create/${encodeUri(uris.join(','))}`); break; default: break; } - } + }; - render = () => { - const { - dragger = {}, - } = this.props; - if (!dragger || !dragger.active) return null; + return ( +
+ { + zones.map((zone) => ( + + )) + } +
+ ); +}; - return ( -
- { - this._zones.map((zone) => ( - this.handleMouseUp(zone)} - /> - )) - } -
- ); - } -} - -const mapStateToProps = (state) => ({ - dragger: state.ui.dragger, -}); - -const mapDispatchToProps = (dispatch) => ({ - uiActions: bindActionCreators(uiActions, dispatch), - spotifyActions: bindActionCreators(spotifyActions, dispatch), - mopidyActions: bindActionCreators(mopidyActions, dispatch), -}); - -export default withRouter(connect(mapStateToProps, mapDispatchToProps)(Dropzones)); +export default Dropzones; diff --git a/src/js/locale/en.yaml b/src/js/locale/en.yaml index e5ef04d4..1e1c3275 100755 --- a/src/js/locale/en.yaml +++ b/src/js/locale/en.yaml @@ -27,6 +27,7 @@ actions: stop: Stop add_to_playlist: Add to playlist add_to_library: Add to library + create_playlist_and_add: New playlist added_tracks_to: 'Added %{count} tracks to ' remove_from_library: Remove from library add_to_queue: Add to queue diff --git a/src/js/views/modals/KioskMode.js b/src/js/views/modals/KioskMode.js index 7aed4de7..74ab23ab 100755 --- a/src/js/views/modals/KioskMode.js +++ b/src/js/views/modals/KioskMode.js @@ -1,6 +1,5 @@ -import React, { useState, useEffect } from 'react'; +import React, { useEffect } from 'react'; import { useSelector, useDispatch } from 'react-redux'; -import Link from '../../components/Link'; import Modal from './Modal'; import Thumbnail from '../../components/Thumbnail'; import LinksSentence from '../../components/LinksSentence'; @@ -12,7 +11,7 @@ import * as mopidyActions from '../../services/mopidy/actions'; import * as geniusActions from '../../services/genius/actions'; import { isLoading } from '../../util/helpers'; import { i18n, I18n } from '../../locale'; -import { makeItemSelector } from '../../util/selectors'; +import { makeItemSelector, makeLoadingSelector } from '../../util/selectors'; const LyricsScroller = ({ content = '', @@ -33,17 +32,17 @@ const LyricsScroller = ({ const Lyrics = ({ show_lyrics, - load_queue, time_position = null, current_track, }) => { if (!show_lyrics) { return null; } - + const loadingSelector = makeLoadingSelector(['genius_(.*)']); + const loading = useSelector(loadingSelector); const { lyrics, duration } = current_track || {}; - if (isLoading(load_queue, ['genius_'])) { + if (loading) { return (
@@ -225,6 +224,6 @@ const KioskMode = () => { /> ); -} +}; export default KioskMode;