UNPKG

@modern-kit/react

Version:
1 lines 3.4 kB
{"version":3,"file":"index.mjs","sources":["../../../src/hooks/useIdle/index.ts"],"sourcesContent":["import { useState } from 'react';\nimport { useEventListener } from '../useEventListener';\nimport { useTimeout } from '../useTimeout';\nimport { useVisibilityChange } from '../useVisibilityChange';\nimport { useThrottle } from '../useThrottle';\n\ninterface UseIdleProps {\n timeout: number;\n onIdle?: () => void;\n onActive?: () => void;\n}\n\n/**\n * @description 사용자의 `비활성(idle)` 상태를 감지하는 훅입니다.\n *\n * 지정된 시간 동안 사용자 활동이 없으면 `idle` 상태로 판단하며, 마우스 움직임, 키보드 입력, 터치 이벤트 등 사용자 활동을 감지합니다.\n * 페이지 visibility 변경도 감지하여 탭이 다시 활성화되면 `active` 상태로 전환됩니다.\n *\n * 모든 이벤트는 `500ms`로 스로틀링되어 불필요한 이벤트 호출을 방지합니다.\n *\n * @param {UseIdleProps} props - idle 감지 설정을 위한 객체입니다.\n * @param {number} props.timeout - 비활성 상태로 간주되기까지의 시간(밀리초)\n * @param {() => void} [props.onIdle] - idle 상태 진입 시 콜백\n * @param {() => void} [props.onActive] - active 상태 진입 시 콜백\n *\n * @returns {boolean} 현재 사용자가 idle 상태인지 여부를 반환합니다.\n *\n * @example\n * const isIdle = useIdle({\n * timeout: 5000, // 5초\n * onIdle: () => console.log('사용자가 비활성 상태입니다'),\n * onActive: () => console.log('사용자가 활성 상태입니다')\n * });\n */\nexport function useIdle({ timeout, onIdle, onActive }: UseIdleProps): boolean {\n const [isIdle, setIsIdle] = useState(false);\n\n const { reset: resetTimer } = useTimeout(() => {\n setIsIdle(true);\n onIdle?.();\n }, timeout);\n\n const handleActive = useThrottle(\n () => {\n if (isIdle) {\n setIsIdle(false);\n onActive?.();\n }\n resetTimer();\n },\n 500,\n { trailing: false }\n );\n\n const windowElement = typeof window !== 'undefined' ? window : null;\n\n useEventListener(windowElement, 'pointermove', handleActive);\n useEventListener(windowElement, 'pointerdown', handleActive);\n useEventListener(windowElement, 'resize', handleActive);\n useEventListener(windowElement, 'keydown', handleActive);\n useEventListener(windowElement, 'wheel', handleActive);\n useVisibilityChange({ onShow: handleActive });\n\n return isIdle;\n}\n"],"names":[],"mappings":";;;;;;;;;;AAkCO,SAAS,OAAA,CAAQ,EAAE,OAAA,EAAS,MAAA,EAAQ,UAAS,EAA0B;AAC5E,EAAA,MAAM,CAAC,MAAA,EAAQ,SAAS,CAAA,GAAI,SAAS,KAAK,CAAA;AAE1C,EAAA,MAAM,EAAE,KAAA,EAAO,UAAA,EAAW,GAAI,WAAW,MAAM;AAC7C,IAAA,SAAA,CAAU,IAAI,CAAA;AACd,IAAA,MAAA,IAAS;AAAA,EACX,GAAG,OAAO,CAAA;AAEV,EAAA,MAAM,YAAA,GAAe,WAAA;AAAA,IACnB,MAAM;AACJ,MAAA,IAAI,MAAA,EAAQ;AACV,QAAA,SAAA,CAAU,KAAK,CAAA;AACf,QAAA,QAAA,IAAW;AAAA,MACb;AACA,MAAA,UAAA,EAAW;AAAA,IACb,CAAA;AAAA,IACA,GAAA;AAAA,IACA,EAAE,UAAU,KAAA;AAAM,GACpB;AAEA,EAAA,MAAM,aAAA,GAAgB,OAAO,MAAA,KAAW,WAAA,GAAc,MAAA,GAAS,IAAA;AAE/D,EAAA,gBAAA,CAAiB,aAAA,EAAe,eAAe,YAAY,CAAA;AAC3D,EAAA,gBAAA,CAAiB,aAAA,EAAe,eAAe,YAAY,CAAA;AAC3D,EAAA,gBAAA,CAAiB,aAAA,EAAe,UAAU,YAAY,CAAA;AACtD,EAAA,gBAAA,CAAiB,aAAA,EAAe,WAAW,YAAY,CAAA;AACvD,EAAA,gBAAA,CAAiB,aAAA,EAAe,SAAS,YAAY,CAAA;AACrD,EAAA,mBAAA,CAAoB,EAAE,MAAA,EAAQ,YAAA,EAAc,CAAA;AAE5C,EAAA,OAAO,MAAA;AACT;;;;"}