@lobehub/ui
Version:
Lobe UI is an open-source UI component library for building AIGC web apps
1 lines • 4.01 kB
Source Map (JSON)
{"version":3,"file":"useChromeIdle.mjs","names":[],"sources":["../../../src/Image/viewer/useChromeIdle.ts"],"sourcesContent":["'use client';\n\nimport { useCallback, useEffect, useRef, useState } from 'react';\n\nconst IDLE_HIDE_MS = 2000;\n\nexport interface UseChromeIdleResult {\n hidden: boolean;\n ref: (node: HTMLDivElement | null) => void;\n setHeld: (held: boolean) => void;\n}\n\nexport const useChromeIdle = (): UseChromeIdleResult => {\n const [hidden, setHidden] = useState(false);\n const nodeRef = useRef<HTMLDivElement | null>(null);\n const overChromeRef = useRef(false);\n const heldRef = useRef(false);\n const timerRef = useRef<number | null>(null);\n\n const clearTimer = useCallback(() => {\n if (timerRef.current === null) return;\n window.clearTimeout(timerRef.current);\n timerRef.current = null;\n }, []);\n\n const arm = useCallback(() => {\n clearTimer();\n timerRef.current = window.setTimeout(function fire() {\n timerRef.current = null;\n const node = nodeRef.current;\n const active = document.activeElement;\n const focusWithin = Boolean(node && active && node.contains(active));\n if (overChromeRef.current || heldRef.current || focusWithin) {\n timerRef.current = window.setTimeout(fire, IDLE_HIDE_MS);\n return;\n }\n setHidden(true);\n }, IDLE_HIDE_MS);\n }, [clearTimer]);\n\n const wake = useCallback(() => {\n setHidden(false);\n arm();\n }, [arm]);\n\n useEffect(() => {\n const handlePointerMove = (event: PointerEvent) => {\n overChromeRef.current = Boolean(\n event.target instanceof Node && nodeRef.current?.contains(event.target),\n );\n wake();\n };\n const handleActivity = () => wake();\n\n document.addEventListener('pointermove', handlePointerMove);\n document.addEventListener('pointerdown', handleActivity);\n document.addEventListener('wheel', handleActivity, { passive: true });\n document.addEventListener('keydown', handleActivity);\n arm();\n\n return () => {\n document.removeEventListener('pointermove', handlePointerMove);\n document.removeEventListener('pointerdown', handleActivity);\n document.removeEventListener('wheel', handleActivity);\n document.removeEventListener('keydown', handleActivity);\n clearTimer();\n };\n }, [arm, clearTimer, wake]);\n\n const setHeld = useCallback(\n (held: boolean) => {\n heldRef.current = held;\n if (held) wake();\n },\n [wake],\n );\n\n const ref = useCallback((node: HTMLDivElement | null) => {\n nodeRef.current = node;\n }, []);\n\n return { hidden, ref, setHeld };\n};\n"],"mappings":";;;AAIA,MAAM,eAAe;AAQrB,MAAa,sBAA2C;CACtD,MAAM,CAAC,QAAQ,aAAa,SAAS,KAAK;CAC1C,MAAM,UAAU,OAA8B,IAAI;CAClD,MAAM,gBAAgB,OAAO,KAAK;CAClC,MAAM,UAAU,OAAO,KAAK;CAC5B,MAAM,WAAW,OAAsB,IAAI;CAE3C,MAAM,aAAa,kBAAkB;EACnC,IAAI,SAAS,YAAY,MAAM;EAC/B,OAAO,aAAa,SAAS,OAAO;EACpC,SAAS,UAAU;CACrB,GAAG,CAAC,CAAC;CAEL,MAAM,MAAM,kBAAkB;EAC5B,WAAW;EACX,SAAS,UAAU,OAAO,WAAW,SAAS,OAAO;GACnD,SAAS,UAAU;GACnB,MAAM,OAAO,QAAQ;GACrB,MAAM,SAAS,SAAS;GACxB,MAAM,cAAc,QAAQ,QAAQ,UAAU,KAAK,SAAS,MAAM,CAAC;GACnE,IAAI,cAAc,WAAW,QAAQ,WAAW,aAAa;IAC3D,SAAS,UAAU,OAAO,WAAW,MAAM,YAAY;IACvD;GACF;GACA,UAAU,IAAI;EAChB,GAAG,YAAY;CACjB,GAAG,CAAC,UAAU,CAAC;CAEf,MAAM,OAAO,kBAAkB;EAC7B,UAAU,KAAK;EACf,IAAI;CACN,GAAG,CAAC,GAAG,CAAC;CAER,gBAAgB;EACd,MAAM,qBAAqB,UAAwB;GACjD,cAAc,UAAU,QACtB,MAAM,kBAAkB,QAAQ,QAAQ,SAAS,SAAS,MAAM,MAAM,CACxE;GACA,KAAK;EACP;EACA,MAAM,uBAAuB,KAAK;EAElC,SAAS,iBAAiB,eAAe,iBAAiB;EAC1D,SAAS,iBAAiB,eAAe,cAAc;EACvD,SAAS,iBAAiB,SAAS,gBAAgB,EAAE,SAAS,KAAK,CAAC;EACpE,SAAS,iBAAiB,WAAW,cAAc;EACnD,IAAI;EAEJ,aAAa;GACX,SAAS,oBAAoB,eAAe,iBAAiB;GAC7D,SAAS,oBAAoB,eAAe,cAAc;GAC1D,SAAS,oBAAoB,SAAS,cAAc;GACpD,SAAS,oBAAoB,WAAW,cAAc;GACtD,WAAW;EACb;CACF,GAAG;EAAC;EAAK;EAAY;CAAI,CAAC;CAE1B,MAAM,UAAU,aACb,SAAkB;EACjB,QAAQ,UAAU;EAClB,IAAI,MAAM,KAAK;CACjB,GACA,CAAC,IAAI,CACP;CAMA,OAAO;EAAE;EAAQ,KAJL,aAAa,SAAgC;GACvD,QAAQ,UAAU;EACpB,GAAG,CAAC,CAEe;EAAG;CAAQ;AAChC"}