Skip to content

Commit 7417d5c

Browse files
committed
feat: improve <Video>
1 parent 5917781 commit 7417d5c

File tree

3 files changed

+65
-5
lines changed

3 files changed

+65
-5
lines changed

src/Video/__story__/story.tsx

Lines changed: 29 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,25 @@ storiesOf('Generators/Video', module)
1919
</div>
2020
}</Video>
2121
)
22-
.add('Control buttons', () =>
22+
.add('Basic controls', () =>
23+
<Video
24+
src={src}
25+
style={{
26+
width: 400,
27+
border: '1px solid tomato'
28+
}}
29+
render={({video, play, pause, seek, volume, mute, unmute}, {isPlaying}) =>
30+
<div>
31+
{video}
32+
<br />
33+
<button onClick={() => isPlaying ? pause() : play()}>
34+
{isPlaying ? 'Pause' : 'Play'}
35+
</button>
36+
</div>
37+
}
38+
/>
39+
)
40+
.add('All bontrol buttons', () =>
2341
<Video
2442
src={src}
2543
style={{
@@ -45,4 +63,14 @@ storiesOf('Generators/Video', module)
4563
</div>
4664
}
4765
/>
66+
)
67+
.add('No render props', () =>
68+
<Video
69+
src={src}
70+
autoPlay
71+
style={{
72+
width: 400,
73+
border: '1px solid tomato'
74+
}}
75+
/>
4876
);

src/Video/index.ts

Lines changed: 21 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import {Component, cloneElement, Children} from 'react';
22
import {h, noop} from '../util';
33
import renderProp from '../util/renderProp';
4+
import parseTimeRanges from './parseTimeRanges';
45

56
export type TVideoEvent = (event, IVideo?, IVideoState?) => void;
67
export type TVideoRenderProp = (video: Video, state: IVideoState) => React.ReactElement<any>;
@@ -51,10 +52,11 @@ export interface IVideoProps extends React.AllHTMLAttributes<any> {
5152
}
5253

5354
export interface IVideoState {
54-
time?: number;
55+
buffered?: any[];
5556
duration?: number;
5657
isPlaying?: boolean;
5758
muted?: boolean;
59+
time?: number;
5860
volume?: number;
5961
}
6062

@@ -82,10 +84,14 @@ export class Video extends Component<IVideoProps, IVideoState> implements IVideo
8284
this.setState({
8385
volume: this.el.volume
8486
});
87+
88+
this.event('onMount')(this);
8589
}
8690

8791
componentWillUnmount () {
8892
this.el = null;
93+
94+
this.event('onUnmount')(this);
8995
}
9096

9197
play = () => {
@@ -168,8 +174,11 @@ export class Video extends Component<IVideoProps, IVideoState> implements IVideo
168174
};
169175

170176
onDurationChange = (event) => {
177+
const {duration, buffered} = this.el;
178+
171179
this.setState({
172-
duration: this.el.duration
180+
duration,
181+
buffered: parseTimeRanges(buffered)
173182
});
174183

175184
this.event('onDurationChange')(event);
@@ -183,6 +192,14 @@ export class Video extends Component<IVideoProps, IVideoState> implements IVideo
183192
this.event('onTimeUpdate')(event);
184193
};
185194

195+
onProgress = (event) => {
196+
this.setState({
197+
buffered: parseTimeRanges(this.el.buffered)
198+
});
199+
200+
this.event('onProgress')(event);
201+
};
202+
186203
render () {
187204
const {props, event} = this;
188205
const {children, render, noJs, ...rest} = props;
@@ -205,7 +222,7 @@ export class Video extends Component<IVideoProps, IVideoState> implements IVideo
205222
onPause: this.onPause,
206223
onPlay: this.onPlay,
207224
onPlaying: event('onPlaying'),
208-
onProgress: event('onProgress'),
225+
onProgress: this.onProgress,
209226
onRateChange: event('onRateChange'),
210227
onSeeked: event('onSeeked'),
211228
onSeeking: event('onSeeking'),
@@ -218,6 +235,6 @@ export class Video extends Component<IVideoProps, IVideoState> implements IVideo
218235
noJs
219236
);
220237

221-
return renderProp(this.props, this, this.state);
238+
return renderProp(this.props, this, this.state) || this.video;
222239
}
223240
}

src/Video/parseTimeRanges.ts

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
const parseTimeRanges = (ranges) => {
2+
const result = [];
3+
let idx;
4+
5+
for (idx = 0; idx < ranges.length; idx++) {
6+
result.push({
7+
start: ranges.start(idx),
8+
end: ranges.end(idx)
9+
});
10+
}
11+
12+
return result;
13+
};
14+
15+
export default parseTimeRanges;

0 commit comments

Comments
 (0)