41 lines
1.2 KiB
TypeScript
Executable File
41 lines
1.2 KiB
TypeScript
Executable File
import {FullscreenAdapter} from '@common/player/state/fullscreen/fullscreen-adapter';
|
|
import fscreen from 'fscreen';
|
|
|
|
export function createNativeFullscreenAdapter(
|
|
host: HTMLElement,
|
|
onChange: () => void
|
|
): FullscreenAdapter {
|
|
host = host.closest('.fullscreen-host') ?? host;
|
|
return {
|
|
isFullscreen: () => {
|
|
if (fscreen.fullscreenElement === host) return true;
|
|
try {
|
|
// Throws in iOS Safari...
|
|
return host.matches(
|
|
// @ts-expect-error - `fullscreenPseudoClass` is missing from `@types/fscreen`.
|
|
fscreen.fullscreenPseudoClass
|
|
);
|
|
} catch (error) {
|
|
return false;
|
|
}
|
|
},
|
|
canFullScreen: () => {
|
|
return fscreen.fullscreenEnabled;
|
|
},
|
|
enter: () => {
|
|
return fscreen.requestFullscreen(host);
|
|
},
|
|
exit: () => {
|
|
return fscreen.exitFullscreen();
|
|
},
|
|
bindEvents: () => {
|
|
fscreen.addEventListener('fullscreenchange', onChange);
|
|
fscreen.addEventListener('fullscreenerror', onChange);
|
|
},
|
|
unbindEvents: () => {
|
|
fscreen.removeEventListener('fullscreenchange', onChange);
|
|
fscreen.removeEventListener('fullscreenerror', onChange);
|
|
},
|
|
};
|
|
}
|