Fix more visual issues with the audio player (#11654)
* Fix more visual issues with the audio player - Add horizontal baseline in the middle of waveform - Fix audio player colors in light theme - Use audio element instead of web audio API - Do not render any bars until the file is loaded - Do not allow interactions with waveform until the file is loaded * Fix code style issuepull/1208/head
parent
e72bac7576
commit
2e99e3cab3
|
@ -362,7 +362,8 @@ class Status extends ImmutablePureComponent {
|
||||||
src={attachment.get('url')}
|
src={attachment.get('url')}
|
||||||
alt={attachment.get('description')}
|
alt={attachment.get('description')}
|
||||||
duration={attachment.getIn(['meta', 'original', 'duration'], 0)}
|
duration={attachment.getIn(['meta', 'original', 'duration'], 0)}
|
||||||
height={110}
|
peaks={[0]}
|
||||||
|
height={70}
|
||||||
/>
|
/>
|
||||||
)}
|
)}
|
||||||
</Bundle>
|
</Bundle>
|
||||||
|
|
|
@ -14,8 +14,6 @@ const messages = defineMessages({
|
||||||
unmute: { id: 'video.unmute', defaultMessage: 'Unmute sound' },
|
unmute: { id: 'video.unmute', defaultMessage: 'Unmute sound' },
|
||||||
});
|
});
|
||||||
|
|
||||||
const arrayOf = (length, fill) => (new Array(length)).fill(fill);
|
|
||||||
|
|
||||||
export default @injectIntl
|
export default @injectIntl
|
||||||
class Audio extends React.PureComponent {
|
class Audio extends React.PureComponent {
|
||||||
|
|
||||||
|
@ -23,6 +21,7 @@ class Audio extends React.PureComponent {
|
||||||
src: PropTypes.string.isRequired,
|
src: PropTypes.string.isRequired,
|
||||||
alt: PropTypes.string,
|
alt: PropTypes.string,
|
||||||
duration: PropTypes.number,
|
duration: PropTypes.number,
|
||||||
|
peaks: PropTypes.arrayOf(PropTypes.number),
|
||||||
height: PropTypes.number,
|
height: PropTypes.number,
|
||||||
preload: PropTypes.bool,
|
preload: PropTypes.bool,
|
||||||
editable: PropTypes.bool,
|
editable: PropTypes.bool,
|
||||||
|
@ -77,7 +76,7 @@ class Audio extends React.PureComponent {
|
||||||
}
|
}
|
||||||
|
|
||||||
_updateWaveform () {
|
_updateWaveform () {
|
||||||
const { src, height, duration, preload } = this.props;
|
const { src, height, duration, peaks, preload } = this.props;
|
||||||
|
|
||||||
const progressColor = window.getComputedStyle(document.querySelector('.audio-player__progress-placeholder')).getPropertyValue('background-color');
|
const progressColor = window.getComputedStyle(document.querySelector('.audio-player__progress-placeholder')).getPropertyValue('background-color');
|
||||||
const waveColor = window.getComputedStyle(document.querySelector('.audio-player__wave-placeholder')).getPropertyValue('background-color');
|
const waveColor = window.getComputedStyle(document.querySelector('.audio-player__wave-placeholder')).getPropertyValue('background-color');
|
||||||
|
@ -94,7 +93,8 @@ class Audio extends React.PureComponent {
|
||||||
cursorWidth: 0,
|
cursorWidth: 0,
|
||||||
progressColor,
|
progressColor,
|
||||||
waveColor,
|
waveColor,
|
||||||
forceDecode: true,
|
backend: 'MediaElement',
|
||||||
|
interact: preload,
|
||||||
});
|
});
|
||||||
|
|
||||||
wavesurfer.setVolume(this.state.volume);
|
wavesurfer.setVolume(this.state.volume);
|
||||||
|
@ -103,7 +103,7 @@ class Audio extends React.PureComponent {
|
||||||
wavesurfer.load(src);
|
wavesurfer.load(src);
|
||||||
this.loaded = true;
|
this.loaded = true;
|
||||||
} else {
|
} else {
|
||||||
wavesurfer.load(src, arrayOf(1, 0.5), null, duration);
|
wavesurfer.load(src, peaks, 'none', duration);
|
||||||
this.loaded = false;
|
this.loaded = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -123,6 +123,7 @@ class Audio extends React.PureComponent {
|
||||||
this.wavesurfer.createBackend();
|
this.wavesurfer.createBackend();
|
||||||
this.wavesurfer.createPeakCache();
|
this.wavesurfer.createPeakCache();
|
||||||
this.wavesurfer.load(this.props.src);
|
this.wavesurfer.load(this.props.src);
|
||||||
|
this.wavesurfer.toggleInteraction();
|
||||||
this.loaded = true;
|
this.loaded = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -116,7 +116,7 @@ export default class DetailedStatus extends ImmutablePureComponent {
|
||||||
src={attachment.get('url')}
|
src={attachment.get('url')}
|
||||||
alt={attachment.get('description')}
|
alt={attachment.get('description')}
|
||||||
duration={attachment.getIn(['meta', 'original', 'duration'], 0)}
|
duration={attachment.getIn(['meta', 'original', 'duration'], 0)}
|
||||||
height={150}
|
height={110}
|
||||||
preload
|
preload
|
||||||
/>
|
/>
|
||||||
);
|
);
|
||||||
|
|
|
@ -104,7 +104,8 @@ html {
|
||||||
.box-widget input[type="email"],
|
.box-widget input[type="email"],
|
||||||
.box-widget input[type="password"],
|
.box-widget input[type="password"],
|
||||||
.box-widget textarea,
|
.box-widget textarea,
|
||||||
.statuses-grid .detailed-status {
|
.statuses-grid .detailed-status,
|
||||||
|
.audio-player {
|
||||||
border: 1px solid lighten($ui-base-color, 8%);
|
border: 1px solid lighten($ui-base-color, 8%);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -700,3 +701,10 @@ html {
|
||||||
.compose-form .compose-form__warning {
|
.compose-form .compose-form__warning {
|
||||||
box-shadow: none;
|
box-shadow: none;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.audio-player .video-player__controls button,
|
||||||
|
.audio-player .video-player__time-sep,
|
||||||
|
.audio-player .video-player__time-current,
|
||||||
|
.audio-player .video-player__time-total {
|
||||||
|
color: $primary-text-color;
|
||||||
|
}
|
||||||
|
|
|
@ -5062,6 +5062,19 @@ a.status-card.compact:hover {
|
||||||
|
|
||||||
&__waveform {
|
&__waveform {
|
||||||
padding: 15px 0;
|
padding: 15px 0;
|
||||||
|
position: relative;
|
||||||
|
overflow: hidden;
|
||||||
|
|
||||||
|
&::before {
|
||||||
|
content: "";
|
||||||
|
display: block;
|
||||||
|
position: absolute;
|
||||||
|
border-top: 1px solid lighten($ui-base-color, 4%);
|
||||||
|
width: 100%;
|
||||||
|
height: 0;
|
||||||
|
left: 0;
|
||||||
|
top: calc(50% + 1px);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
&__progress-placeholder {
|
&__progress-placeholder {
|
||||||
|
|
Loading…
Reference in New Issue