{"version":3,"file":"index.cjs","names":["usePreservedCallback"],"sources":["../../../src/hooks/useKeyDown/index.ts"],"sourcesContent":["import { usePreservedCallback } from '../usePreservedCallback';\nimport React, { useEffect, useRef } from 'react';\nimport { KeyDownCallbackMap } from './useKeyDown.utils';\nimport { isFunction } from '@modern-kit/utils';\n\ninterface UseKeyDownProps {\n  enabled?: boolean;\n  keyDownCallbackMap?: Partial<KeyDownCallbackMap>;\n  allKeyDownCallback?: (event: KeyboardEvent) => void;\n}\n\n/**\n * @description 특정 요소에 keydown 이벤트 리스너를 추가하고, 설정된 키보드 이벤트 콜백 함수를 호출하는 기능을 제공합니다.\n * `enabled`가 `true`일 때 이벤트가 활성화되며, `targetRef`가 할당되지 않은 경우 window 객체에 이벤트가 바인딩됩니다.\n *\n * @template T\n * @param {UseKeyDownProps} props - 옵션 객체입니다.\n * - `enabled`: 키보드 이벤트 리스너를 활성화할지 여부를 결정합니다. `true`일 경우 이벤트 리스너가 추가됩니다. 기본값은 `true` 입니다.\n * - `keyDownCallbackMap`: 특정 키와 해당 키가 눌렸을 때 호출될 콜백 함수들을 매핑한 객체입니다. 예를 들어, `{ 'Enter': handleEnterKey }`와 같이 설정할 수 있습니다.\n * - `allKeyDownCallback`: 모든 키가 눌렸을 때 호출될 공통 콜백 함수입니다. 이 함수가 설정되면 `keyDownCallbackMap`보다 우선 호출됩니다.\n *\n * @returns {React.RefObject<T | Window>} 키보드 이벤트 리스너가 부착된 요소의 참조 객체(Ref)를 반환합니다.\n *\n *  * @example\n * // window에 이벤트 바인딩\n * useKeyDown<HTMLInputElement>({\n *   enabled: true,\n *   keyDownCallbackMap: {\n *     Enter: (event) => console.log('Enter', event),\n *     Escape: (event) => console.log('Escape', event),\n *     ' ': (event) => console.log('Space', event),\n *   },\n * });\n *\n * @example\n * ```tsx\n * // 특정 요소에 이벤트 바인딩\n * const { ref: inputRef } = useKeyDown<HTMLInputElement>({\n *   enabled: true,\n *   keyDownCallbackMap: {\n *     Enter: (event) => console.log('Enter', event),\n *     Escape: (event) => console.log('Escape', event),\n *     ' ': (event) => console.log('Space', event),\n *   },\n * });\n *\n * <input ref={inputRef} type=\"text\" />;\n * ```\n */\nexport function useKeyDown({\n  enabled,\n  keyDownCallbackMap,\n  allKeyDownCallback,\n}: UseKeyDownProps): { ref: React.RefObject<Window | null> };\n\nexport function useKeyDown<T extends HTMLElement>({\n  enabled,\n  keyDownCallbackMap,\n  allKeyDownCallback,\n}: UseKeyDownProps): { ref: React.RefObject<T | null> };\n\nexport function useKeyDown<T extends HTMLElement>({\n  enabled = true,\n  keyDownCallbackMap = {},\n  allKeyDownCallback,\n}: UseKeyDownProps): { ref: React.RefObject<Window | T | null> } {\n  const targetRef = useRef<T | null | Window>(null);\n\n  const onKeyDown = usePreservedCallback((event: KeyboardEvent) => {\n    event.stopPropagation();\n\n    if (allKeyDownCallback) {\n      allKeyDownCallback(event);\n      return;\n    }\n\n    const key = event.key as keyof KeyDownCallbackMap;\n\n    const keyDownCallback = keyDownCallbackMap[key];\n\n    if (isFunction(keyDownCallback)) {\n      keyDownCallback(event);\n    }\n  });\n\n  useEffect(() => {\n    if (!enabled) return;\n    if (!targetRef.current) {\n      targetRef.current = window;\n    }\n\n    const targetElement = targetRef.current;\n\n    targetElement.addEventListener(\n      'keydown',\n      onKeyDown as EventListenerOrEventListenerObject\n    );\n\n    return () =>\n      targetElement.removeEventListener(\n        'keydown',\n        onKeyDown as EventListenerOrEventListenerObject\n      );\n  }, [enabled, onKeyDown]);\n\n  return { ref: targetRef };\n}\n"],"mappings":";;;;;AA6DA,SAAgB,WAAkC,EAChD,UAAU,MACV,qBAAqB,EAAE,EACvB,sBAC+D;CAC/D,MAAM,aAAA,GAAA,MAAA,QAAsC,KAAK;CAEjD,MAAM,YAAYA,cAAAA,sBAAsB,UAAyB;EAC/D,MAAM,iBAAiB;EAEvB,IAAI,oBAAoB;GACtB,mBAAmB,MAAM;GACzB;;EAKF,MAAM,kBAAkB,mBAFZ,MAAM;EAIlB,KAAA,GAAA,kBAAA,YAAe,gBAAgB,EAC7B,gBAAgB,MAAM;GAExB;CAEF,CAAA,GAAA,MAAA,iBAAgB;EACd,IAAI,CAAC,SAAS;EACd,IAAI,CAAC,UAAU,SACb,UAAU,UAAU;EAGtB,MAAM,gBAAgB,UAAU;EAEhC,cAAc,iBACZ,WACA,UACD;EAED,aACE,cAAc,oBACZ,WACA,UACD;IACF,CAAC,SAAS,UAAU,CAAC;CAExB,OAAO,EAAE,KAAK,WAAW"}