forked from chakra-ui/zag
-
Notifications
You must be signed in to change notification settings - Fork 0
/
pin-input.js
118 lines (117 loc) · 2.95 KB
/
pin-input.js
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
"use strict";
var _xstate = require("xstate");
const {
actions,
createMachine,
assign
} = _xstate;
const {
choose
} = actions;
const fetchMachine = createMachine({
id: "pin-input",
initial: ctx.autoFocus ? "focused" : "idle",
context: {
"hasIndex": false,
"isDisabled": false,
"isFinalValue && isValidValue": false,
"isValidValue": false,
"isValidValue": false,
"hasValue": false,
"hasValue": false,
"isValueComplete": false,
"!isValidValue": false
},
entry: ctx.autoFocus ? ["setupValue", "setFocusIndexToFirst"] : ["setupValue"],
on: {
SET_VALUE: [{
cond: "hasIndex",
actions: ["setValueAtIndex", "invokeOnChange"]
}, {
actions: ["setValue", "invokeOnChange"]
}],
CLEAR_VALUE: [{
cond: "isDisabled",
actions: ["clearValue", "invokeOnChange"]
}, {
actions: ["clearValue", "invokeOnChange", "setFocusIndexToFirst"]
}]
},
on: {
UPDATE_CONTEXT: {
actions: "updateContext"
}
},
states: {
idle: {
on: {
FOCUS: {
target: "focused",
actions: "setFocusedIndex"
}
}
},
focused: {
on: {
INPUT: [{
cond: "isFinalValue && isValidValue",
actions: ["setFocusedValue", "invokeOnChange", "syncInputValue"]
}, {
cond: "isValidValue",
actions: ["setFocusedValue", "invokeOnChange", "setNextFocusedIndex", "syncInputValue"]
}],
PASTE: [{
cond: "isValidValue",
actions: ["setPastedValue", "invokeOnChange", "setLastValueFocusIndex"]
}, {
actions: ["resetFocusedValue", "invokeOnChange"]
}],
BLUR: {
target: "idle",
actions: "clearFocusedIndex"
},
DELETE: {
cond: "hasValue",
actions: ["clearFocusedValue", "invokeOnChange"]
},
ARROW_LEFT: {
actions: "setPrevFocusedIndex"
},
ARROW_RIGHT: {
actions: "setNextFocusedIndex"
},
BACKSPACE: [{
cond: "hasValue",
actions: ["clearFocusedValue", "invokeOnChange"]
}, {
actions: ["setPrevFocusedIndex", "clearFocusedValue", "invokeOnChange"]
}],
ENTER: {
cond: "isValueComplete",
actions: "requestFormSubmit"
},
KEY_DOWN: {
cond: "!isValidValue",
actions: ["preventDefault", "invokeOnInvalid"]
}
}
}
}
}, {
actions: {
updateContext: assign((context, event) => {
return {
[event.contextKey]: true
};
})
},
guards: {
"hasIndex": ctx => ctx["hasIndex"],
"isDisabled": ctx => ctx["isDisabled"],
"isFinalValue && isValidValue": ctx => ctx["isFinalValue && isValidValue"],
"isValidValue": ctx => ctx["isValidValue"],
"hasValue": ctx => ctx["hasValue"],
"isValueComplete": ctx => ctx["isValueComplete"],
"!isValidValue": ctx => ctx["!isValidValue"]
}
});