mirror of
https://github.com/hanzoai/sentinel.git
synced 2026-09-29 22:34:33 +00:00
68 lines
1.6 KiB
TypeScript
68 lines
1.6 KiB
TypeScript
import type {RefObject} from 'react';
|
|
import {useCallback} from 'react';
|
|
import screenfull from 'screenfull';
|
|
|
|
interface Props<Element extends HTMLElement> {
|
|
/**
|
|
* The element that this instance of `enter()` will use to go fullscreen.
|
|
* Calling `useFullscreen()` a second time will create a different instance of
|
|
* `ref` and `enter.
|
|
*/
|
|
elementRef: RefObject<Element>;
|
|
}
|
|
|
|
interface Return {
|
|
/**
|
|
* Render, in fullscreen, the `ref` that this instance relates to. If `ref`
|
|
* is unset, then `<html>` will be used.
|
|
*
|
|
* FullscreenOptions: https://developer.mozilla.org/en-US/docs/web/api/element/requestfullscreen#options_2
|
|
*/
|
|
enter: (options?: FullscreenOptions) => void;
|
|
|
|
/**
|
|
* Bring the browser out of fullscreen, regardless of which DOM element is
|
|
* currently active.
|
|
*/
|
|
exit: () => void;
|
|
|
|
/**
|
|
* Toggle fullscreen mode on and off, for the `ref` that this instance
|
|
* relates to.
|
|
*/
|
|
toggle: () => void;
|
|
}
|
|
|
|
/**
|
|
* Enable/Disable/Toggle fullscreen mode for a specified element.
|
|
*/
|
|
export default function useFullscreen<Element extends HTMLElement>({
|
|
elementRef,
|
|
}: Props<Element>): Return {
|
|
const enter = useCallback(
|
|
async (opts: FullscreenOptions = {navigationUI: 'auto'}) => {
|
|
if (screenfull.isEnabled && elementRef.current) {
|
|
await screenfull.request(elementRef.current, opts);
|
|
}
|
|
},
|
|
[elementRef]
|
|
);
|
|
|
|
const exit = useCallback(async () => {
|
|
if (screenfull.isEnabled) {
|
|
await screenfull.exit();
|
|
}
|
|
}, []);
|
|
|
|
const toggle = useCallback(
|
|
() => (screenfull.isFullscreen ? exit() : enter()),
|
|
[enter, exit]
|
|
);
|
|
|
|
return {
|
|
enter,
|
|
exit,
|
|
toggle,
|
|
};
|
|
}
|