|
|
|
@ -7,6 +7,7 @@ import classNames from 'classnames';
|
|
|
|
|
import { throttle } from 'lodash';
|
|
|
|
|
import { encode, decode } from 'blurhash';
|
|
|
|
|
import { getPointerPosition, fileNameFromURL } from 'mastodon/features/video';
|
|
|
|
|
import { debounce } from 'lodash';
|
|
|
|
|
|
|
|
|
|
const digitCharacters = [
|
|
|
|
|
'0',
|
|
|
|
@ -172,16 +173,20 @@ class Audio extends React.PureComponent {
|
|
|
|
|
setPlayerRef = c => {
|
|
|
|
|
this.player = c;
|
|
|
|
|
|
|
|
|
|
if (c) {
|
|
|
|
|
const width = c.offsetWidth;
|
|
|
|
|
const height = width / (16/9);
|
|
|
|
|
if (this.player) {
|
|
|
|
|
this._setDimensions();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (this.props.cacheWidth) {
|
|
|
|
|
this.props.cacheWidth(width);
|
|
|
|
|
}
|
|
|
|
|
_setDimensions () {
|
|
|
|
|
const width = this.player.offsetWidth;
|
|
|
|
|
const height = width / (16/9);
|
|
|
|
|
|
|
|
|
|
this.setState({ width, height });
|
|
|
|
|
if (this.props.cacheWidth) {
|
|
|
|
|
this.props.cacheWidth(width);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
this.setState({ width, height });
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
setSeekRef = c => {
|
|
|
|
@ -214,6 +219,7 @@ class Audio extends React.PureComponent {
|
|
|
|
|
|
|
|
|
|
componentDidMount () {
|
|
|
|
|
window.addEventListener('scroll', this.handleScroll);
|
|
|
|
|
window.addEventListener('resize', this.handleResize, { passive: true });
|
|
|
|
|
|
|
|
|
|
const img = new Image();
|
|
|
|
|
img.crossOrigin = 'anonymous';
|
|
|
|
@ -243,6 +249,7 @@ class Audio extends React.PureComponent {
|
|
|
|
|
|
|
|
|
|
componentWillUnmount () {
|
|
|
|
|
window.removeEventListener('scroll', this.handleScroll);
|
|
|
|
|
window.removeEventListener('resize', this.handleResize);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
togglePlay = () => {
|
|
|
|
@ -253,6 +260,14 @@ class Audio extends React.PureComponent {
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
handleResize = debounce(() => {
|
|
|
|
|
if (this.player) {
|
|
|
|
|
this._setDimensions();
|
|
|
|
|
}
|
|
|
|
|
}, 250, {
|
|
|
|
|
trailing: true,
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
handlePlay = () => {
|
|
|
|
|
this.setState({ paused: false });
|
|
|
|
|
|
|
|
|
@ -564,14 +579,13 @@ class Audio extends React.PureComponent {
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
_drawTick (x1, y1, x2, y2) {
|
|
|
|
|
const radius = this._getRadius();
|
|
|
|
|
const cx = parseInt(this.state.width / 2);
|
|
|
|
|
const cy = parseInt(radius + (PADDING * this._getScaleCoefficient()));
|
|
|
|
|
const cx = this._getCX();
|
|
|
|
|
const cy = this._getCY();
|
|
|
|
|
|
|
|
|
|
const dx1 = parseInt(cx + x1);
|
|
|
|
|
const dy1 = parseInt(cy + y1);
|
|
|
|
|
const dx2 = parseInt(cx + x2);
|
|
|
|
|
const dy2 = parseInt(cy + y2);
|
|
|
|
|
const dx1 = Math.ceil(cx + x1);
|
|
|
|
|
const dy1 = Math.ceil(cy + y1);
|
|
|
|
|
const dx2 = Math.ceil(cx + x2);
|
|
|
|
|
const dy2 = Math.ceil(cy + y2);
|
|
|
|
|
|
|
|
|
|
const gradient = this.canvasContext.createLinearGradient(dx1, dy1, dx2, dy2);
|
|
|
|
|
|
|
|
|
@ -590,6 +604,14 @@ class Audio extends React.PureComponent {
|
|
|
|
|
this.canvasContext.stroke();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
_getCX() {
|
|
|
|
|
return Math.floor(this.state.width / 2);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
_getCY() {
|
|
|
|
|
return Math.floor(this._getRadius() + (PADDING * this._getScaleCoefficient()));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
_getColor () {
|
|
|
|
|
return `rgb(${this.state.color.r}, ${this.state.color.g}, ${this.state.color.b})`;
|
|
|
|
|
}
|
|
|
|
@ -638,7 +660,7 @@ class Audio extends React.PureComponent {
|
|
|
|
|
alt=''
|
|
|
|
|
width={(this._getRadius() - TICK_SIZE) * 2}
|
|
|
|
|
height={(this._getRadius() - TICK_SIZE) * 2}
|
|
|
|
|
style={{ position: 'absolute', left: parseInt(this.state.width / 2), top: parseInt(this._getRadius() + (PADDING * this._getScaleCoefficient())), transform: 'translate(-50%, -50%)', borderRadius: '50%', pointerEvents: 'none' }}
|
|
|
|
|
style={{ position: 'absolute', left: this._getCX(), top: this._getCY(), transform: 'translate(-50%, -50%)', borderRadius: '50%', pointerEvents: 'none' }}
|
|
|
|
|
/>
|
|
|
|
|
|
|
|
|
|
<div className='video-player__seek' onMouseDown={this.handleMouseDown} ref={this.setSeekRef}>
|
|
|
|
|