use-fullscreen.ts 1.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950
  1. import {
  2. useCallback, useEffect, useMemo, useState,
  3. } from 'react';
  4. export interface FullScreenHandle {
  5. active: boolean;
  6. enter: () => Promise<void>;
  7. exit: () => Promise<void>;
  8. }
  9. export const useFullScreen = (): FullScreenHandle => {
  10. const [active, setActive] = useState(false);
  11. useEffect(() => {
  12. const handleChange = () => {
  13. setActive(document.fullscreenElement != null);
  14. };
  15. document.addEventListener('fullscreenchange', handleChange);
  16. return function cleanup() {
  17. document.removeEventListener('fullscreenchange', handleChange);
  18. };
  19. }, []);
  20. const enter = useCallback((elem?: HTMLElement) => {
  21. if (document.fullscreenElement != null) {
  22. return Promise.resolve();
  23. }
  24. const targetElem = elem ?? document.documentElement;
  25. return targetElem.requestFullscreen();
  26. }, []);
  27. const exit = useCallback(() => {
  28. if (document.fullscreenElement == null) {
  29. return Promise.resolve();
  30. }
  31. return document.exitFullscreen();
  32. }, []);
  33. return useMemo(
  34. () => ({
  35. active,
  36. enter,
  37. exit,
  38. }),
  39. [active, enter, exit],
  40. );
  41. };