diff --git a/src/App.js b/src/App.js index d8db51d..b13c242 100644 --- a/src/App.js +++ b/src/App.js @@ -7,7 +7,7 @@ import { UserCheck, UserX, HeartCrack, HeartPulse, Zap, EyeOff, ExternalLink, AlertTriangle, Play as PlayIcon, Pause as PauseIcon, SkipForward as SkipForwardIcon, StopCircle as StopCircleIcon, Users2, Dices, ChevronUp, ChevronDown, ScrollText, - Maximize2, Minimize2 + Maximize2, Minimize2, Moon, Coffee } from 'lucide-react'; // Custom CSS for death animation (player view only) @@ -2311,6 +2311,8 @@ function DisplayView() { const [campaignBackgroundUrl, setCampaignBackgroundUrl] = useState(''); const [isPlayerDisplayActive, setIsPlayerDisplayActive] = useState(false); const [isFullscreen, setIsFullscreen] = useState(false); + const [wakeLockEnabled, setWakeLockEnabled] = useState(false); + const wakeLockRef = useRef(null); const currentParticipantRef = useRef(null); useEffect(() => { @@ -2327,6 +2329,33 @@ function DisplayView() { } }; + useEffect(() => { + if (!wakeLockEnabled) { + wakeLockRef.current?.release(); + wakeLockRef.current = null; + return; + } + + const acquire = async () => { + try { + wakeLockRef.current = await navigator.wakeLock.request('screen'); + } catch (e) { + console.error('Wake lock failed:', e); + } + }; + + acquire(); + + // Re-acquire after tab becomes visible again (browser auto-releases on hide) + const onVisChange = () => { if (document.visibilityState === 'visible') acquire(); }; + document.addEventListener('visibilitychange', onVisChange); + return () => { + document.removeEventListener('visibilitychange', onVisChange); + wakeLockRef.current?.release(); + wakeLockRef.current = null; + }; + }, [wakeLockEnabled]); + useEffect(() => { if (!db) { setEncounterError("Firestore not available."); @@ -2450,13 +2479,22 @@ function DisplayView() { className={`p-4 md:p-8 rounded-xl shadow-2xl ${!campaignBackgroundUrl ? 'bg-stone-950' : ''}`} style={displayStyles} > - +
+ + +

{name}