{"version":3,"file":"useKeyboardActionLockerWhileComposing.mjs","sources":["../../../src/hooks/useKeyboardActionLockerWhileComposing.ts"],"sourcesContent":["import type React from 'react'\nimport { useCallback, useRef } from 'react'\n\nexport const COMMON_IME_CONTROL_KEYS = [\n  'Enter',\n  'Escape',\n  'Tab',\n  ' ',\n  'ArrowUp',\n  'ArrowDown',\n  'ArrowLeft',\n  'ArrowRight',\n]\n\ntype HandlerCache<TargetElement extends HTMLElement = HTMLInputElement> = Map<\n  React.KeyboardEventHandler<TargetElement>,\n  React.KeyboardEventHandler<TargetElement>\n>\ninterface UseKeyboardActionLockerWhileComposingProps<\n  TargetElement extends HTMLElement = HTMLInputElement,\n> {\n  keysToLock?: string[]\n  onKeyDown?: React.KeyboardEventHandler<TargetElement>\n  onKeyUp?: React.KeyboardEventHandler<TargetElement>\n}\n\nconst isSafari = () =>\n  window.navigator.userAgent.search('Safari') >= 0 &&\n  window.navigator.userAgent.search('Chrome') < 0\n\nexport function useKeyboardActionLockerWhileComposing<\n  TargetElement extends HTMLElement = HTMLInputElement,\n>({\n  keysToLock,\n  onKeyDown,\n  onKeyUp,\n}: UseKeyboardActionLockerWhileComposingProps<TargetElement>) {\n  const handlerCache = useRef<HandlerCache<TargetElement>>(new Map())\n\n  const wrapHandler = useCallback(\n    (handler?: React.KeyboardEventHandler<TargetElement>) => {\n      if (!handler) {\n        return undefined\n      }\n      if (handlerCache.current.has(handler)) {\n        return handlerCache.current.get(handler)\n      }\n\n      const wrappedHandler = (event: React.KeyboardEvent<TargetElement>) => {\n        // NOTE: If keysToLock is not provided, lock all keys.\n        const isKeyLocked =\n          event.nativeEvent.isComposing &&\n          (!keysToLock ||\n            keysToLock.some((controlKey) => event.key === controlKey))\n        /**\n         * NOTE\n         * According to the spec(https://www.w3.org/TR/uievents/#events-composition-key-events),\n         * keyDown event that exit composition should be fired before compositionEnd event.\n         * However, Safari has different behavior.\n         * In Safari, keyDown event that exit composition is fired after compositionEnd event.\n         * So, we need to prevent keyDown event that exit composition in Safari.\n         * Browser fires keydown event with keyCode 229 when user is composing.\n         * An event that exits composition is also fired with keyCode 229, even though it has fired after compositionEnd event.\n         * Therefore, we need to check if the event is fired with keyCode 229 in Safari.\n         */\n        const isSafariKeydownWhileComposing =\n          isSafari() && event.type === 'keydown' && event.keyCode === 229\n\n        if (isKeyLocked || isSafariKeydownWhileComposing) {\n          event.stopPropagation()\n          return\n        }\n        handler?.(event)\n      }\n\n      handlerCache.current.set(handler, wrappedHandler)\n      return wrappedHandler\n    },\n    [keysToLock]\n  )\n\n  return {\n    handleKeyDown: wrapHandler(onKeyDown),\n    handleKeyUp: wrapHandler(onKeyUp),\n  }\n}\n"],"names":["COMMON_IME_CONTROL_KEYS","isSafari","window","navigator","userAgent","search","useKeyboardActionLockerWhileComposing","keysToLock","onKeyDown","onKeyUp","handlerCache","useRef","Map","wrapHandler","useCallback","handler","undefined","current","has","get","wrappedHandler","event","isKeyLocked","nativeEvent","isComposing","some","controlKey","key","isSafariKeydownWhileComposing","type","keyCode","stopPropagation","set","handleKeyDown","handleKeyUp"],"mappings":";;MAGaA,uBAAuB,GAAG,CACrC,OAAO,EACP,QAAQ,EACR,KAAK,EACL,GAAG,EACH,SAAS,EACT,WAAW,EACX,WAAW,EACX,YAAY;AAed,MAAMC,QAAQ,GAAGA,MACfC,MAAM,CAACC,SAAS,CAACC,SAAS,CAACC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,IAChDH,MAAM,CAACC,SAAS,CAACC,SAAS,CAACC,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC;AAE1C,SAASC,qCAAqCA,CAEnD;EACAC,UAAU;EACVC,SAAS;AACTC,EAAAA;AACyD,CAAC,EAAE;EAC5D,MAAMC,YAAY,GAAGC,MAAM,CAA8B,IAAIC,GAAG,EAAE,CAAC;AAEnE,EAAA,MAAMC,WAAW,GAAGC,WAAW,CAC5BC,OAAmD,IAAK;IACvD,IAAI,CAACA,OAAO,EAAE;AACZ,MAAA,OAAOC,SAAS;AAClB;IACA,IAAIN,YAAY,CAACO,OAAO,CAACC,GAAG,CAACH,OAAO,CAAC,EAAE;AACrC,MAAA,OAAOL,YAAY,CAACO,OAAO,CAACE,GAAG,CAACJ,OAAO,CAAC;AAC1C;IAEA,MAAMK,cAAc,GAAIC,KAAyC,IAAK;AACpE;MACA,MAAMC,WAAW,GACfD,KAAK,CAACE,WAAW,CAACC,WAAW,KAC5B,CAACjB,UAAU,IACVA,UAAU,CAACkB,IAAI,CAAEC,UAAU,IAAKL,KAAK,CAACM,GAAG,KAAKD,UAAU,CAAC,CAAC;AAC9D;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACQ,MAAA,MAAME,6BAA6B,GACjC3B,QAAQ,EAAE,IAAIoB,KAAK,CAACQ,IAAI,KAAK,SAAS,IAAIR,KAAK,CAACS,OAAO,KAAK,GAAG;MAEjE,IAAIR,WAAW,IAAIM,6BAA6B,EAAE;QAChDP,KAAK,CAACU,eAAe,EAAE;AACvB,QAAA;AACF;AACAhB,MAAAA,OAAO,aAAPA,OAAO,KAAA,KAAA,CAAA,IAAPA,OAAO,CAAGM,KAAK,CAAC;KACjB;IAEDX,YAAY,CAACO,OAAO,CAACe,GAAG,CAACjB,OAAO,EAAEK,cAAc,CAAC;AACjD,IAAA,OAAOA,cAAc;AACvB,GAAC,EACD,CAACb,UAAU,CACb,CAAC;EAED,OAAO;AACL0B,IAAAA,aAAa,EAAEpB,WAAW,CAACL,SAAS,CAAC;IACrC0B,WAAW,EAAErB,WAAW,CAACJ,OAAO;GACjC;AACH;;;;"}