From d9fc65fe05f534691597586f25a2f168364ae1cf Mon Sep 17 00:00:00 2001 From: Jules Laplace Date: Wed, 17 Mar 2021 18:58:04 +0100 Subject: cancel playback if background audio id changes --- frontend/app/views/page/components/tile.handle.js | 35 ++----- frontend/site/audio/audio.player.js | 117 ++++++++++++++-------- frontend/site/viewer/viewer.container.js | 11 +- 3 files changed, 97 insertions(+), 66 deletions(-) (limited to 'frontend') diff --git a/frontend/app/views/page/components/tile.handle.js b/frontend/app/views/page/components/tile.handle.js index 090069d..d7b5d05 100644 --- a/frontend/app/views/page/components/tile.handle.js +++ b/frontend/app/views/page/components/tile.handle.js @@ -94,31 +94,16 @@ const TileHandle = ({ tile, bounds, box, viewing, onMouseDown, onDoubleClick }) content = "SCRIPT" } } - if (viewing && tile.href) { - if (tile.href.indexOf('http') === 0) { - return ( - -
- {content} -
-
- ) - } else { - return ( - -
- {content} -
- - ) - } + if (viewing) { + return ( +
+ {content} +
+ ) } else { return (
{ - 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 { id } = item + if (id in this.players) { + if (restart) { + this.players[id].restart() } - 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() - }) + return this.players[id] + } else { + this.players[id] = new Player(item, this.done) + this.players[id].play() + return this.players[id] + } + } +} + +class Player { + constructor(item, done) { + this.item = item + this.done = done + this.audio = document.createElement('audio') + this.handleEnded = this.handleEnded.bind(this) + this.handleError = this.handleError.bind(this) + this.release = this.release.bind(this) + this.audio.addEventListener('ended', this.handleEnded) + this.audio.addEventListener('error', this.handleError) + this.audio.src = item.url + } + + release() { + this.audio.removeEventListener('ended', this.handleEnded) + this.audio.removeEventListener('error', this.handleError) + this.done(this.item.id) + this.item = null + this.done = null + this.audio = null + } + + handleError(error) { + console.error(error) + this.release() + } + + handleEnded() { + this.release() + } + + play() { + console.log('play', this.item.id) + this.audio.play() + } + + restart() { + console.log('replay', this.item.id) + this.audio.currentTime = 0 + this.audio.play() + } + + stop() { + console.log('stop', this.item.id) + this.audio.pause() + this.release() } } diff --git a/frontend/site/viewer/viewer.container.js b/frontend/site/viewer/viewer.container.js index 71c6bba..314d243 100644 --- a/frontend/site/viewer/viewer.container.js +++ b/frontend/site/viewer/viewer.container.js @@ -3,6 +3,7 @@ import { Route } from 'react-router-dom' import { bindActionCreators } from 'redux' import { connect } from 'react-redux' +import { history } from 'site/store' import actions from 'site/actions' import { Loader } from 'app/common/loader.component' import TileHandle from 'app/views/page/components/tile.handle' @@ -61,11 +62,16 @@ class ViewerContainer extends Component { } handleMouseDown(e, tile) { - // console.log(tile) + console.log(tile) + if (tile.href.indexOf('http') === 0) { + window.location.href = tile.href + } else { + history.push(tile.href) + } } render() { - const { page } = this.state + const { page, audio } = this.state if (this.state.roadblock) { return this.renderRoadblock() } @@ -92,6 +98,7 @@ class ViewerContainer extends Component { viewing key={tile.id} tile={tile} + audio={audio} bounds={this.state.bounds} onMouseDown={e => this.handleMouseDown(e, tile)} onDoubleClick={e => {}} -- cgit v1.2.3-70-g09d2