{"version":3,"sources":["../../../src/useInternationalPhoneInput/index.ts"],"names":[],"mappings":";AAEA,OAAO,cAAc;AA0CrB,IAAM,6BAA6B,CACjC,OACA,OACA,aACG;AACH,QAAM,OAAO,SAAoB,MAAM;AACrC,QAAI;AAEJ,WAAO;AAAA,MACL;AAAA,MACA;AAAA,MACA,CAAC,EAAE,QAAQ,YAAY,MAAM;AAC3B,YAAI,EAAE,OAAO,YAAY,eAAe,IAAI;AAE5C,cAAM,iBAAiB,KAAK,CAAC,EAAE;AAE/B,YACE,kBACC,YAA2B,aAAa,2BACzC,KAAK,KAAK,eAAe,cAAc,CAAC,GACxC;AACA,uBACE,WAAW,MAAM,GAAG,iBAAiB,CAAC,IACtC,WAAW,MAAM,gBAAgB;AAAA,QACrC;AAEA,cAAM,YAAY,MAAM,cAAc,YAAY,aAAa;AAE/D,cAAM,iBAAiB,UAAU;AAEjC,YAAI,kBAAkB,gBAAgB;AACpC,cAAI,iBAAiB,iBAAiB,UAAU,MAAM;AACpD,4BAAgB;AAAA,UAClB;AAEA,eAAK,CAAC,EAAE,SAAS;AAAA,QACnB;AAEA,YAAI,kBAAkB,WAAW,QAAQ;AACvC,cAAI,oBAAoB;AAExB,mBACM,IAAI,WACL,MAAM,GAAG,cAAe,EACxB,QAAQ,OAAO,EAAE,EAAE,QACtB,oBAAoB,eAAe,WAClC,KAAK,KAAK,eAAe,iBAAiB,CAAC,KAAK,MACjD,qBACA;AAAA,UAAC;AAEH,qBAAW,MAAM;AACf,YAAC,OAA4B;AAAA,cAC3B;AAAA,cACA;AAAA,YACF;AAAA,UACF,GAAG,CAAC;AAAA,QACN;AAAA,MACF;AAAA,MACA,CAAC,SAAS;AACR,cAAM,YAAY,KAAK,CAAC;AAExB,YAAI,QAAQ,UAAU,MAAM;AAC1B,0BAAgB;AAEhB,gBAAM,YAAY,MAAM;AAAA,YACtB,MAAM,eAAe,IAAI,KAAK;AAAA,YAC9B;AAAA,UACF;AAEA,cAAI,UAAU,kBAAkB,UAAU,gBAAgB;AACxD,iBAAK,CAAC,EAAE,SAAS;AAAA,UACnB;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF,CAAC;AAED,OAAK,CAAC,IAAI;AAEV,OAAK,CAAC,IAAI;AAEV,SAAO;AAAA,IACL,YAAY;AAAA,MACV,MAAM;AAAA,MACN,OAAO,MAAM;AAAA,MACb,SAAS,KAAK,CAAC;AAAA,IACjB;AAAA,IACA,YAAY,KAAK,CAAC;AAAA,EACpB;AACF;AAEA,IAAO,qCAAQ","sourcesContent":["import { DataTuple, PhoneNumberUtils, PhoneNumber } from '../types';\n\nimport useConst from 'react-helpful-utils/useConst';\nimport ISO2 from '../types/ISO2';\n\n/**\n * @example\n * ```jsx\n * import phoneNumberUtils from 'use-phone-input/phoneNumberUtils';\n * import useInternationalPhoneInput from 'use-phone-input/useInternationalPhoneInput';\n *\n * // use it if you want to have no prefix in formatted phone number\n * phoneNumberUtils.setPrefix('');\n *\n * const PhoneInput = () => {\n *   const [phone, setPhone] = useState(phoneNumberUtils.toPhoneNumber(''));\n *\n *   const { inputProps, setCountry } = useInternationalPhoneInput(\n *     phoneNumberUtils,\n *     phone,\n *     setPhone\n *   );\n *\n *   return (\n *     <div>\n *       <select\n *         value={phone.iso2}\n *         onChange={(e) => {\n *           setCountry(e.target.value);\n *         }}\n *       >\n *         <option value=\"\">-</option>\n *         {phoneNumberUtils.iso2List.map((iso2) => (\n *           <option key={iso2} value={iso2}>\n *             {iso2}\n *           </option>\n *         ))}\n *       </select>\n *       <input {...inputProps} />\n *     </div>\n *   );\n * };\n * ```\n */\nconst useInternationalPhoneInput = (\n  utils: PhoneNumberUtils,\n  value: PhoneNumber,\n  onChange: (value: PhoneNumber) => void\n) => {\n  const data = useConst<DataTuple>(() => {\n    let estimatedIso2: ISO2 | undefined;\n\n    return [\n      value,\n      onChange,\n      ({ target, nativeEvent }) => {\n        let { value: inputValue, selectionStart } = target as HTMLInputElement;\n\n        const prevInputValue = data[0].formattedValue;\n\n        if (\n          selectionStart &&\n          (nativeEvent as InputEvent).inputType == 'deleteContentBackward' &&\n          /\\D/.test(prevInputValue[selectionStart])\n        ) {\n          inputValue =\n            inputValue.slice(0, selectionStart - 1) +\n            inputValue.slice(selectionStart--);\n        }\n\n        const nextValue = utils.toPhoneNumber(inputValue, estimatedIso2);\n\n        const nextInputValue = nextValue.formattedValue;\n\n        if (prevInputValue != nextInputValue) {\n          if (estimatedIso2 && estimatedIso2 != nextValue.iso2) {\n            estimatedIso2 = undefined;\n          }\n\n          data[1](nextValue);\n        }\n\n        if (selectionStart != inputValue.length) {\n          let nextCaretPosition = 0;\n\n          for (\n            let i = inputValue\n              .slice(0, selectionStart!)\n              .replace(/\\D/g, '').length;\n            nextCaretPosition < nextInputValue.length &&\n            (/\\D/.test(nextInputValue[nextCaretPosition]) || i--);\n            nextCaretPosition++\n          ) {}\n\n          setTimeout(() => {\n            (target as HTMLInputElement).setSelectionRange(\n              nextCaretPosition,\n              nextCaretPosition\n            );\n          }, 0);\n        }\n      },\n      (iso2) => {\n        const prevValue = data[0];\n\n        if (iso2 != prevValue.iso2) {\n          estimatedIso2 = iso2;\n\n          const nextValue = utils.toPhoneNumber(\n            utils.getCountryCode(iso2) || '',\n            estimatedIso2\n          );\n\n          if (prevValue.formattedValue != nextValue.formattedValue) {\n            data[1](nextValue);\n          }\n        }\n      },\n    ];\n  });\n\n  data[0] = value;\n\n  data[1] = onChange;\n\n  return {\n    inputProps: {\n      type: 'tel' as const,\n      value: value.formattedValue,\n      onInput: data[2],\n    },\n    setCountry: data[3],\n  };\n};\n\nexport default useInternationalPhoneInput;\n"]}