Add <- and -> hotkeys, to jump to previous or next song

Refers to #585
This commit is contained in:
Deluan
2020-11-05 17:38:53 -05:00
parent 873cea4046
commit 9224a67a7b
3 changed files with 66 additions and 44 deletions
+5 -7
View File
@@ -13562,14 +13562,12 @@
"resolved": "https://registry.npmjs.org/react-ga/-/react-ga-3.1.2.tgz", "resolved": "https://registry.npmjs.org/react-ga/-/react-ga-3.1.2.tgz",
"integrity": "sha512-OJrMqaHEHbodm+XsnjA6ISBEHTwvpFrxco65mctzl/v3CASMSLSyUkFqz9yYrPDKGBUfNQzKCjuMJwctjlWBbw==" "integrity": "sha512-OJrMqaHEHbodm+XsnjA6ISBEHTwvpFrxco65mctzl/v3CASMSLSyUkFqz9yYrPDKGBUfNQzKCjuMJwctjlWBbw=="
}, },
"react-hot-keys": { "react-hotkeys-hook": {
"version": "2.6.0", "version": "2.4.0",
"resolved": "https://registry.npmjs.org/react-hot-keys/-/react-hot-keys-2.6.0.tgz", "resolved": "https://registry.npmjs.org/react-hotkeys-hook/-/react-hotkeys-hook-2.4.0.tgz",
"integrity": "sha512-q7UKLGxZyWhIeyNp4TIp5ardcIF5lPeS8Lmh5gTKH+4IOQDrfMkyvAoz1XFYKR2UDc4GW9sEDrzVrqVZu/HrAw==", "integrity": "sha512-Veh9FUe+iXab+lZ5shPoyGDnFBu5codQ15omOXiOvCC/Q5QfTY1lefLVx/Zi2NnYBSXfkfQbhnpE+Rnhi2+wBw==",
"requires": { "requires": {
"@babel/runtime": "^7.8.4", "hotkeys-js": "3.8.1"
"hotkeys-js": "^3.8.1",
"prop-types": "^15.7.2"
} }
}, },
"react-icons": { "react-icons": {
+1 -1
View File
@@ -17,7 +17,7 @@
"react-dom": "^16.13.1", "react-dom": "^16.13.1",
"react-drag-listview": "^0.1.7", "react-drag-listview": "^0.1.7",
"react-ga": "^3.1.2", "react-ga": "^3.1.2",
"react-hot-keys": "^2.6.0", "react-hotkeys-hook": "^2.4.0",
"react-icons": "^3.11.0", "react-icons": "^3.11.0",
"react-image-lightbox": "^5.1.1", "react-image-lightbox": "^5.1.1",
"react-jinke-music-player": "^4.19.0", "react-jinke-music-player": "^4.19.0",
+60 -36
View File
@@ -5,7 +5,6 @@ import { Link } from 'react-router-dom'
import { useAuthState, useDataProvider, useTranslate } from 'react-admin' import { useAuthState, useDataProvider, useTranslate } from 'react-admin'
import ReactJkMusicPlayer from 'react-jinke-music-player' import ReactJkMusicPlayer from 'react-jinke-music-player'
import 'react-jinke-music-player/assets/index.css' import 'react-jinke-music-player/assets/index.css'
import Hotkeys from 'react-hot-keys'
import { makeStyles } from '@material-ui/core/styles' import { makeStyles } from '@material-ui/core/styles'
import subsonic from '../subsonic' import subsonic from '../subsonic'
import { import {
@@ -18,6 +17,7 @@ import {
import themes from '../themes' import themes from '../themes'
import config from '../config' import config from '../config'
import PlayerToolbar from './PlayerToolbar' import PlayerToolbar from './PlayerToolbar'
import { useHotkeys } from 'react-hotkeys-hook'
const useStyle = makeStyles((theme) => ({ const useStyle = makeStyles((theme) => ({
audioTitle: { audioTitle: {
@@ -52,11 +52,55 @@ const Player = () => {
const dataProvider = useDataProvider() const dataProvider = useDataProvider()
const dispatch = useDispatch() const dispatch = useDispatch()
const queue = useSelector((state) => state.queue) const queue = useSelector((state) => state.queue)
const current = queue.current || {}
const { authenticated } = useAuthState() const { authenticated } = useAuthState()
const visible = authenticated && queue.queue.length > 0 const visible = authenticated && queue.queue.length > 0
const classes = useStyle({ visible }) const classes = useStyle({ visible })
const nextSong = () => {
const idx = queue.queue.findIndex(
(item) => item.uuid === queue.current.uuid
)
return idx !== null ? queue.queue[idx + 1] : null
}
const prevSong = () => {
const idx = queue.queue.findIndex(
(item) => item.uuid === queue.current.uuid
)
return idx !== null ? queue.queue[idx - 1] : null
}
useHotkeys('space', (e) => {
e.preventDefault()
audioInstance && audioInstance.togglePlay()
})
useHotkeys(
'left',
(e) => {
if (prevSong()) {
e.preventDefault()
audioInstance && audioInstance.playPrev()
}
},
{},
[queue]
)
useHotkeys(
'right',
(e) => {
if (nextSong()) {
e.preventDefault()
audioInstance && audioInstance.playNext()
}
},
{},
[queue]
)
const defaultOptions = { const defaultOptions = {
theme: playerTheme, theme: playerTheme,
bounds: 'body', bounds: 'body',
@@ -108,7 +152,6 @@ const Player = () => {
}, },
} }
const current = queue.current || {}
const options = useMemo(() => { const options = useMemo(() => {
return { return {
...defaultOptions, ...defaultOptions,
@@ -206,45 +249,26 @@ const Player = () => {
}) })
}, [dispatch]) }, [dispatch])
const onKeyUp = useCallback((keyName, e) => {
if (keyName === 'space') {
e.preventDefault()
}
}, [])
const onKeyDown = useCallback((keyName, e) => {
if (keyName === 'space') {
e.preventDefault()
audioInstance && audioInstance.togglePlay()
}
}, [])
if (!visible) { if (!visible) {
document.title = 'Navidrome' document.title = 'Navidrome'
} }
return ( return (
<Hotkeys <ReactJkMusicPlayer
keyName="space" {...options}
onKeyDown={onKeyDown} quietUpdate
onKeyUp={onKeyUp} className={classes.player}
allowRepeat={false} onAudioListsChange={OnAudioListsChange}
> onAudioProgress={OnAudioProgress}
<ReactJkMusicPlayer onAudioPlay={OnAudioPlay}
{...options} onAudioPause={onAudioPause}
quietUpdate onAudioEnded={onAudioEnded}
className={classes.player} onAudioVolumeChange={onAudioVolumeChange}
onAudioListsChange={OnAudioListsChange} onBeforeDestroy={onBeforeDestroy}
onAudioProgress={OnAudioProgress} getAudioInstance={(instance) => {
onAudioPlay={OnAudioPlay} audioInstance = instance
onAudioPause={onAudioPause} }}
onAudioEnded={onAudioEnded} />
onAudioVolumeChange={onAudioVolumeChange}
onBeforeDestroy={onBeforeDestroy}
getAudioInstance={(instance) => {
audioInstance = instance
}}
/>
</Hotkeys>
) )
} }