-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathuse-fullscreen.ts
112 lines (102 loc) · 3.91 KB
/
use-fullscreen.ts
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
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
import { useEffect, useState } from 'react';
interface IElementFullScreen<TElement> extends HTMLElement {
readonly fullscreenElement: TElement;
readonly mozFullScreenElement: TElement;
readonly webkitFullscreenElement: TElement;
readonly msFullscreenElement: TElement;
readonly mozFullScreen: boolean;
readonly fullscreen: boolean;
readonly webkitIsFullScreen: boolean;
readonly fullScreenMode: boolean;
exitFullscreen(): Promise<void>;
mozCancelFullScreen(): Promise<void>;
webkitExitFullscreen(): Promise<void>;
msExitFullscreen(): Promise<void>;
requestFullscreen(): Promise<void>;
mozRequestFullScreen(): Promise<void>;
webkitRequestFullscreen(): Promise<void>;
msRequestFullscreen(): Promise<void>;
}
export function isFullScreenElement<TElement>(el: TElement): boolean {
const d = (document as unknown) as IElementFullScreen<TElement>;
if (el) {
return Boolean(
d.fullscreenElement === el ||
d.mozFullScreenElement === el ||
d.webkitFullscreenElement === el ||
d.msFullscreenElement === el
);
}
return Boolean(
d.fullscreenElement ||
d.mozFullScreenElement ||
d.webkitFullscreenElement ||
d.msFullscreenElement ||
d.fullscreen ||
d.mozFullScreen ||
d.webkitIsFullScreen ||
d.fullScreenMode
);
}
export const useFullScreen = <TElement>(options: { element?: TElement } = {}) => {
const fsEl = options && ((options.element as unknown) as IElementFullScreen<TElement>);
const initialState = window ? false : isFullScreenElement(fsEl);
const [isFullScreen, setFullScreen] = useState(initialState);
const d = (document as unknown) as IElementFullScreen<TElement>;
const openFullScreen = () => {
const el: HTMLElement & {
mozRequestFullScreen?(): void;
webkitRequestFullscreen?(): void;
msRequestFullscreen?(): void;
} = fsEl || document.documentElement;
if (el.requestFullscreen) {
return el.requestFullscreen();
}
if (el.mozRequestFullScreen) {
return el.mozRequestFullScreen();
}
if (el.webkitRequestFullscreen) {
return el.webkitRequestFullscreen();
}
if (el.msRequestFullscreen) {
return el.msRequestFullscreen();
}
};
const closeFullScreen = () => {
if (d.exitFullscreen) {
return d.exitFullscreen();
}
if (d.mozCancelFullScreen) {
return d.mozCancelFullScreen();
}
if (d.webkitExitFullscreen) {
return d.webkitExitFullscreen();
}
if (d.msExitFullscreen) {
return d.msExitFullscreen();
}
};
function handleChange(): void {
setFullScreen(isFullScreenElement(fsEl));
}
useEffect(() => {
document.addEventListener('webkitfullscreenchange', handleChange, false);
document.addEventListener('mozfullscreenchange', handleChange, false);
document.addEventListener('msfullscreenchange', handleChange, false);
document.addEventListener('MSFullscreenChange', handleChange, false);
document.addEventListener('fullscreenchange', handleChange, false);
return () => {
document.removeEventListener('webkitfullscreenchange', handleChange);
document.removeEventListener('mozfullscreenchange', handleChange);
document.removeEventListener('msfullscreenchange', handleChange);
document.removeEventListener('MSFullscreenChange', handleChange);
document.removeEventListener('fullscreenchange', handleChange);
};
}, [options.element]);
return {
isFullScreen,
open: openFullScreen,
close: closeFullScreen,
toggleFullScreen: isFullScreen ? closeFullScreen : openFullScreen
};
};