about summary refs log tree commit diff
diff options
context:
space:
mode:
authorEugen Rochko <eugen@zeonfederated.com>2017-10-08 02:33:08 +0200
committerGitHub <noreply@github.com>2017-10-08 02:33:08 +0200
commit292f3cd7e0db0d71cb3202e65185f06fd04c475f (patch)
tree89920ec789787ee887e5e393446c78c7065a0769
parenta3d4f1bd9361c5e7fbf18e7d905cf8f44cf0224d (diff)
Show buffering in video player (#5261)
-rw-r--r--app/javascript/mastodon/features/video/index.js10
-rw-r--r--app/javascript/styles/components.scss7
2 files changed, 14 insertions, 3 deletions
diff --git a/app/javascript/mastodon/features/video/index.js b/app/javascript/mastodon/features/video/index.js
index 7502dda8b..519a2aac9 100644
--- a/app/javascript/mastodon/features/video/index.js
+++ b/app/javascript/mastodon/features/video/index.js
@@ -209,6 +209,10 @@ export default class Video extends React.PureComponent {
     }
   }
 
+  handleProgress = () => {
+    this.setState({ buffer: this.video.buffered.end(0) / this.video.duration * 100 });
+  }
+
   handleOpenVideo = () => {
     this.video.pause();
     this.props.onOpenVideo(this.video.currentTime);
@@ -221,7 +225,7 @@ export default class Video extends React.PureComponent {
 
   render () {
     const { preview, src, width, height, startTime, onOpenVideo, onCloseVideo, intl, alt } = this.props;
-    const { progress, dragging, paused, fullscreen, hovered, muted, revealed } = this.state;
+    const { progress, buffer, dragging, paused, fullscreen, hovered, muted, revealed } = this.state;
 
     return (
       <div className={classNames('video-player', { inactive: !revealed, inline: width && height && !fullscreen, fullscreen })} style={{ width, height }} ref={this.setPlayerRef} onMouseEnter={this.handleMouseEnter} onMouseLeave={this.handleMouseLeave}>
@@ -229,7 +233,7 @@ export default class Video extends React.PureComponent {
           ref={this.setVideoRef}
           src={src}
           poster={preview}
-          preload={!!startTime}
+          preload={startTime ? true : null}
           loop
           role='button'
           tabIndex='0'
@@ -241,6 +245,7 @@ export default class Video extends React.PureComponent {
           onPause={this.handlePause}
           onTimeUpdate={this.handleTimeUpdate}
           onLoadedData={this.handleLoadedData}
+          onProgress={this.handleProgress}
         />
 
         <button className={classNames('video-player__spoiler', { active: !revealed })} onClick={this.toggleReveal}>
@@ -250,6 +255,7 @@ export default class Video extends React.PureComponent {
 
         <div className={classNames('video-player__controls', { active: paused || hovered })}>
           <div className='video-player__seek' onMouseDown={this.handleMouseDown} ref={this.setSeekRef}>
+            <div className='video-player__seek__buffer' style={{ width: `${buffer}%` }} />
             <div className='video-player__seek__progress' style={{ width: `${progress}%` }} />
 
             <span
diff --git a/app/javascript/styles/components.scss b/app/javascript/styles/components.scss
index 0e7022e9b..d578e9930 100644
--- a/app/javascript/styles/components.scss
+++ b/app/javascript/styles/components.scss
@@ -4028,7 +4028,8 @@ button.icon-button.active i.fa-retweet {
       top: 10px;
     }
 
-    &__progress {
+    &__progress,
+    &__buffer {
       display: block;
       position: absolute;
       height: 4px;
@@ -4036,6 +4037,10 @@ button.icon-button.active i.fa-retweet {
       background: $ui-highlight-color;
     }
 
+    &__buffer {
+      background: rgba($white, 0.2);
+    }
+
     &__handle {
       position: absolute;
       z-index: 3;