Доброго времени суток уважаемые разработчики в компоненте Control.js addEventListener отрабатывает с событием ended несколько раз и перескакивает через несколько треков( Только почему по клику всё нормально отрабатывает
player.addEventListener('ended', () => dispatch(nextAudio()));
Использовал redux toolkit
Компоненты не зависимы друг от друга берут из stora, а не из параметров функции
stackblitz react player
Ну и в Reducerе баг из того что логика в playAudio зашла в тупик initialState id = 1 и срабатывает Reducer pauseAudio state.track.id == action.payload при первом запуске если не нажат не один элемент
//slices/playlistSlice.js
import { createSlice } from '@reduxjs/toolkit';
import TrackService from './../services/TrackService.js';
const initialState = {
id: 1,
trackService: new TrackService(),
tracks: new TrackService().findAll(),
track: new TrackService().findOne(0),
flag: false,
audio: new Audio(),
};
const playlistSlice = createSlice({
name: 'playlist',
initialState,
reducers: {
playAudio: (state, action) => {
console.log(state.id, state.track.id, action.payload);
if (state.track.id !== action.payload) {
state.flag = true;
state.id = action.payload;
state.track = state.trackService.findOne(state.id - 1);
state.audio.src = state.track.audioPath;
state.audio.play();
console.log('playAudio');
} else {
playlistSlice.caseReducers.pauseAudio(state);
}
},
pauseAudio: (state) => {
if (state.flag) {
state.flag = false;
state.audio.pause();
console.log('pauseAudio');
} else {
state.flag = true;
state.audio.play();
console.log('playAudio pause');
}
},
nextAudio: (state) => {
state.id++;
if (state.id > state.tracks.length) {
state.id = 1;
}
playlistSlice.caseReducers.playAudio(state, { payload: state.id });
console.log('nextAudio');
},
prevAudio: (state) => {
state.id--;
if (state.id < 1) {
state.id = state.tracks.length;
}
playlistSlice.caseReducers.playAudio(state, { payload: state.id });
console.log('prevAudio');
},
},
});
export const { playAudio, pauseAudio, nextAudio, prevAudio } =
playlistSlice.actions;
export default playlistSlice.reducer;