use-fullscreen.ts 1.1 KB

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