/* * https://github.com/morethanwords/tweb * Copyright (C) 2019-2021 Eduard Kuzmenko * https://github.com/morethanwords/tweb/blob/master/LICENSE */ import placeCaretAtEnd from '../helpers/dom/placeCaretAtEnd'; import {formatPhoneNumber} from '../helpers/formatPhoneNumber'; import {IS_APPLE, IS_ANDROID, IS_APPLE_MOBILE} from '../environment/userAgent'; import {HelpCountry, HelpCountryCode} from '../layer'; import InputField, {InputFieldOptions} from './inputField'; export default class TelInputField extends InputField { private pasted = false; public lastValue = ''; constructor(options: InputFieldOptions & { onInput?: (formatted: ReturnType) => void } = {}) { super({ label: 'Contacts.PhoneNumber.Placeholder', // plainText: true, name: 'phone', ...options }); this.container.classList.add('input-field-phone'); const telEl = this.input; if(telEl instanceof HTMLInputElement) { telEl.type = 'tel'; telEl.autocomplete = 'rr55RandomRR55'; } else { telEl.inputMode = 'decimal'; const pixelRatio = window.devicePixelRatio; if(pixelRatio > 1) { let letterSpacing: number; if(IS_APPLE) { letterSpacing = pixelRatio * -.16; } else if(IS_ANDROID) { letterSpacing = 0; } telEl.style.setProperty('--letter-spacing', letterSpacing + 'px'); } const originalFunc = this.setValueSilently.bind(this); this.setValueSilently = (value) => { originalFunc(value); placeCaretAtEnd(this.input, true); }; } telEl.addEventListener('input', () => { // console.log('input', this.value); telEl.classList.remove('error'); const value = this.value; const diff = Math.abs(value.length - this.lastValue.length); if(diff > 1 && !this.pasted && IS_APPLE_MOBILE) { this.setValueSilently(this.lastValue + value); } this.pasted = false; this.setLabel(); let formattedPhoneNumber: ReturnType; let formatted: string, country: HelpCountry, countryCode: HelpCountryCode, leftPattern = ''; if(this.value.replace(/\++/, '+') === '+') { this.setValueSilently('+'); } else { formattedPhoneNumber = formatPhoneNumber(this.value); formatted = formattedPhoneNumber.formatted; country = formattedPhoneNumber.country; leftPattern = formattedPhoneNumber.leftPattern; countryCode = formattedPhoneNumber.code; this.setValueSilently(this.lastValue = formatted ? '+' + formatted : ''); } telEl.dataset.leftPattern = leftPattern/* .replace(/X/g, '0') */; // console.log(formatted, country); options.onInput && options.onInput(formattedPhoneNumber); }); telEl.addEventListener('paste', () => { this.pasted = true; // console.log('paste', telEl.value); }); /* telEl.addEventListener('change', (e) => { console.log('change', telEl.value); }); */ telEl.addEventListener('keypress', (e) => { // console.log('keypress', this.value); const key = e.key; if(/\D/.test(key) && !(e.metaKey || e.ctrlKey) && key !== 'Backspace' && !(key === '+' && e.shiftKey/* && !this.value */)) { e.preventDefault(); return false; } }); /* telEl.addEventListener('focus', function(this: typeof telEl, e) { this.removeAttribute('readonly'); // fix autocomplete });*/ } }