{"version":3,"file":"kara-ui-alfa-components-form-input-code.mjs","sources":["../../../libs/kara-ui/components/form/input-code/input-code.component.ts","../../../libs/kara-ui/components/form/input-code/input-code.component.html","../../../libs/kara-ui/components/form/input-code/kara-ui-alfa-components-form-input-code.ts"],"sourcesContent":["import {\n  AfterViewInit,\n  ChangeDetectionStrategy,\n  ChangeDetectorRef,\n  Component,\n  ElementRef,\n  EventEmitter,\n  HostBinding,\n  Input,\n  OnDestroy,\n  Output,\n  QueryList,\n  ViewChildren,\n  inject,\n  numberAttribute,\n} from '@angular/core';\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\n\n@Component({\n  changeDetection: ChangeDetectionStrategy.OnPush,\n  selector: 'k-input-code',\n  templateUrl: './input-code.component.html',\n  styleUrl: './input-code.component.scss',\n  providers: [{ provide: NG_VALUE_ACCESSOR, useExisting: KInputCodeComponent, multi: true }],\n})\nexport class KInputCodeComponent implements OnDestroy, ControlValueAccessor, AfterViewInit {\n  @ViewChildren('input') inputs?: QueryList<ElementRef<HTMLInputElement>>;\n\n  codeInputs: null[] = [];\n\n  @Input() set value(value: string) {\n    this.setValue(value, 0, true);\n  }\n\n  @Input({ required: true, transform: numberAttribute }) set codeLength(codeLength: number) {\n    this.codeInputs = new Array(codeLength).fill(null);\n  }\n\n  @Output() readonly valueChange = new EventEmitter<string>();\n\n  public onChange: (value: string) => void = () => null;\n  public onTouched: () => void = () => null;\n\n  @HostBinding('attr.disabled')\n  public isDisabled: undefined | true = undefined;\n\n  private currentValue = '';\n  private abortController = new AbortController();\n  private cdr = inject(ChangeDetectorRef);\n\n  writeValue(value: string): void {\n    const formattedValue = this.getNumbers(value);\n\n    this.setValue(formattedValue, 0, true);\n    this.currentValue = formattedValue;\n  }\n\n  registerOnChange(fn: (value: string) => void): void {\n    this.onChange = fn;\n  }\n\n  registerOnTouched(fn: () => void): void {\n    this.onTouched = fn;\n  }\n\n  setDisabledState(isDisabled: boolean): void {\n    this.isDisabled = isDisabled ? true : undefined;\n    this.cdr.markForCheck();\n  }\n\n  ngAfterViewInit(): void {\n    this.inputs?.first?.nativeElement.focus();\n    this.initOtpAutoFill();\n  }\n\n  ngOnDestroy(): void {\n    this.abortController.abort('destroy');\n  }\n\n  change(event: Event): void {\n    const target = event.target as HTMLInputElement;\n    const value = this.getNumbers(target.value);\n    const isAutofill = value.length > 1;\n\n    if (isAutofill) {\n      const currentIndex = this.inputs?.toArray().findIndex((input) => input.nativeElement === target) ?? 0;\n      this.setValue(value, currentIndex, true);\n    } else if (target.value !== value) {\n      target.value = value;\n    }\n\n    this.emitValue();\n\n    if (!isAutofill && target.value?.length) {\n      this.focusAndSelect(target.nextElementSibling as HTMLInputElement);\n    }\n  }\n\n  keydown(event: Event): void {\n    const target = event.target as HTMLInputElement;\n\n    switch ((event as KeyboardEvent).code) {\n      case 'Backspace':\n        event.preventDefault();\n        this.deleteBackward(target);\n        break;\n      case 'ArrowLeft':\n      case 'ArrowUp':\n        requestAnimationFrame(() => this.focusAndSelect(target.previousElementSibling as HTMLInputElement));\n        break;\n      case 'ArrowRight':\n      case 'ArrowDown':\n        requestAnimationFrame(() => this.focusAndSelect(target.nextElementSibling as HTMLInputElement));\n        break;\n\n      default:\n        break;\n    }\n  }\n\n  beforeInput(event: InputEvent): void {\n    const target = event.target as HTMLInputElement;\n\n    if (event.inputType === 'insertText' || event.inputType === 'insertReplacementText') {\n      const value = this.getNumbers(event.data);\n      if (value.length > 1) {\n        event.preventDefault();\n        this.setValue(value, 0, true);\n        this.emitValue();\n      }\n\n      return;\n    }\n\n    if (event.inputType === 'deleteContentBackward') {\n      event.preventDefault();\n      target.value = '';\n      this.emitValue();\n      this.focusAndSelect(target.previousElementSibling as HTMLInputElement);\n    }\n  }\n\n  paste(event: ClipboardEvent, currentIndex: number): void {\n    event.preventDefault();\n    const pastedText = this.getNumbers(event.clipboardData?.getData('text') || '');\n\n    this.setValue(pastedText, currentIndex);\n    this.emitValue();\n  }\n\n  setValue(selectedText: string, changedIndex: number = 0, isReset = false): void {\n    if (!this.inputs) {\n      requestAnimationFrame(() => this.setValue(selectedText, changedIndex));\n      return;\n    }\n\n    const firstEmptyInput = this.inputs.toArray().findIndex((input) => !input.nativeElement.value?.length);\n    const currentIndex = firstEmptyInput !== -1 && firstEmptyInput < changedIndex ? firstEmptyInput : changedIndex;\n    let isSelected = false;\n\n    this.inputs.forEach((input, index) => {\n      if (index < currentIndex) {\n        return;\n      }\n\n      const text = selectedText[index - currentIndex] ?? (isReset ? '' : input.nativeElement.value);\n\n      if (input.nativeElement.value !== text) {\n        // eslint-disable-next-line no-param-reassign\n        input.nativeElement.value = text;\n      }\n\n      if (!isSelected && (currentIndex + selectedText.length === index || this.inputs!.length - 1 === index)) {\n        isSelected = true;\n        this.focusAndSelect(input.nativeElement);\n      }\n    });\n  }\n\n  emitValue(): void {\n    const value = this.inputs?.reduce((acc, input) => acc + input.nativeElement.value, '') || '';\n\n    if (this.currentValue !== value) {\n      this.currentValue = value;\n      this.onChange(value);\n      this.valueChange.emit(value);\n    }\n  }\n\n  onFocus(event: Event): void {\n    event.preventDefault();\n    const target = event.target as HTMLInputElement;\n    this.onTouched();\n\n    if (target.value?.length || (target.previousElementSibling as HTMLInputElement)?.value) {\n      target.select();\n      return;\n    }\n\n    const next = this.inputs?.find((input) => !input.nativeElement.value?.length)?.nativeElement;\n    if (next) {\n      next.focus();\n    } else {\n      this.inputs?.first.nativeElement.focus();\n    }\n  }\n\n  private getNumbers(value: string | undefined | null): string {\n    if (!value) {\n      return '';\n    }\n\n    return value.replace(/[^0-9]/g, '');\n  }\n\n  private focusAndSelect(input: HTMLInputElement | null): void {\n    input?.focus();\n    input?.select();\n  }\n\n  private deleteBackward(target: HTMLInputElement): void {\n    const input = target;\n    input.value = '';\n    this.emitValue();\n    this.focusAndSelect((input.previousElementSibling as HTMLInputElement) || input);\n  }\n\n  private initOtpAutoFill(): void {\n    /** https://developer.mozilla.org/en-US/docs/Web/API/OTPCredential */\n    if ('OTPCredential' in window) {\n      navigator.credentials\n        .get({\n          otp: { transport: ['sms'] },\n          signal: this.abortController.signal,\n        } as any)\n        .then((otp) => {\n          const code = this.getNumbers((otp as any)?.code);\n          this.setValue(code, 0, true);\n          this.emitValue();\n        })\n        // eslint-disable-next-line no-empty-function\n        .catch(() => {});\n    }\n  }\n}\n","@for (item of codeInputs; track $index) {\n  <input\n    #input\n    type=\"text\"\n    autocomplete=\"one-time-code\"\n    inputmode=\"numeric\"\n    class=\"k-input-code\"\n    [attr.maxlength]=\"$index === 0 ? codeInputs.length : 1\"\n    [disabled]=\"isDisabled\"\n    [autofocus]=\"$index === 0\"\n    (focus)=\"onFocus($event)\"\n    (beforeinput)=\"beforeInput($event)\"\n    (input)=\"change($event)\"\n    (keydown)=\"keydown($event)\"\n    (paste)=\"paste($event, $index)\"\n  />\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}