export default class AudioPlayer { files = {} players = {} load(graph) { this.files = graph.uploads .filter(upload => upload.tag === 'audio') .reduce((accumulator, item) => { accumulator[item.id] = item return accumulator }, {}) console.log(this.files) } playPage(page) { console.log(page.settings) const { background_audio_id, restart_audio } = page.settings if (background_audio_id in this.files) { this.playFile({ item: this.files[background_audio_id], restart: !!restart_audio, }) } } playFile({ item, restart, loop }) { return new Promise((resolve, reject) => { const { id, url } = item console.log('play >>', id, url) if (id in this.players) { if (restart) { this.players[id].currentTime = 0 this.players[id].play() return resolve() } return reject() } const player = document.createElement('audio') const handleEnded = () => { unbind() resolve() } const handleError = (error) => { console.error(error) unbind() reject(error) } const bind = () => { player.addEventListener('ended', handleEnded) player.addEventListener('error', handleError) this.players[id] = player } const unbind = () => { player.removeEventListener('ended', handleEnded) player.removeEventListener('error', handleError) delete this.players[id] } const start = () => { player.src = url player.play() } bind() start() }) } }