Merge branch 'previous-button' into 'develop'

Reset player position before playing previous track

Closes #146

See merge request funkwhale/funkwhale!120
This commit is contained in:
Eliot Berriot 2018-04-01 18:15:25 +00:00
commit bfe8f454b4
5 changed files with 37 additions and 25 deletions

View File

@ -0,0 +1 @@
Previous Track button restart playback after 3 seconds (#146)

View File

@ -59,8 +59,8 @@
<div <div
title="Previous track" title="Previous track"
class="two wide column control" class="two wide column control"
:disabled="!hasPrevious"> :disabled="emptyQueue">
<i @click="previous" :class="['ui', {'disabled': !hasPrevious}, 'step', 'backward', 'big', 'icon']" ></i> <i @click="previous" :class="['ui', 'backward', {'disabled': emptyQueue}, 'big', 'icon']"></i>
</div> </div>
<div <div
v-if="!playing" v-if="!playing"
@ -205,7 +205,7 @@ export default {
...mapGetters({ ...mapGetters({
currentTrack: 'queue/currentTrack', currentTrack: 'queue/currentTrack',
hasNext: 'queue/hasNext', hasNext: 'queue/hasNext',
hasPrevious: 'queue/hasPrevious', emptyQueue: 'queue/isEmpty',
durationFormatted: 'player/durationFormatted', durationFormatted: 'player/durationFormatted',
currentTimeFormatted: 'player/currentTimeFormatted', currentTimeFormatted: 'player/currentTimeFormatted',
progress: 'player/progress' progress: 'player/progress'

View File

@ -31,7 +31,8 @@ export default {
}, },
data () { data () {
return { return {
sourceErrors: 0 sourceErrors: 0,
isUpdatingTime: false
} }
}, },
computed: { computed: {
@ -99,6 +100,7 @@ export default {
} }
}, },
updateProgress: _.throttle(function () { updateProgress: _.throttle(function () {
this.isUpdatingTime = true
if (this.$refs.audio) { if (this.$refs.audio) {
this.$store.dispatch('player/updateProgress', this.$refs.audio.currentTime) this.$store.dispatch('player/updateProgress', this.$refs.audio.currentTime)
} }
@ -130,6 +132,12 @@ export default {
}, },
volume: function (newValue) { volume: function (newValue) {
this.$refs.audio.volume = newValue this.$refs.audio.volume = newValue
},
currentTime (newValue) {
if (!this.isUpdatingTime) {
this.setCurrentTime(newValue)
}
this.isUpdatingTime = false
} }
} }
} }

View File

@ -49,9 +49,7 @@ export default {
hasNext: state => { hasNext: state => {
return state.currentIndex < state.tracks.length - 1 return state.currentIndex < state.tracks.length - 1
}, },
hasPrevious: state => { isEmpty: state => state.tracks.length === 0
return state.currentIndex > 0
}
}, },
actions: { actions: {
append ({commit, state, dispatch}, {track, index, skipPlay}) { append ({commit, state, dispatch}, {track, index, skipPlay}) {
@ -103,9 +101,11 @@ export default {
dispatch('next') dispatch('next')
} }
}, },
previous ({state, dispatch}) { previous ({state, dispatch, rootState}) {
if (state.currentIndex > 0) { if (state.currentIndex > 0 && rootState.player.currentTime < 3) {
dispatch('currentIndex', state.currentIndex - 1) dispatch('currentIndex', state.currentIndex - 1)
} else {
dispatch('currentIndex', state.currentIndex)
} }
}, },
next ({state, dispatch, commit, rootState}) { next ({state, dispatch, commit, rootState}) {

View File

@ -81,14 +81,6 @@ describe('store/queue', () => {
const state = { tracks: [1, 2, 3], currentIndex: 2 } const state = { tracks: [1, 2, 3], currentIndex: 2 }
expect(store.getters['hasNext'](state)).to.equal(false) expect(store.getters['hasNext'](state)).to.equal(false)
}) })
it('hasPrevious true', () => {
const state = { currentIndex: 1 }
expect(store.getters['hasPrevious'](state)).to.equal(true)
})
it('hasPrevious false', () => {
const state = { currentIndex: 0 }
expect(store.getters['hasPrevious'](state)).to.equal(false)
})
}) })
describe('actions', () => { describe('actions', () => {
it('append at end', (done) => { it('append at end', (done) => {
@ -212,22 +204,33 @@ describe('store/queue', () => {
expectedActions: [] expectedActions: []
}, done) }, done)
}) })
it('previous when at beginning does nothing', (done) => { it('previous when at beginning', (done) => {
testAction({ testAction({
action: store.actions.previous, action: store.actions.previous,
params: {state: {currentIndex: 0}}, params: {state: {currentIndex: 0}},
expectedActions: []
}, done)
})
it('previous', (done) => {
testAction({
action: store.actions.previous,
params: {state: {currentIndex: 1}},
expectedActions: [ expectedActions: [
{ type: 'currentIndex', payload: 0 } { type: 'currentIndex', payload: 0 }
] ]
}, done) }, done)
}) })
it('previous after less than 3 seconds of playback', (done) => {
testAction({
action: store.actions.previous,
params: {state: {currentIndex: 1}, rootState: {player: {currentTime: 1}}},
expectedActions: [
{ type: 'currentIndex', payload: 0 }
]
}, done)
})
it('previous after more than 3 seconds of playback', (done) => {
testAction({
action: store.actions.previous,
params: {state: {currentIndex: 1}, rootState: {player: {currentTime: 3}}},
expectedActions: [
{ type: 'currentIndex', payload: 1 }
]
}, done)
})
it('next on last track when looping on queue', (done) => { it('next on last track when looping on queue', (done) => {
testAction({ testAction({
action: store.actions.next, action: store.actions.next,