diff --git a/package-lock.json b/package-lock.json index 54ef239..b07e0b3 100644 --- a/package-lock.json +++ b/package-lock.json @@ -17,6 +17,7 @@ "react-hotkeys-hook": "^4.5.0", "react-swipeable": "^7.0.1", "react-use-clipboard": "^1.0.9", + "screenfull": "^6.0.2", "use-debounce": "^10.0.0", "uuid": "^9.0.1", "zustand": "^4.5.2" @@ -12984,6 +12985,17 @@ "loose-envify": "^1.1.0" } }, + "node_modules/screenfull": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/screenfull/-/screenfull-6.0.2.tgz", + "integrity": "sha512-AQdy8s4WhNvUZ6P8F6PB21tSPIYKniic+Ogx0AacBMjKP1GUHN2E9URxQHtCusiwxudnCKkdy4GrHXPPJSkCCw==", + "engines": { + "node": "^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "/~https://github.com/sponsors/sindresorhus" + } + }, "node_modules/semantic-release": { "version": "23.0.2", "resolved": "https://registry.npmjs.org/semantic-release/-/semantic-release-23.0.2.tgz", diff --git a/package.json b/package.json index 58218a9..44804ae 100644 --- a/package.json +++ b/package.json @@ -43,6 +43,7 @@ "react-hotkeys-hook": "^4.5.0", "react-swipeable": "^7.0.1", "react-use-clipboard": "^1.0.9", + "screenfull": "^6.0.2", "use-debounce": "^10.0.0", "uuid": "^9.0.1", "zustand": "^4.5.2" diff --git a/src/features/ui/components/fullscreen-toggle/fullscreen-toggle.tsx b/src/features/ui/components/fullscreen-toggle/fullscreen-toggle.tsx index 0829fe6..1dc8b3a 100644 --- a/src/features/ui/components/fullscreen-toggle/fullscreen-toggle.tsx +++ b/src/features/ui/components/fullscreen-toggle/fullscreen-toggle.tsx @@ -1,10 +1,12 @@ import { useEffect, useState } from 'react'; +import screenfull from 'screenfull'; import { Button } from '../button'; import { Icon } from '../icon'; import $$ from './fullscreen-toggle.module.css'; export const FullscreenToggle = () => { + const [isEnabled, setIsEnabled] = useState(false); const [isFullscreen, setIsFullscreen] = useState(false); const toggleFullscreen = () => { @@ -12,16 +14,26 @@ export const FullscreenToggle = () => { }; useEffect(() => { + if (!isEnabled) { + return; + } + void (async () => { try { - await (isFullscreen - ? document.documentElement.requestFullscreen() - : document.exitFullscreen()); + await (isFullscreen ? screenfull.request() : screenfull.exit()); } catch { // Ignore } })(); - }, [isFullscreen]); + }, [isEnabled, isFullscreen]); + + useEffect(() => { + setIsEnabled(screenfull.isEnabled); + }, []); + + if (!isEnabled) { + return null; + } return (