diff options
author | Eugen Rochko <eugen@zeonfederated.com> | 2020-01-11 02:02:21 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2020-01-11 02:02:21 +0100 |
commit | baa3db3001b576a3d7b1ae5ca8b414416bd4567f (patch) | |
tree | da37d67e91d0bad17aafe132bbde4752082b6b05 /app/javascript/mastodon/features/audio/index.js | |
parent | d1f68fb5898b5720d410cf2e588bea5374129cf2 (diff) |
Change audio/video playback to stop playback when out of view (#12486)
Change video player to not loop, since the audio player doesn't Change playback and mute buttons to feel snappier
Diffstat (limited to 'app/javascript/mastodon/features/audio/index.js')
-rw-r--r-- | app/javascript/mastodon/features/audio/index.js | 35 |
1 files changed, 25 insertions, 10 deletions
diff --git a/app/javascript/mastodon/features/audio/index.js b/app/javascript/mastodon/features/audio/index.js index 1b4cdbb4f..fda5a074f 100644 --- a/app/javascript/mastodon/features/audio/index.js +++ b/app/javascript/mastodon/features/audio/index.js @@ -37,15 +37,14 @@ class Audio extends React.PureComponent { volume: 0.5, }; - // hard coded in components.scss - // any way to get ::before values programatically? - - volWidth = 50; - + // Hard coded in components.scss + // Any way to get ::before values programatically? + volWidth = 50; volOffset = 70; volHandleOffset = v => { const offset = v * this.volWidth + this.volOffset; + return (offset > 110) ? 110 : offset; } @@ -61,6 +60,8 @@ class Audio extends React.PureComponent { if (this.waveform) { this._updateWaveform(); } + + window.addEventListener('scroll', this.handleScroll); } componentDidUpdate (prevProps) { @@ -70,6 +71,8 @@ class Audio extends React.PureComponent { } componentWillUnmount () { + window.removeEventListener('scroll', this.handleScroll); + if (this.wavesurfer) { this.wavesurfer.destroy(); this.wavesurfer = null; @@ -128,16 +131,15 @@ class Audio extends React.PureComponent { this.loaded = true; } - this.wavesurfer.play(); - this.setState({ paused: false }); + this.setState({ paused: false }, () => this.wavesurfer.play()); } else { - this.wavesurfer.pause(); - this.setState({ paused: true }); + this.setState({ paused: true }, () => this.wavesurfer.pause()); } } toggleMute = () => { - this.wavesurfer.setMute(!this.state.muted); + const muted = !this.state.muted; + this.setState({ muted }, () => this.wavesurfer.setMute(muted)); } handleVolumeMouseDown = e => { @@ -176,6 +178,19 @@ class Audio extends React.PureComponent { } }, 60); + handleScroll = throttle(() => { + if (!this.waveform || !this.wavesurfer) { + return; + } + + const { top, height } = this.waveform.getBoundingClientRect(); + const inView = (top <= (window.innerHeight || document.documentElement.clientHeight)) && (top + height >= 0); + + if (!this.state.paused && !inView) { + this.setState({ paused: true }, () => this.wavesurfer.pause()); + } + }, 150, { trailing: true }) + render () { const { height, intl, alt, editable } = this.props; const { paused, muted, volume, currentTime } = this.state; |