Spaces:
Running
Running
| import * as React from "react"; | |
| // Idle detection — the gate that makes cloud vision affordable. When the user | |
| // is away (no input for `thresholdMs`) or the tab is hidden, ambient vision | |
| // pauses so the Modal GPU scales to zero and bills nothing. | |
| export function useIdle(thresholdMs = 150_000): boolean { | |
| const [idle, setIdle] = React.useState(false); | |
| const last = React.useRef(Date.now()); | |
| React.useEffect(() => { | |
| const bump = () => { | |
| last.current = Date.now(); | |
| setIdle(false); // wake immediately on activity (React bails if already false) | |
| }; | |
| const events = ["mousemove", "mousedown", "keydown", "wheel", "touchstart"] as const; | |
| for (const e of events) window.addEventListener(e, bump, { passive: true }); | |
| const tick = setInterval(() => { | |
| setIdle(document.hidden || Date.now() - last.current > thresholdMs); | |
| }, 5000); | |
| return () => { | |
| for (const e of events) window.removeEventListener(e, bump); | |
| clearInterval(tick); | |
| }; | |
| }, [thresholdMs]); | |
| return idle; | |
| } | |