diff --git a/changes/changelog.d/146.feature b/changes/changelog.d/146.feature
new file mode 100644
index 000000000..2a7617644
--- /dev/null
+++ b/changes/changelog.d/146.feature
@@ -0,0 +1 @@
+Previous Track button restart playback after 3 seconds (#146)
diff --git a/front/src/components/audio/Player.vue b/front/src/components/audio/Player.vue
index 75a01c52e..31f6dc35a 100644
--- a/front/src/components/audio/Player.vue
+++ b/front/src/components/audio/Player.vue
@@ -59,8 +59,8 @@
-
+ :disabled="emptyQueue">
+
{
return state.currentIndex < state.tracks.length - 1
},
- hasPrevious: state => {
- return state.currentIndex > 0
- }
+ isEmpty: state => state.tracks.length === 0
},
actions: {
append ({commit, state, dispatch}, {track, index, skipPlay}) {
@@ -103,9 +101,11 @@ export default {
dispatch('next')
}
},
- previous ({state, dispatch}) {
- if (state.currentIndex > 0) {
+ previous ({state, dispatch, rootState}) {
+ if (state.currentIndex > 0 && rootState.player.currentTime < 3) {
dispatch('currentIndex', state.currentIndex - 1)
+ } else {
+ dispatch('currentIndex', state.currentIndex)
}
},
next ({state, dispatch, commit, rootState}) {
diff --git a/front/test/unit/specs/store/queue.spec.js b/front/test/unit/specs/store/queue.spec.js
index b445229ec..2bc5cde4e 100644
--- a/front/test/unit/specs/store/queue.spec.js
+++ b/front/test/unit/specs/store/queue.spec.js
@@ -81,14 +81,6 @@ describe('store/queue', () => {
const state = { tracks: [1, 2, 3], currentIndex: 2 }
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', () => {
it('append at end', (done) => {
@@ -212,22 +204,33 @@ describe('store/queue', () => {
expectedActions: []
}, done)
})
- it('previous when at beginning does nothing', (done) => {
+ it('previous when at beginning', (done) => {
testAction({
action: store.actions.previous,
params: {state: {currentIndex: 0}},
- expectedActions: []
- }, done)
- })
- it('previous', (done) => {
- testAction({
- action: store.actions.previous,
- params: {state: {currentIndex: 1}},
expectedActions: [
{ type: 'currentIndex', payload: 0 }
]
}, 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) => {
testAction({
action: store.actions.next,