{"version":3,"file":"useCursor.cjs","sources":["../../../../../../../packages/components/input-number/src/hooks/useCursor.ts"],"sourcesContent":["import type { Ref } from 'vue';\nimport { warning } from '@antdv/utils';\nimport { ref } from 'vue';\n\n/**\n * Keep input cursor in the correct position if possible.\n * Is this necessary since we have `formatter` which may mass the content?\n */\nexport default function useCursor(\n  inputRef: Ref<HTMLInputElement>,\n  focused: Ref<boolean>,\n): [() => void, () => void] {\n  const selectionRef = ref<{\n    start?: number\n    end?: number\n    value?: string\n    beforeTxt?: string\n    afterTxt?: string\n  }>(null);\n\n  function recordCursor() {\n    // Record position\n    try {\n      const { selectionStart: start, selectionEnd: end, value } = inputRef.value;\n      const beforeTxt = value.substring(0, start);\n      const afterTxt = value.substring(end);\n\n      selectionRef.value = {\n        start,\n        end,\n        value,\n        beforeTxt,\n        afterTxt,\n      };\n    } catch (e) {\n      // Fix error in Chrome:\n      // Failed to read the 'selectionStart' property from 'HTMLInputElement'\n      // http://stackoverflow.com/q/21177489/3040605\n    }\n  }\n\n  /**\n   * Restore logic:\n   *  1. back string same\n   *  2. start string same\n   */\n  function restoreCursor() {\n    if (inputRef.value && selectionRef.value && focused.value) {\n      try {\n        const { value } = inputRef.value;\n        const { beforeTxt, afterTxt, start } = selectionRef.value;\n\n        let startPos = value.length;\n\n        if (value.endsWith(afterTxt)) {\n          startPos = value.length - selectionRef.value.afterTxt.length;\n        } else if (value.startsWith(beforeTxt)) {\n          startPos = beforeTxt.length;\n        } else {\n          const beforeLastChar = beforeTxt[start - 1];\n          const newIndex = value.indexOf(beforeLastChar, start - 1);\n          if (newIndex !== -1)\n            startPos = newIndex + 1;\n        }\n\n        inputRef.value.setSelectionRange(startPos, startPos);\n      } catch (e) {\n        warning(\n          false,\n          `Something warning of cursor restore. Please fire issue about this: ${e.message}`,\n        );\n      }\n    }\n  }\n\n  return [recordCursor, restoreCursor];\n}\n"],"names":["ref","warning"],"mappings":";;;;;;;;AAQwB,SAAA,SAAA,CACtB,UACA,OAC0B,EAAA;AAC1B,EAAM,MAAA,YAAA,GAAeA,QAMlB,IAAI,CAAA,CAAA;AAEP,EAAA,SAAS,YAAe,GAAA;AAEtB,IAAI,IAAA;AACF,MAAA,MAAM,EAAE,cAAgB,EAAA,KAAA,EAAO,cAAc,GAAK,EAAA,KAAA,KAAU,QAAS,CAAA,KAAA,CAAA;AACrE,MAAA,MAAM,SAAY,GAAA,KAAA,CAAM,SAAU,CAAA,CAAA,EAAG,KAAK,CAAA,CAAA;AAC1C,MAAM,MAAA,QAAA,GAAW,KAAM,CAAA,SAAA,CAAU,GAAG,CAAA,CAAA;AAEpC,MAAA,YAAA,CAAa,KAAQ,GAAA;AAAA,QACnB,KAAA;AAAA,QACA,GAAA;AAAA,QACA,KAAA;AAAA,QACA,SAAA;AAAA,QACA,QAAA;AAAA,OACF,CAAA;AAAA,aACO,CAAG,EAAA;AAAA,KAIZ;AAAA,GACF;AAOA,EAAA,SAAS,aAAgB,GAAA;AACvB,IAAA,IAAI,QAAS,CAAA,KAAA,IAAS,YAAa,CAAA,KAAA,IAAS,QAAQ,KAAO,EAAA;AACzD,MAAI,IAAA;AACF,QAAM,MAAA,EAAE,KAAM,EAAA,GAAI,QAAS,CAAA,KAAA,CAAA;AAC3B,QAAA,MAAM,EAAE,SAAA,EAAW,QAAU,EAAA,KAAA,KAAU,YAAa,CAAA,KAAA,CAAA;AAEpD,QAAA,IAAI,WAAW,KAAM,CAAA,MAAA,CAAA;AAErB,QAAI,IAAA,KAAA,CAAM,QAAS,CAAA,QAAQ,CAAG,EAAA;AAC5B,UAAA,QAAA,GAAW,KAAM,CAAA,MAAA,GAAS,YAAa,CAAA,KAAA,CAAM,QAAS,CAAA,MAAA,CAAA;AAAA,SAC7C,MAAA,IAAA,KAAA,CAAM,UAAW,CAAA,SAAS,CAAG,EAAA;AACtC,UAAA,QAAA,GAAW,SAAU,CAAA,MAAA,CAAA;AAAA,SAChB,MAAA;AACL,UAAM,MAAA,cAAA,GAAiB,SAAU,CAAA,KAAA,GAAQ,CAAC,CAAA,CAAA;AAC1C,UAAA,MAAM,QAAW,GAAA,KAAA,CAAM,OAAQ,CAAA,cAAA,EAAgB,QAAQ,CAAC,CAAA,CAAA;AACxD,UAAA,IAAI,QAAa,KAAA,CAAA,CAAA;AACf,YAAA,QAAA,GAAW,QAAW,GAAA,CAAA,CAAA;AAAA,SAC1B;AAEA,QAAS,QAAA,CAAA,KAAA,CAAM,iBAAkB,CAAA,QAAA,EAAU,QAAQ,CAAA,CAAA;AAAA,eAC5C,CAAG,EAAA;AACV,QAAAC,WAAA;AAAA,UACE,KAAA;AAAA,UACA,CAAA,mEAAA,EAAsE,EAAE,OAAO,CAAA,CAAA;AAAA,SACjF,CAAA;AAAA,OACF;AAAA,KACF;AAAA,GACF;AAEA,EAAO,OAAA,CAAC,cAAc,aAAa,CAAA,CAAA;AACrC;;;;"}