Skip to content

Commit ca6b485

Browse files
committed
Fullscreen control
1 parent e09ed0e commit ca6b485

File tree

6 files changed

+136
-0
lines changed

6 files changed

+136
-0
lines changed

src/DefaultPlayer/DefaultPlayer.js

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ import React from 'react';
22
import video from './../video/video';
33
import {
44
setVolume,
5+
fullscreen,
56
toggleMute,
67
togglePause,
78
setCurrentTime,
@@ -14,6 +15,7 @@ import Seek from './Seek/Seek';
1415
import Volume from './Volume/Volume';
1516
import ErrorMessage from './ErrorMessage/ErrorMessage';
1617
import Time from './Time/Time';
18+
import Fullscreen from './Fullscreen/Fullscreen';
1719

1820
const DefaultPlayer = ({
1921
video,
@@ -24,6 +26,7 @@ const DefaultPlayer = ({
2426
toggleMute,
2527
togglePause,
2628
setCurrentTime,
29+
onFullscreenClick,
2730
...restProps
2831
}) => {
2932
return (
@@ -55,6 +58,9 @@ const DefaultPlayer = ({
5558
setVolume={setVolume}
5659
toggleMute={toggleMute}
5760
{...video} />
61+
<Fullscreen
62+
onClick={onFullscreenClick}
63+
{...video} />
5864
</div>
5965
</div>
6066
);
@@ -71,6 +77,7 @@ export default video(
7177
}
7278
}),
7379
(videoEl, state) => ({
80+
onFullscreenClick: () => fullscreen(videoEl),
7481
toggleMute: () => toggleMute(videoEl, state),
7582
togglePause: () => togglePause(videoEl, state),
7683
setVolume: (value) => setVolume(videoEl, state, value),
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
.component {}
2+
3+
.component:hover {
4+
background-color: #000;
5+
}
6+
7+
.button {
8+
width: 34px;
9+
height: 34px;
10+
background: none;
11+
border: 0;
12+
color: inherit;
13+
font: inherit;
14+
line-height: normal;
15+
overflow: visible;
16+
padding: 0;
17+
cursor: pointer;
18+
}
19+
20+
.button:focus {
21+
outline: 0;
22+
}
23+
24+
.icon {
25+
padding: 5px;
26+
}
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
import React from 'react';
2+
import styles from './Fullscreen.css';
3+
import FullscreenIcon from './../Icon/fullscreen.svg';
4+
5+
export default ({ onClick, className }) => {
6+
return (
7+
<div className={[
8+
styles.component,
9+
className
10+
].join(' ')}>
11+
<button
12+
type="button"
13+
onClick={onClick}
14+
aria-label="Fullscreen"
15+
className={styles.button}>
16+
<FullscreenIcon
17+
fill="#fff"
18+
className={styles.icon} />
19+
</button>
20+
</div>
21+
);
22+
};
Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
import React from 'react';
2+
import { shallow } from 'enzyme';
3+
import Fullscreen from './Fullscreen';
4+
import styles from './Fullscreen.css';
5+
6+
describe('Fullscreen', () => {
7+
let component;
8+
9+
beforeAll(() => {
10+
component = shallow(<Fullscreen />);
11+
});
12+
13+
it('should accept a className prop and append it to the components class', () => {
14+
const newClassNameString = 'a new className';
15+
expect(component.prop('className'))
16+
.toContain(styles.component);
17+
component.setProps({
18+
className: newClassNameString
19+
});
20+
expect(component.prop('className'))
21+
.toContain(styles.component);
22+
expect(component.prop('className'))
23+
.toContain(newClassNameString);
24+
});
25+
26+
it('triggers \'onClick\' prop when the button is clicked', () => {
27+
const spy = jest.fn();
28+
component.setProps({
29+
onClick: spy
30+
});
31+
expect(spy)
32+
.not.toHaveBeenCalled();
33+
component.find('button').simulate('click');
34+
expect(spy)
35+
.toHaveBeenCalled();
36+
});
37+
38+
it('has correct aria-label', () => {
39+
expect(component.find('button').prop('aria-label'))
40+
.toEqual('Fullscreen');
41+
});
42+
});

src/video/api.js

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,18 @@ export const toggleMute = (videoEl, { volume, muted }) => {
4040
}
4141
};
4242

43+
export const fullscreen = (videoEl) => {
44+
if (videoEl.requestFullscreen) {
45+
videoEl.requestFullscreen();
46+
} else if (videoEl.msRequestFullscreen) {
47+
videoEl.msRequestFullscreen();
48+
} else if (videoEl.mozRequestFullScreen) {
49+
videoEl.mozRequestFullScreen();
50+
} else if (videoEl.webkitRequestFullscreen) {
51+
videoEl.webkitRequestFullscreen();
52+
}
53+
}
54+
4355
/**
4456
* Custom getter methods that are commonly used
4557
* across video layouts. To be primarily used in

src/video/api.test.js

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ import {
33
unmute,
44
setVolume,
55
toggleMute,
6+
fullscreen,
67
togglePause,
78
setCurrentTime,
89
getPercentagePlayed,
@@ -105,6 +106,32 @@ describe('api', () => {
105106
});
106107
});
107108

109+
describe('fullscreen', () => {
110+
it('requestsFullscreen', () => {
111+
videoElMock.requestFullscreen = jest.fn();
112+
fullscreen(videoElMock);
113+
expect(videoElMock.requestFullscreen).toHaveBeenCalled();
114+
});
115+
116+
it('requestsFullscreen for ms', () => {
117+
videoElMock.msRequestFullscreen = jest.fn();
118+
fullscreen(videoElMock);
119+
expect(videoElMock.msRequestFullscreen).toHaveBeenCalled();
120+
});
121+
122+
it('requestsFullscreen for moz', () => {
123+
videoElMock.mozRequestFullScreen = jest.fn();
124+
fullscreen(videoElMock);
125+
expect(videoElMock.mozRequestFullScreen).toHaveBeenCalled();
126+
});
127+
128+
it('requestsFullscreen for webkit', () => {
129+
videoElMock.webkitRequestFullscreen = jest.fn();
130+
fullscreen(videoElMock);
131+
expect(videoElMock.webkitRequestFullscreen).toHaveBeenCalled();
132+
});
133+
});
134+
108135
describe('getPercentagePlayed', () => {
109136
it('returns correct percentage played', () => {
110137
expect(getPercentagePlayed({

0 commit comments

Comments
 (0)