flipper-ui 0.25.2 → 0.25.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/core/PinInput.d.ts +12 -0
- package/core/PinInput.js +165 -0
- package/index.d.ts +1 -0
- package/index.js +9 -1
- package/package.json +1 -1
- package/stories/PinInput.stories.js +133 -0
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
interface PinInputGridProps {
|
|
3
|
+
pin: Array<number | undefined>;
|
|
4
|
+
setPin: (pin: Array<number | undefined>) => void;
|
|
5
|
+
onPinChanged: (pinEntry: number | undefined, index: number) => void;
|
|
6
|
+
pinLength: number;
|
|
7
|
+
validationResult: boolean | undefined;
|
|
8
|
+
isValidating: boolean;
|
|
9
|
+
size: 'small' | 'large';
|
|
10
|
+
}
|
|
11
|
+
declare const PinInput: React.FC<PinInputGridProps>;
|
|
12
|
+
export default PinInput;
|
package/core/PinInput.js
ADDED
|
@@ -0,0 +1,165 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
|
4
|
+
|
|
5
|
+
var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard");
|
|
6
|
+
|
|
7
|
+
Object.defineProperty(exports, "__esModule", {
|
|
8
|
+
value: true
|
|
9
|
+
});
|
|
10
|
+
exports["default"] = void 0;
|
|
11
|
+
|
|
12
|
+
var _react = _interopRequireWildcard(require("react"));
|
|
13
|
+
|
|
14
|
+
var _TextField = _interopRequireDefault(require("@material-ui/core/TextField"));
|
|
15
|
+
|
|
16
|
+
function _createForOfIteratorHelper(o, allowArrayLike) { var it; if (typeof Symbol === "undefined" || o[Symbol.iterator] == null) { if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") { if (it) o = it; var i = 0; var F = function F() {}; return { s: F, n: function n() { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function e(_e) { throw _e; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var normalCompletion = true, didErr = false, err; return { s: function s() { it = o[Symbol.iterator](); }, n: function n() { var step = it.next(); normalCompletion = step.done; return step; }, e: function e(_e2) { didErr = true; err = _e2; }, f: function f() { try { if (!normalCompletion && it["return"] != null) it["return"](); } finally { if (didErr) throw err; } } }; }
|
|
17
|
+
|
|
18
|
+
function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
|
|
19
|
+
|
|
20
|
+
function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }
|
|
21
|
+
|
|
22
|
+
var removeValuesFromArray = function removeValuesFromArray(valuesArray, value) {
|
|
23
|
+
var valueIndex = valuesArray.findIndex(function (entry) {
|
|
24
|
+
return entry === value;
|
|
25
|
+
});
|
|
26
|
+
|
|
27
|
+
if (valueIndex === -1) {
|
|
28
|
+
return;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
valuesArray.splice(valueIndex, 1);
|
|
32
|
+
};
|
|
33
|
+
|
|
34
|
+
var PIN_MIN_VALUE = 0;
|
|
35
|
+
var PIN_MAX_VALUE = 9;
|
|
36
|
+
var BACKSPACE_KEY = 'Backspace';
|
|
37
|
+
|
|
38
|
+
var PinInput = function PinInput(_ref) {
|
|
39
|
+
var pinLength = _ref.pinLength,
|
|
40
|
+
pin = _ref.pin,
|
|
41
|
+
setPin = _ref.setPin,
|
|
42
|
+
onPinChanged = _ref.onPinChanged,
|
|
43
|
+
validationResult = _ref.validationResult,
|
|
44
|
+
isValidating = _ref.isValidating,
|
|
45
|
+
size = _ref.size;
|
|
46
|
+
var inputRefs = (0, _react.useRef)([]);
|
|
47
|
+
|
|
48
|
+
var changePinFocus = function changePinFocus(pinIndex) {
|
|
49
|
+
var ref = inputRefs.current[pinIndex];
|
|
50
|
+
|
|
51
|
+
if (ref) {
|
|
52
|
+
ref.focus();
|
|
53
|
+
}
|
|
54
|
+
};
|
|
55
|
+
|
|
56
|
+
(0, _react.useEffect)(function () {
|
|
57
|
+
changePinFocus(0);
|
|
58
|
+
}, [isValidating]);
|
|
59
|
+
|
|
60
|
+
var onPaste = function onPaste(event) {
|
|
61
|
+
var pastedValue = event.clipboardData.getData('text/plain');
|
|
62
|
+
var splitValues = pastedValue.split('');
|
|
63
|
+
var intValues = [];
|
|
64
|
+
|
|
65
|
+
var _iterator = _createForOfIteratorHelper(splitValues),
|
|
66
|
+
_step;
|
|
67
|
+
|
|
68
|
+
try {
|
|
69
|
+
for (_iterator.s(); !(_step = _iterator.n()).done;) {
|
|
70
|
+
var value = _step.value;
|
|
71
|
+
intValues.push(parseInt(value));
|
|
72
|
+
}
|
|
73
|
+
} catch (err) {
|
|
74
|
+
_iterator.e(err);
|
|
75
|
+
} finally {
|
|
76
|
+
_iterator.f();
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
setPin(intValues);
|
|
80
|
+
changePinFocus(intValues.length - 1);
|
|
81
|
+
};
|
|
82
|
+
|
|
83
|
+
var _onChange = function onChange(event, index) {
|
|
84
|
+
if (event.target.value.length > 1) {
|
|
85
|
+
return;
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
var previousValue = event.target.defaultValue;
|
|
89
|
+
var valuesArray = event.target.value.split('');
|
|
90
|
+
removeValuesFromArray(valuesArray, previousValue);
|
|
91
|
+
var value = valuesArray.pop();
|
|
92
|
+
|
|
93
|
+
if (!value) {
|
|
94
|
+
return;
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
var pinNumber = Number(value.trim());
|
|
98
|
+
|
|
99
|
+
if (isNaN(pinNumber) || value.length === 0) {
|
|
100
|
+
return;
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
if (pinNumber >= PIN_MIN_VALUE && pinNumber <= PIN_MAX_VALUE) {
|
|
104
|
+
onPinChanged(pinNumber, index);
|
|
105
|
+
|
|
106
|
+
if (index < pinLength - 1) {
|
|
107
|
+
changePinFocus(index + 1);
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
};
|
|
111
|
+
|
|
112
|
+
var _onKeyDown = function onKeyDown(event, index) {
|
|
113
|
+
var keyboardKeyCode = event.nativeEvent.code;
|
|
114
|
+
|
|
115
|
+
if (keyboardKeyCode !== BACKSPACE_KEY) {
|
|
116
|
+
return;
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
if (pin[index] === undefined) {
|
|
120
|
+
changePinFocus(index - 1);
|
|
121
|
+
} else {
|
|
122
|
+
onPinChanged(undefined, index);
|
|
123
|
+
}
|
|
124
|
+
};
|
|
125
|
+
|
|
126
|
+
return /*#__PURE__*/_react["default"].createElement(_react["default"].Fragment, null, /*#__PURE__*/_react["default"].createElement("div", null, Array.from({
|
|
127
|
+
length: pinLength
|
|
128
|
+
}, function (_, index) {
|
|
129
|
+
return /*#__PURE__*/_react["default"].createElement(_TextField["default"], {
|
|
130
|
+
disabled: isValidating,
|
|
131
|
+
variant: "outlined",
|
|
132
|
+
onKeyDown: function onKeyDown(event) {
|
|
133
|
+
return _onKeyDown(event, index);
|
|
134
|
+
},
|
|
135
|
+
onPaste: onPaste,
|
|
136
|
+
color: "primary",
|
|
137
|
+
error: validationResult,
|
|
138
|
+
style: {
|
|
139
|
+
width: size === 'small' ? '40px' : '40px',
|
|
140
|
+
height: size === 'small' ? '30px' : '40px',
|
|
141
|
+
marginInline: size === 'small' ? '5px' : '10px'
|
|
142
|
+
},
|
|
143
|
+
InputProps: {
|
|
144
|
+
style: {
|
|
145
|
+
width: size === 'small' ? '40px' : '45px',
|
|
146
|
+
textAlign: 'center',
|
|
147
|
+
fontWeight: 'bold',
|
|
148
|
+
fontSize: size === 'small' ? '16px' : '20px',
|
|
149
|
+
padding: 'auto'
|
|
150
|
+
}
|
|
151
|
+
},
|
|
152
|
+
inputRef: function inputRef(el) {
|
|
153
|
+
inputRefs.current[index] = el;
|
|
154
|
+
},
|
|
155
|
+
key: index,
|
|
156
|
+
onChange: function onChange(event) {
|
|
157
|
+
_onChange(event, index);
|
|
158
|
+
},
|
|
159
|
+
value: pin[index] || ''
|
|
160
|
+
});
|
|
161
|
+
})));
|
|
162
|
+
};
|
|
163
|
+
|
|
164
|
+
var _default = PinInput;
|
|
165
|
+
exports["default"] = _default;
|
package/index.d.ts
CHANGED
|
@@ -57,3 +57,4 @@ export { default as Tooltip } from './core/Tooltip';
|
|
|
57
57
|
export { default as Tree } from './core/Tree';
|
|
58
58
|
export { default as Typography } from './core/Typography';
|
|
59
59
|
export { default as Zoom } from './core/Zoom';
|
|
60
|
+
export { default as PinInput } from './core/PinInput';
|
package/index.js
CHANGED
|
@@ -359,6 +359,12 @@ Object.defineProperty(exports, "Zoom", {
|
|
|
359
359
|
return _Zoom["default"];
|
|
360
360
|
}
|
|
361
361
|
});
|
|
362
|
+
Object.defineProperty(exports, "PinInput", {
|
|
363
|
+
enumerable: true,
|
|
364
|
+
get: function get() {
|
|
365
|
+
return _PinInput["default"];
|
|
366
|
+
}
|
|
367
|
+
});
|
|
362
368
|
|
|
363
369
|
var _Advertise = _interopRequireDefault(require("./core/Advertise"));
|
|
364
370
|
|
|
@@ -476,4 +482,6 @@ var _Tree = _interopRequireDefault(require("./core/Tree"));
|
|
|
476
482
|
|
|
477
483
|
var _Typography = _interopRequireDefault(require("./core/Typography"));
|
|
478
484
|
|
|
479
|
-
var _Zoom = _interopRequireDefault(require("./core/Zoom"));
|
|
485
|
+
var _Zoom = _interopRequireDefault(require("./core/Zoom"));
|
|
486
|
+
|
|
487
|
+
var _PinInput = _interopRequireDefault(require("./core/PinInput"));
|
package/package.json
CHANGED
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard");
|
|
4
|
+
|
|
5
|
+
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
|
6
|
+
|
|
7
|
+
Object.defineProperty(exports, "__esModule", {
|
|
8
|
+
value: true
|
|
9
|
+
});
|
|
10
|
+
exports.Large = exports.Default = exports["default"] = void 0;
|
|
11
|
+
|
|
12
|
+
var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray"));
|
|
13
|
+
|
|
14
|
+
var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
|
|
15
|
+
|
|
16
|
+
var _react = _interopRequireWildcard(require("react"));
|
|
17
|
+
|
|
18
|
+
var _PinInput = _interopRequireDefault(require("../core/PinInput"));
|
|
19
|
+
|
|
20
|
+
var _Button = _interopRequireDefault(require("@material-ui/core/Button"));
|
|
21
|
+
|
|
22
|
+
var _default = {
|
|
23
|
+
title: 'PinInput',
|
|
24
|
+
component: _PinInput["default"]
|
|
25
|
+
};
|
|
26
|
+
exports["default"] = _default;
|
|
27
|
+
var PIN_LENGTH = 6;
|
|
28
|
+
|
|
29
|
+
var Default = function Default() {
|
|
30
|
+
var _useState = (0, _react.useState)(new Array(PIN_LENGTH)),
|
|
31
|
+
_useState2 = (0, _slicedToArray2["default"])(_useState, 2),
|
|
32
|
+
pin = _useState2[0],
|
|
33
|
+
setPin = _useState2[1];
|
|
34
|
+
|
|
35
|
+
var onPinChanged = function onPinChanged(pinEntry, index) {
|
|
36
|
+
var newPin = (0, _toConsumableArray2["default"])(pin);
|
|
37
|
+
newPin[index] = pinEntry;
|
|
38
|
+
setPin(newPin);
|
|
39
|
+
};
|
|
40
|
+
|
|
41
|
+
var _useState3 = (0, _react.useState)(false),
|
|
42
|
+
_useState4 = (0, _slicedToArray2["default"])(_useState3, 2),
|
|
43
|
+
hasError = _useState4[0],
|
|
44
|
+
setHasError = _useState4[1];
|
|
45
|
+
|
|
46
|
+
var _useState5 = (0, _react.useState)(false),
|
|
47
|
+
_useState6 = (0, _slicedToArray2["default"])(_useState5, 2),
|
|
48
|
+
isValidating = _useState6[0],
|
|
49
|
+
setIsValidating = _useState6[1];
|
|
50
|
+
|
|
51
|
+
var handleValidation = function handleValidation() {
|
|
52
|
+
setIsValidating(true);
|
|
53
|
+
|
|
54
|
+
if (pin.join('') !== '123123') {
|
|
55
|
+
setHasError(true);
|
|
56
|
+
setPin(new Array(PIN_LENGTH));
|
|
57
|
+
} else {
|
|
58
|
+
setHasError(false);
|
|
59
|
+
alert('PIN is correct');
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
setIsValidating(false);
|
|
63
|
+
};
|
|
64
|
+
|
|
65
|
+
return /*#__PURE__*/_react["default"].createElement(_react["default"].Fragment, null, /*#__PURE__*/_react["default"].createElement("span", null, "Valid pin: 123123"), /*#__PURE__*/_react["default"].createElement("br", null), /*#__PURE__*/_react["default"].createElement("br", null), /*#__PURE__*/_react["default"].createElement(_PinInput["default"], {
|
|
66
|
+
pin: pin,
|
|
67
|
+
setPin: setPin,
|
|
68
|
+
onPinChanged: onPinChanged,
|
|
69
|
+
pinLength: PIN_LENGTH,
|
|
70
|
+
validationResult: hasError,
|
|
71
|
+
isValidating: isValidating,
|
|
72
|
+
size: "small"
|
|
73
|
+
}), /*#__PURE__*/_react["default"].createElement("br", null), /*#__PURE__*/_react["default"].createElement("br", null), /*#__PURE__*/_react["default"].createElement(_Button["default"], {
|
|
74
|
+
onClick: function onClick() {
|
|
75
|
+
handleValidation();
|
|
76
|
+
}
|
|
77
|
+
}, "Validate"));
|
|
78
|
+
};
|
|
79
|
+
|
|
80
|
+
exports.Default = Default;
|
|
81
|
+
|
|
82
|
+
var Large = function Large() {
|
|
83
|
+
var _useState7 = (0, _react.useState)(new Array(PIN_LENGTH)),
|
|
84
|
+
_useState8 = (0, _slicedToArray2["default"])(_useState7, 2),
|
|
85
|
+
pin = _useState8[0],
|
|
86
|
+
setPin = _useState8[1];
|
|
87
|
+
|
|
88
|
+
var onPinChanged = function onPinChanged(pinEntry, index) {
|
|
89
|
+
var newPin = (0, _toConsumableArray2["default"])(pin);
|
|
90
|
+
newPin[index] = pinEntry;
|
|
91
|
+
setPin(newPin);
|
|
92
|
+
};
|
|
93
|
+
|
|
94
|
+
var _useState9 = (0, _react.useState)(false),
|
|
95
|
+
_useState10 = (0, _slicedToArray2["default"])(_useState9, 2),
|
|
96
|
+
hasError = _useState10[0],
|
|
97
|
+
setHasError = _useState10[1];
|
|
98
|
+
|
|
99
|
+
var _useState11 = (0, _react.useState)(false),
|
|
100
|
+
_useState12 = (0, _slicedToArray2["default"])(_useState11, 2),
|
|
101
|
+
isValidating = _useState12[0],
|
|
102
|
+
setIsValidating = _useState12[1];
|
|
103
|
+
|
|
104
|
+
var handleValidation = function handleValidation() {
|
|
105
|
+
setIsValidating(true);
|
|
106
|
+
|
|
107
|
+
if (pin.join('') !== '123123') {
|
|
108
|
+
setPin(new Array(PIN_LENGTH));
|
|
109
|
+
setHasError(true);
|
|
110
|
+
} else {
|
|
111
|
+
setHasError(false);
|
|
112
|
+
alert('PIN is correct');
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
setIsValidating(false);
|
|
116
|
+
};
|
|
117
|
+
|
|
118
|
+
return /*#__PURE__*/_react["default"].createElement(_react["default"].Fragment, null, /*#__PURE__*/_react["default"].createElement("span", null, "Valid pin: 123123"), /*#__PURE__*/_react["default"].createElement("br", null), /*#__PURE__*/_react["default"].createElement("br", null), /*#__PURE__*/_react["default"].createElement(_PinInput["default"], {
|
|
119
|
+
pin: pin,
|
|
120
|
+
setPin: setPin,
|
|
121
|
+
onPinChanged: onPinChanged,
|
|
122
|
+
pinLength: PIN_LENGTH,
|
|
123
|
+
validationResult: hasError,
|
|
124
|
+
isValidating: isValidating,
|
|
125
|
+
size: "large"
|
|
126
|
+
}), /*#__PURE__*/_react["default"].createElement("br", null), /*#__PURE__*/_react["default"].createElement("br", null), /*#__PURE__*/_react["default"].createElement(_Button["default"], {
|
|
127
|
+
onClick: function onClick() {
|
|
128
|
+
handleValidation();
|
|
129
|
+
}
|
|
130
|
+
}, "Validate"));
|
|
131
|
+
};
|
|
132
|
+
|
|
133
|
+
exports.Large = Large;
|