wts-otp
Version:
An Angular library that simplifies the integration of OTP (One-Time Password) input fields into your Angular applications. This library offers customizable and secure OTP input components to enhance user authentication experiences.
1 lines • 16.3 kB
Source Map (JSON)
{"version":3,"file":"wts-otp.mjs","sources":["../../../projects/wts-otp/src/lib/wts-otp.component.ts","../../../projects/wts-otp/src/lib/wts-otp.component.html","../../../projects/wts-otp/src/public-api.ts","../../../projects/wts-otp/src/wts-otp.ts"],"sourcesContent":["import { Component, ElementRef, afterNextRender, computed, effect, forwardRef, input, output, viewChild } from '@angular/core';\nimport { IOptions } from './type';\nimport { NgStyle } from '@angular/common';\nimport { NG_VALUE_ACCESSOR } from '@angular/forms';\n\nexport class Options {\n digits: number = 4\n placeholder: string = '' //'●' // '★', '-'\n type: 'text' | 'number' = 'number';\n visibleAs: \"text\" | \"password\" = 'text'\n borderOn: 'top' | 'bottom' | 'left' | 'right' | 'all-side' = 'all-side'\n autofocus: boolean = true\n\n constructor(data?: any) {\n if (!data) return;\n Object.keys(data).forEach((key: string) => {\n typeof (data[key]) !== 'undefined' && ((this as any)[key] = data[key]);\n })\n }\n}\n\n\n@Component({\n selector: 'wts-otp, [wts-otp]',\n // imports: [NgStyle],\n templateUrl: './wts-otp.component.html',\n styleUrl: './wts-otp.component.scss',\n providers: [\n {\n provide: NG_VALUE_ACCESSOR,\n useExisting: forwardRef(() => WtsOtpComponent), // replace name as appropriate\n multi: true\n }\n ]\n})\nexport class WtsOtpComponent {\n\n options = input<IOptions>(new Options());\n showError = input<boolean>(false);\n value = input<string>('');\n valueChange = output<string>()\n getValue = output<any>()\n protected OTP: string = '';\n protected config = computed(() => new Options(this.options()));\n private OTPMaster = viewChild<ElementRef>('OTPMaster')\n protected OPTARRAY: Array<string | number> = [];\n constructor() {\n\n\n afterNextRender(() => {\n const value = this.value();\n const _inputs = this.OTPMaster();\n if (value && _inputs) {\n const allvalue = value.split(\"\").slice(0, this.config().digits)\n const otp: HTMLElement = _inputs.nativeElement, inputs = otp.querySelectorAll('input');\n for (let i = 0; i < allvalue.length; i++) {\n const value = allvalue[i];\n setTimeout(() => { inputs.item(i).value = value }, 0);\n }\n }\n })\n }\n\n\n\n\n protected _keyPress(e: KeyboardEvent, index: number) {\n const config = this.config();\n\n const _inputs = this.OTPMaster();\n if (_inputs) {\n\n let otp = _inputs.nativeElement, inputs = otp.querySelectorAll('input');\n if (e.key === 'ArrowLeft') {\n index > 0 && setTimeout(() => { inputs.item(index - 1).focus() }, 0);\n }\n if (e.key === 'ArrowRight') {\n inputs.item(index + 1) && setTimeout(() => { inputs.item(index + 1).focus() }, 0)\n }\n if (e.key === 'ArrowDown' || e.key === 'ArrowUp') {\n\n inputs.item(index + 1) && setTimeout(() => { inputs.item(index + 1).focus() }, 0)\n }\n if (e.key === 'Backspace') {\n inputs.item(index).value = '';\n delete this.OPTARRAY[index];\n this.emitValue();\n index > 0 && setTimeout(() => { inputs.item(index - 1).focus() }, 0);\n }\n }\n\n if (config.type === 'number') {\n return e.key >= '0' && e.key <= '9'\n } else {\n return true\n }\n\n }\n\n\n public reset(): void {\n const _inputs = this.OTPMaster();\n if (_inputs) {\n const otp: HTMLElement = _inputs.nativeElement, inputs = otp.querySelectorAll('input');\n inputs.forEach((item) => {\n item.value = ''\n })\n }\n }\n\n public focus(index: number = 0): void {\n if (!this.config().autofocus) return\n const _inputs = this.OTPMaster();\n if (_inputs) {\n const otp = _inputs.nativeElement;\n const inputs = otp.querySelectorAll('input');\n index < inputs.length ? inputs.item(index).focus() : console.error('Invalid index number!');\n }\n }\n\n protected onFocus(e: FocusEvent, index: number) {\n const value = (<HTMLInputElement>e.target).value;\n value && (<HTMLInputElement>e.target).select();\n }\n\n protected onInputChange(e: Event, index: number): void {\n const config = this.config();\n (config.digits - 1 > index) && this.focusItem(index + 1);\n this.emitValue();\n }\n\n private emitValue(): void {\n const _inputs = this.OTPMaster();\n if (_inputs) {\n const value: Array<number | string> = [];\n const otp: HTMLElement = _inputs.nativeElement;\n const inputs = otp.querySelectorAll('input');\n inputs.forEach(element => {\n value.push(element.value);\n })\n if (value.length) {\n setTimeout(() => {\n const _value = value.join(',').replaceAll(',', '');\n this.valueChange.emit(_value);\n this.getValue.emit(_value);\n }, this.config().digits * 50);\n }\n }\n }\n\n private focusItem(index: number): void {\n const _inputs = this.OTPMaster();\n if (_inputs) {\n const otp: HTMLElement = _inputs.nativeElement, inputs = otp.querySelectorAll('input');\n inputs.item(index).focus();\n\n }\n }\n\n protected onChange(e: InputEvent | Event, index: number) {\n const config = this.config();\n const target = e.target as HTMLInputElement;\n target.value = target.value.slice(-1)\n if (target.value) {\n this.OPTARRAY[index] = target.value;\n setTimeout(() => {\n index < (config.digits - 1) && this.focusItem(index + 1);\n // index >= (config.digits - 1) && this.focusItem(index - 1);\n }, 10);\n this.emitValue();\n // (config.digits - 1 > index) && this.focusItem(index + 1);\n // index && (index <= config.digits) && this.focusItem(index - 1);\n }\n\n }\n\n\n protected onPaste(e: ClipboardEvent, index: number) {\n const _inputs = this.OTPMaster();\n if (!e.clipboardData || !_inputs) return;\n let otp: HTMLInputElement = _inputs.nativeElement, inputs = otp.querySelectorAll('input'), value: number | string = e.clipboardData.getData('Text');\n let isValid = true;\n const target = e.target as HTMLInputElement;\n if (this.config().type === 'number') {\n value = parseFloat(value)\n isValid = typeof (value) === 'number'\n if (isNaN(value)) {\n throw new Error('Invalid OTP')\n }\n }\n value = value.toString();\n if (value && isValid) {\n const allvalue = value.slice(0, this.config().digits);\n console.log(allvalue);\n\n for (let i = 0; i < allvalue.length; i++) {\n const _value = allvalue[i];\n inputs.item(i).value = _value;\n this.OPTARRAY[i] = _value;\n setTimeout(() => { inputs.item(i).value = _value }, 0);\n }\n } else {\n target.value = '';\n }\n }\n\n protected onKeyUp(e: KeyboardEvent, index: number): void {\n\n // const _inputs = this.OTPMaster();\n // if (_inputs) {\n\n // let otp = _inputs.nativeElement, inputs = otp.querySelectorAll('input');\n // if (e.key === 'ArrowLeft') {\n // index > 0 && setTimeout(() => { inputs.item(index - 1).focus() }, 0);\n // }\n // if (e.key === 'ArrowRight') {\n // inputs.item(index + 1) && setTimeout(() => { inputs.item(index + 1).focus() }, 0)\n // }\n // if (e.key === 'ArrowDown' || e.key === 'ArrowUp') {\n\n // inputs.item(index + 1) && setTimeout(() => { inputs.item(index + 1).focus() }, 0)\n // }\n // if (e.key === 'Backspace') {\n // console.log(e.key);\n // }\n // }\n\n }\n}\n\n","@let _config = config();\n@let _isError = showError();\n\n<div #OTPMaster class=\"___wts___OTP\" [class.___invalid]=\"_isError\">\n @for (item of [].constructor(_config.digits); track '__inputs'+$index) {\n\n @let isDisabled = ($index >= 1 && !(OPTARRAY[$index-1]));\n\n <div class=\"__wts__input__box\">\n <input type=\"password\" #inputItem name=\"password\" (input)=\"onChange($event, $index)\" autofocus\n autocomplete=\"new-password\" [attr.inputmode]=\"_config.type === 'number' ? 'numeric' : 'text'\"\n (paste)=\"onPaste($event, $index)\" (focus)=\"onFocus($event, $index)\" (keyup)=\"onKeyUp($event, $index)\"\n [type]=\"_config.visibleAs === 'password'? 'password' : 'text'\" (keydown)=\"_keyPress($event, $index)\"\n [placeholder]=\"_config.placeholder\" [class]=\"'border-'+_config.borderOn\" [disabled]=\"isDisabled\"\n [class.disabled]=\"isDisabled\" [class.hasError]=\"!OPTARRAY[$index]\">\n </div>\n }\n</div>\n","/*\n * Public API Surface of wts-otp\n */\n\nexport * from './lib/wts-otp.component';\nexport * from './lib/type';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}