-
Notifications
You must be signed in to change notification settings - Fork 263
Expand file tree
/
Copy pathFullScreenHandle.js
More file actions
91 lines (79 loc) · 2.02 KB
/
FullScreenHandle.js
File metadata and controls
91 lines (79 loc) · 2.02 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
import {
useCallback,
useState,
useEffect,
useMemo,
} from 'react';
import PropTypes from 'prop-types';
import fscreen from 'fscreen';
/**
* Used to request or exit fullscreen using the Fullscreen API, normalized
* using fscreen.
*/
export function useFullScreenHandle() {
const [active, setActive] = useState(false);
/** */
const handleFullScreenChange = () => {
setActive(fscreen.fullscreenElement === document.body);
};
useEffect(() => {
fscreen.addEventListener('fullscreenchange', handleFullScreenChange);
return () => fscreen.removeEventListener('fullscreenchange', handleFullScreenChange);
}, []);
/** */
const requestFullscreen = () => fscreen.requestFullscreen(document.body);
const enter = useCallback(() => {
if (fscreen.fullscreenElement) {
return fscreen.exitFullscreen()
.then(() => requestFullscreen());
}
return requestFullscreen();
}, []);
const exit = useCallback(() => {
if (fscreen.fullscreenElement !== document.body) return Promise.resolve();
return fscreen.exitFullscreen();
}, []);
return useMemo(
() => ({
active,
enter,
exit,
}),
[active, enter, exit],
);
}
/**
* Used to set its children to fullscreen.
*/
export const FullScreen = ({
handle,
onChange,
children,
className = '',
}) => {
const fullScreenClasses = ['fullscreen', className, handle.active ? 'fullscreen-enabled' : ''].filter(Boolean);
useEffect(() => {
if (onChange) {
onChange(handle.active, handle);
}
}, [handle, handle.active, onChange]);
const styles = handle.active ? {
height: '100%',
width: '100%',
} : {};
return (
<div className={fullScreenClasses.join(' ')} style={styles}>
{children}
</div>
);
};
FullScreen.propTypes = {
children: PropTypes.node,
className: PropTypes.string.isRequired,
handle: PropTypes.object.isRequired, // eslint-disable-line react/forbid-prop-types
onChange: PropTypes.func,
};
FullScreen.defaultProps = {
children: null,
onChange: undefined,
};