{"version":3,"sources":["../../src/use-key-stroke/index.ts"],"sourcesContent":["import { useRef } from 'react'\nimport { useCreation } from '../use-creation'\nimport { useEventListener } from '../use-event-listener'\nimport { useStableFn } from '../use-stable-fn'\nimport { useTargetElement } from '../use-target-element'\nimport { isFunction, isObject, isString } from '../utils/basic'\n\nimport type { ElementTarget } from '../use-target-element'\nimport type { Noop } from '../utils/basic'\n\nexport type KeyPredicate = (event: KeyboardEvent) => boolean\nexport type KeyFilter = true | string | string[] | KeyPredicate\nexport type KeyStrokeEventName = 'keydown' | 'keypress' | 'keyup'\n\nexport interface UseKeyStrokeOptions {\n  /**\n   * The event name to listen for.\n   *\n   * @defaultValue 'keydown'\n   */\n  eventName?: KeyStrokeEventName\n  /**\n   * The target to add the event listener to.\n   *\n   * @defaultValue window\n   */\n  target?: ElementTarget | (() => Window) | (() => Document)\n  /**\n   * Set to `true` to use passive event listeners.\n   *\n   * @defaultValue false\n   */\n  passive?: boolean\n  /**\n   * Set to `true` to ignore repeated events when the key is being held down.\n   *\n   * @defaultValue false\n   */\n  dedupe?: boolean\n  /**\n   * Set to `true` to remove the event listener after the first event.\n   *\n   * @defaultValue false\n   */\n  once?: boolean\n}\n\nfunction createKeyPredicate(keyFilter?: KeyFilter): KeyPredicate {\n  switch (true) {\n    case isFunction(keyFilter):\n      return keyFilter\n    case isString(keyFilter):\n      return (event: KeyboardEvent) => event.key === keyFilter\n    case Array.isArray(keyFilter):\n      return (event: KeyboardEvent) => keyFilter.includes(event.key)\n    default:\n      return () => true\n  }\n}\n\nexport type UseKeyStrokeHandler = (event: KeyboardEvent) => void\n\n/**\n * A React Hook that helps to handle key strokes.\n */\nexport function useKeyStroke(key?: KeyFilter, handler?: UseKeyStrokeHandler, options?: UseKeyStrokeOptions): Noop\nexport function useKeyStroke(handler?: UseKeyStrokeHandler, options?: UseKeyStrokeOptions): Noop\nexport function useKeyStroke(...args: any[]) {\n  const key = useRef<KeyFilter>(undefined)\n  const handler = useRef<UseKeyStrokeHandler>(undefined)\n  const options = useRef<UseKeyStrokeOptions>(undefined)\n\n  if (args.length === 3) {\n    ;[key.current, handler.current, options.current] = args\n  } else if (args.length === 2) {\n    if (isObject(args[1])) {\n      key.current = true\n      ;[handler.current, options.current] = args\n    } else {\n      ;[key.current, handler.current] = args\n    }\n  } else {\n    key.current = true\n    handler.current = args[0]\n  }\n\n  options.current ??= {}\n\n  const predicate = useCreation(() => createKeyPredicate(key.current), [key.current])\n\n  const listener = useStableFn((e: KeyboardEvent) => {\n    if (e.repeat && (options.current?.dedupe ?? false)) return\n    predicate(e) && handler.current?.(e)\n  })\n\n  const { target = () => window, eventName = 'keydown', passive = false, once = false } = options.current\n\n  const el = useTargetElement(target)\n  const stop = useEventListener(el, eventName, listener, { passive, once })\n\n  return stop\n}\n"],"names":["useKeyStroke","createKeyPredicate","keyFilter","isFunction","isString","event","key","Array","isArray","includes","args","options","useRef","undefined","handler","length","current","isObject","predicate","useCreation","listener","useStableFn","e","repeat","dedupe","target","window","eventName","passive","once","el","useTargetElement","stop","useEventListener"],"mappings":";;;;+BAmEgBA;;;eAAAA;;;qBAnEO;2BACK;gCACK;2BACL;gCACK;qBACc;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA0C/C,SAASC,mBAAmBC,SAAqB;IAC/C,OAAQ;QACN,KAAKC,IAAAA,iBAAU,EAACD;YACd,OAAOA;QACT,KAAKE,IAAAA,eAAQ,EAACF;YACZ,OAAO,SAACG;uBAAyBA,MAAMC,GAAG,KAAKJ;;QACjD,KAAKK,MAAMC,OAAO,CAACN;YACjB,OAAO,SAACG;uBAAyBH,UAAUO,QAAQ,CAACJ,MAAMC,GAAG;;QAC/D;YACE,OAAO;uBAAM;;IACjB;AACF;AASO,SAASN;IAAa,IAAA,IAAA,OAAA,UAAA,QAAA,AAAGU,OAAH,UAAA,OAAA,OAAA,GAAA,OAAA,MAAA;QAAGA,KAAH,QAAA,SAAA,CAAA,KAAc;;QAmBzCC;IAlBA,IAAML,MAAMM,IAAAA,aAAM,EAAYC;IAC9B,IAAMC,UAAUF,IAAAA,aAAM,EAAsBC;IAC5C,IAAMF,UAAUC,IAAAA,aAAM,EAAsBC;IAE5C,IAAIH,KAAKK,MAAM,KAAK,GAAG;;+BAC8BL,UAAjDJ,IAAIU,OAAO,WAAEF,QAAQE,OAAO,WAAEL,QAAQK,OAAO;IACjD,OAAO,IAAIN,KAAKK,MAAM,KAAK,GAAG;QAC5B,IAAIE,IAAAA,eAAQ,EAACP,IAAI,CAAC,EAAE,GAAG;YACrBJ,IAAIU,OAAO,GAAG;;oCACwBN,UAApCI,QAAQE,OAAO,YAAEL,QAAQK,OAAO;QACpC,OAAO;;oCAC6BN,UAAhCJ,IAAIU,OAAO,YAAEF,QAAQE,OAAO;QAChC;IACF,OAAO;QACLV,IAAIU,OAAO,GAAG;QACdF,QAAQE,OAAO,GAAGN,IAAI,CAAC,EAAE;IAC3B;;IAEAC,aAAAA,WAAAA,SAAQK,sDAARL,SAAQK,UAAY,CAAC;IAErB,IAAME,YAAYC,IAAAA,wBAAW,EAAC;eAAMlB,mBAAmBK,IAAIU,OAAO;OAAG;QAACV,IAAIU,OAAO;KAAC;IAElF,IAAMI,WAAWC,IAAAA,wBAAW,EAAC,SAACC;YACXX,kBACDG;YADCH;QAAjB,IAAIW,EAAEC,MAAM,IAAKZ,CAAAA,CAAAA,2BAAAA,mBAAAA,QAAQK,OAAO,cAAfL,uCAAAA,iBAAiBa,MAAM,cAAvBb,qCAAAA,0BAA2B,KAAI,GAAI;QACpDO,UAAUI,QAAMR,mBAAAA,QAAQE,OAAO,cAAfF,uCAAAA,sBAAAA,SAAkBQ;IACpC;IAEA,IAAwFX,mBAAAA,QAAQK,OAAO,4BAAfL,iBAAhFc,QAAAA,8CAAS;eAAMC;8DAAiEf,iBAAzDgB,WAAAA,oDAAY,mEAA6ChB,iBAAlCiB,SAAAA,gDAAU,0DAAwBjB,iBAAjBkB,MAAAA,0CAAO;IAE9E,IAAMC,KAAKC,IAAAA,kCAAgB,EAACN;IAC5B,IAAMO,OAAOC,IAAAA,kCAAgB,EAACH,IAAIH,WAAWP,UAAU;QAAEQ,SAAAA;QAASC,MAAAA;IAAK;IAEvE,OAAOG;AACT"}