123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687 |
- import {MutableRefObject, useCallback, useEffect, useRef, useState} from 'react';
- import screenfull from 'screenfull';
- interface FullscreenOptions {
- navigationUI: 'hide' | 'show' | 'auto';
- }
- interface FullscreenHook {
-
- enter: (options?: FullscreenOptions) => void;
-
- exit: () => void;
-
- isEnabled: boolean;
-
- isFullscreen: boolean;
-
- ref: MutableRefObject<null | HTMLDivElement>;
-
- toggle: () => void;
- }
- export default function useFullscreen(): FullscreenHook {
- const ref = useRef<null | HTMLDivElement>(null);
- const [isFullscreen, setIsFullscreen] = useState(false);
- const enter = useCallback(async (opts: FullscreenOptions = {navigationUI: 'auto'}) => {
- if (screenfull.isEnabled && ref.current) {
- await screenfull.request(ref.current, opts);
- }
- }, []);
- const exit = useCallback(async () => {
- if (screenfull.isEnabled) {
- await screenfull.exit();
- }
- }, []);
- const toggle = useCallback(
- () => (isFullscreen ? exit() : enter()),
- [enter, exit, isFullscreen]
- );
- useEffect(() => {
- const onChange = () => {
- setIsFullscreen(screenfull.isFullscreen);
- };
- screenfull.on('change', onChange);
- return () => screenfull.off('change', onChange);
- }, []);
- return {
- enter,
- exit,
- isEnabled: screenfull.isEnabled,
- isFullscreen,
- ref,
- toggle,
- };
- }
|