-
Notifications
You must be signed in to change notification settings - Fork 13.4k
Expand file tree
/
Copy pathinput-otp.ts
More file actions
133 lines (126 loc) · 4.2 KB
/
input-otp.ts
File metadata and controls
133 lines (126 loc) · 4.2 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
import {
ChangeDetectionStrategy,
ChangeDetectorRef,
Component,
ElementRef,
EventEmitter,
HostListener,
Injector,
NgZone,
forwardRef,
} from '@angular/core';
import { NG_VALUE_ACCESSOR } from '@angular/forms';
import { ValueAccessor } from '@ionic/angular/common';
import type {
InputOtpInputEventDetail as IIonInputOtpInputEventDetail,
InputOtpChangeEventDetail as IIonInputOtpChangeEventDetail,
InputOtpCompleteEventDetail as IIonInputOtpCompleteEventDetail,
Components,
} from '@ionic/core/components';
import { defineCustomElement } from '@ionic/core/components/ion-input-otp.js';
import { ProxyCmp, proxyOutputs } from './angular-component-lib/utils';
const INPUT_OTP_INPUTS = [
'autocapitalize',
'color',
'disabled',
'fill',
'inputmode',
'length',
'pattern',
'readonly',
'separators',
'shape',
'size',
'type',
'value',
];
/**
* Pulling the provider into an object and using PURE works
* around an ng-packagr issue that causes
* components with multiple decorators and
* a provider to be re-assigned. This re-assignment
* is not supported by Webpack and causes treeshaking
* to not work on these kinds of components.
*/
const accessorProvider = {
provide: NG_VALUE_ACCESSOR,
useExisting: /*@__PURE__*/ forwardRef(() => IonInputOtp),
multi: true,
};
@ProxyCmp({
defineCustomElementFn: defineCustomElement,
inputs: INPUT_OTP_INPUTS,
methods: ['setFocus'],
})
@Component({
selector: 'ion-input-otp',
changeDetection: ChangeDetectionStrategy.OnPush,
template: '<ng-content></ng-content>',
// eslint-disable-next-line @angular-eslint/no-inputs-metadata-property
inputs: INPUT_OTP_INPUTS,
providers: [accessorProvider],
standalone: true,
})
export class IonInputOtp extends ValueAccessor {
protected el: HTMLElement;
constructor(c: ChangeDetectorRef, r: ElementRef, protected z: NgZone, injector: Injector) {
super(injector, r);
c.detach();
this.el = r.nativeElement;
proxyOutputs(this, this.el, ['ionInput', 'ionChange', 'ionComplete', 'ionBlur', 'ionFocus']);
}
@HostListener('ionInput', ['$event.target'])
handleIonInput(el: HTMLIonInputOtpElement): void {
this.handleValueChange(el, el.value);
}
registerOnChange(fn: (_: any) => void): void {
super.registerOnChange((value: string) => {
if (this.type === 'number') {
/**
* If the input type is `number`, we need to convert the value to a number
* when the value is not empty. If the value is empty, we want to treat
* the value as null.
*/
fn(value === '' ? null : parseFloat(value));
} else {
fn(value);
}
});
}
}
export declare interface IonInputOtp extends Components.IonInputOtp {
/**
* The `ionInput` event is fired each time the user modifies the input's value.
* Unlike the `ionChange` event, the `ionInput` event is fired for each alteration
* to the input's value. This typically happens for each keystroke as the user types.
*
* For elements that accept text input (`type=text`, `type=tel`, etc.), the interface
* is [`InputEvent`](https://developer.mozilla.org/en-US/docs/Web/API/InputEvent); for others,
* the interface is [`Event`](https://developer.mozilla.org/en-US/docs/Web/API/Event). If
* the input is cleared on edit, the type is `null`.
*/
ionInput: EventEmitter<CustomEvent<IIonInputOtpInputEventDetail>>;
/**
* The `ionChange` event is fired when the user modifies the input's value.
* Unlike the `ionInput` event, the `ionChange` event is only fired when changes
* are committed, not as the user types.
*
* The `ionChange` event fires when the `<ion-input-otp>` component loses
* focus after its value has changed.
*
* This event will not emit when programmatically setting the `value` property.
*/
ionChange: EventEmitter<CustomEvent<IIonInputOtpChangeEventDetail>>;
/**
* Emitted when all input boxes have been filled with valid values.
*/
ionComplete: EventEmitter<CustomEvent<IIonInputOtpCompleteEventDetail>>;
/**
* Emitted when the input group loses focus.
*/
ionBlur: EventEmitter<CustomEvent<FocusEvent>>;
/**
* Emitted when the input group has focus.
*/
ionFocus: EventEmitter<CustomEvent<FocusEvent>>;
}