|
|
|
@ -386,13 +386,59 @@ class Audio extends React.PureComponent { |
|
|
|
|
return this.props.foregroundColor || '#ffffff'; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
seekBy (time) { |
|
|
|
|
const currentTime = this.audio.currentTime + time; |
|
|
|
|
|
|
|
|
|
if (!isNaN(currentTime)) { |
|
|
|
|
this.setState({ currentTime }, () => { |
|
|
|
|
this.audio.currentTime = currentTime; |
|
|
|
|
}); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
handleAudioKeyDown = e => { |
|
|
|
|
// On the audio element or the seek bar, we can safely use the space bar
|
|
|
|
|
// for playback control because there are no buttons to press
|
|
|
|
|
|
|
|
|
|
if (e.key === ' ') { |
|
|
|
|
e.preventDefault(); |
|
|
|
|
e.stopPropagation(); |
|
|
|
|
this.togglePlay(); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
handleKeyDown = e => { |
|
|
|
|
switch(e.key) { |
|
|
|
|
case 'k': |
|
|
|
|
e.preventDefault(); |
|
|
|
|
e.stopPropagation(); |
|
|
|
|
this.togglePlay(); |
|
|
|
|
break; |
|
|
|
|
case 'm': |
|
|
|
|
e.preventDefault(); |
|
|
|
|
e.stopPropagation(); |
|
|
|
|
this.toggleMute(); |
|
|
|
|
break; |
|
|
|
|
case 'j': |
|
|
|
|
e.preventDefault(); |
|
|
|
|
e.stopPropagation(); |
|
|
|
|
this.seekBy(-10); |
|
|
|
|
break; |
|
|
|
|
case 'l': |
|
|
|
|
e.preventDefault(); |
|
|
|
|
e.stopPropagation(); |
|
|
|
|
this.seekBy(10); |
|
|
|
|
break; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
render () { |
|
|
|
|
const { src, intl, alt, editable, autoPlay } = this.props; |
|
|
|
|
const { paused, muted, volume, currentTime, duration, buffer, dragging } = this.state; |
|
|
|
|
const progress = Math.min((currentTime / duration) * 100, 100); |
|
|
|
|
|
|
|
|
|
return ( |
|
|
|
|
<div className={classNames('audio-player', { editable })} ref={this.setPlayerRef} style={{ backgroundColor: this._getBackgroundColor(), color: this._getForegroundColor(), width: '100%', height: this.props.fullscreen ? '100%' : (this.state.height || this.props.height) }} onMouseEnter={this.handleMouseEnter} onMouseLeave={this.handleMouseLeave}> |
|
|
|
|
<div className={classNames('audio-player', { editable })} ref={this.setPlayerRef} style={{ backgroundColor: this._getBackgroundColor(), color: this._getForegroundColor(), width: '100%', height: this.props.fullscreen ? '100%' : (this.state.height || this.props.height) }} onMouseEnter={this.handleMouseEnter} onMouseLeave={this.handleMouseLeave} tabIndex='0' onKeyDown={this.handleKeyDown}> |
|
|
|
|
<audio |
|
|
|
|
src={src} |
|
|
|
|
ref={this.setAudioRef} |
|
|
|
@ -406,12 +452,14 @@ class Audio extends React.PureComponent { |
|
|
|
|
|
|
|
|
|
<canvas |
|
|
|
|
role='button' |
|
|
|
|
tabIndex='0' |
|
|
|
|
className='audio-player__canvas' |
|
|
|
|
width={this.state.width} |
|
|
|
|
height={this.state.height} |
|
|
|
|
style={{ width: '100%', position: 'absolute', top: 0, left: 0 }} |
|
|
|
|
ref={this.setCanvasRef} |
|
|
|
|
onClick={this.togglePlay} |
|
|
|
|
onKeyDown={this.handleAudioKeyDown} |
|
|
|
|
title={alt} |
|
|
|
|
aria-label={alt} |
|
|
|
|
/> |
|
|
|
@ -432,6 +480,7 @@ class Audio extends React.PureComponent { |
|
|
|
|
className={classNames('video-player__seek__handle', { active: dragging })} |
|
|
|
|
tabIndex='0' |
|
|
|
|
style={{ left: `${progress}%`, backgroundColor: this._getAccentColor() }} |
|
|
|
|
onKeyDown={this.handleAudioKeyDown} |
|
|
|
|
/> |
|
|
|
|
</div> |
|
|
|
|
|
|
|
|
|