sapo-components-ui-rn 1.0.76 → 1.0.78

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.
@@ -8,6 +8,8 @@ export interface NumberKeyboardProps {
8
8
  onChangeText?: (value: string) => void;
9
9
  /** Giá trị tối đa cho phép */
10
10
  maxValue?: number;
11
+ /** Giá trị tối thiểu cho phép */
12
+ minValue?: number;
11
13
  /** Loại input: integer hoặc float */
12
14
  type?: "integer" | "float";
13
15
  /** Số chữ số thập phân cho phép */
@@ -13,7 +13,6 @@ export interface SelectionFieldProps extends TouchableOpacityProps {
13
13
  textProps?: IText;
14
14
  textColor?: string;
15
15
  labelColor?: string;
16
- size?: number;
17
16
  textStyle?: TextStyle;
18
17
  labelStyle?: TextStyle;
19
18
  disabled?: boolean;
@@ -21,5 +20,5 @@ export interface SelectionFieldProps extends TouchableOpacityProps {
21
20
  theme?: ThemeProp;
22
21
  required?: boolean;
23
22
  }
24
- declare const _default: React.MemoExoticComponent<({ style, content, label, error, borderColor, left, right, textStyle, labelStyle, textProps, onPress, disabled, textColor, labelColor, size, theme: themeOverrides, required, ...props }: SelectionFieldProps) => React.JSX.Element>;
23
+ declare const _default: React.MemoExoticComponent<({ style, content, label, error, borderColor, left, right, textStyle, labelStyle, textProps, onPress, disabled, textColor, labelColor, theme: themeOverrides, required, ...props }: SelectionFieldProps) => React.JSX.Element>;
25
24
  export default _default;
package/dist/index.esm.js CHANGED
@@ -5984,8 +5984,15 @@ var TextInputNumber = function (_a) {
5984
5984
  setInputValue(function (prev) { return prev.slice(0, -1); });
5985
5985
  }
5986
5986
  else if (key === "000") {
5987
- if (type === "integer" && inputValue.length > 0) {
5988
- setInputValue(function (prev) { return prev + "000"; });
5987
+ if (type === "integer") {
5988
+ var newInputValue = inputValue + "000";
5989
+ var newValue = Number(newInputValue);
5990
+ var maxValueNumber = Number(maxValue);
5991
+ if (!isNaN(newValue) &&
5992
+ !isNaN(maxValueNumber) &&
5993
+ newValue <= maxValueNumber) {
5994
+ setInputValue(newInputValue);
5995
+ }
5989
5996
  setIsFirstInput(false);
5990
5997
  }
5991
5998
  }
@@ -6007,6 +6014,20 @@ var TextInputNumber = function (_a) {
6007
6014
  setIsFirstInput(false);
6008
6015
  }
6009
6016
  else {
6017
+ // Kiểm tra nếu input bắt đầu bằng 0 và không có dấu chấm
6018
+ if (inputValue === "0") {
6019
+ if (key === ".") {
6020
+ setInputValue("0.");
6021
+ return;
6022
+ }
6023
+ else if (key >= "1" && key <= "9") {
6024
+ setInputValue(key);
6025
+ return;
6026
+ }
6027
+ else {
6028
+ return;
6029
+ }
6030
+ }
6010
6031
  var newInputValue = inputValue + key;
6011
6032
  var newValue = Number(newInputValue);
6012
6033
  var maxValueNumber = Number(maxValue);
@@ -6014,16 +6035,16 @@ var TextInputNumber = function (_a) {
6014
6035
  !isNaN(maxValueNumber) &&
6015
6036
  newValue <= maxValueNumber) {
6016
6037
  if (inputValue.includes(".")) {
6017
- var _a = inputValue.split("."), intPart = _a[0], _b = _a[1], decimalPart = _b === void 0 ? "" : _b;
6018
- if (intPart.length < 12 && decimalPart.length === 0) {
6038
+ var _a = inputValue.split("."); _a[0]; var _b = _a[1], decimalPart = _b === void 0 ? "" : _b;
6039
+ if (newInputValue.length <= 12 && decimalPart.length === 0) {
6019
6040
  setInputValue(function (prev) { return prev + key; });
6020
6041
  }
6021
- else if (decimalPart.length < 3) {
6042
+ else if (newInputValue.length <= 12 && decimalPart.length < 3) {
6022
6043
  setInputValue(function (prev) { return prev + key; });
6023
6044
  }
6024
6045
  }
6025
6046
  else {
6026
- if (inputValue.length < 12) {
6047
+ if (newInputValue.length <= 12) {
6027
6048
  setInputValue(function (prev) { return prev + key; });
6028
6049
  }
6029
6050
  }
@@ -6078,7 +6099,14 @@ var TextInputNumber = function (_a) {
6078
6099
  {
6079
6100
  borderRadius: BORDER_RADIUS_6,
6080
6101
  },
6081
- [styles$b.border, { borderColor: colors.borderPrimaryDefault }],
6102
+ [
6103
+ styles$b.border,
6104
+ {
6105
+ borderColor: isShowModalKeyboard
6106
+ ? colors.borderBrandDefault
6107
+ : colors.borderPrimaryDefault,
6108
+ },
6109
+ ],
6082
6110
  textError.length > 0 && [
6083
6111
  {
6084
6112
  borderColor: colors.borderErrorDefault,
@@ -6130,10 +6158,10 @@ var TextInputNumber = function (_a) {
6130
6158
  React__default.createElement(Modal, { visible: isShowModalKeyboard, transparent: true, animationType: "fade", onRequestClose: onCloseModalKeyboard },
6131
6159
  React__default.createElement(TouchableOpacity, { style: styles$b.modalOverlay, activeOpacity: 1, onPress: onCloseModalKeyboard },
6132
6160
  React__default.createElement(View, { onPress: function () { }, activeOpacity: 1, backgroundColor: colors.surfacePrimaryDefault, style: styles$b.modalContent },
6133
- React__default.createElement(Text$1, { style: styles$b.modalTitle }, label),
6161
+ React__default.createElement(Text$1, { style: [styles$b.modalTitle, styles$b.text18] }, label),
6134
6162
  React__default.createElement(View, { width: "100%" },
6135
6163
  React__default.createElement(View, { paddingHorizontal: SPACE_40 },
6136
- React__default.createElement(Text$1, { numberOfLines: 1, style: styles$b.valueText }, formatNumberInput$1(inputValue, formatDecimal) || "0")),
6164
+ React__default.createElement(Text$1, { numberOfLines: 1, style: [styles$b.text30, styles$b.valueText] }, formatNumberInput$1(inputValue, formatDecimal) || "0")),
6137
6165
  React__default.createElement(TouchableOpacity, { onPress: handleClear, style: styles$b.clearButton },
6138
6166
  React__default.createElement(Icon$1, { name: "IconClearText", type: "Svg", size: 24, color: colors.textSecondary }))),
6139
6167
  React__default.createElement(View, { style: styles$b.keyboardGrid }, [
@@ -6150,6 +6178,7 @@ var TextInputNumber = function (_a) {
6150
6178
  ], onPress: function () { return handleKeyPress(key); }, disabled: (key === "000" && type === "float") ||
6151
6179
  (key === "." && inputValue.includes(".")) }, key === "del" ? (React__default.createElement(Icon$1, { name: "IconDelNumber", type: "Svg", size: 24 })) : (React__default.createElement(Text$1, { style: [
6152
6180
  styles$b.keyText,
6181
+ styles$b.text22,
6153
6182
  key === "000" &&
6154
6183
  type === "float" &&
6155
6184
  styles$b.disabledKeyText,
@@ -6159,13 +6188,14 @@ var TextInputNumber = function (_a) {
6159
6188
  ] }, key)))); }))); })),
6160
6189
  React__default.createElement(View, { style: styles$b.actionRow },
6161
6190
  React__default.createElement(TouchableOpacity, { activeOpacity: 0.8, style: styles$b.actionButton, onPress: onCloseModalKeyboard },
6162
- React__default.createElement(Text$1, { style: styles$b.actionText }, "\u0110\u00F3ng")),
6191
+ React__default.createElement(Text$1, { style: [styles$b.actionText, styles$b.text16] }, "\u0110\u00F3ng")),
6163
6192
  React__default.createElement(Spacer, { style: {
6164
6193
  height: "100%",
6165
6194
  }, width: 1, backgroundColor: colors.borderPrimaryDefault }),
6166
6195
  React__default.createElement(TouchableOpacity, { activeOpacity: 0.8, style: [styles$b.actionButton, !canSave && { opacity: 0.5 }], onPress: handleSave, disabled: !canSave },
6167
6196
  React__default.createElement(Text$1, { style: [
6168
6197
  styles$b.actionText,
6198
+ styles$b.text16,
6169
6199
  { color: colors.textBrandDefault },
6170
6200
  !canSave && { color: colors.textSecondary },
6171
6201
  ] }, "L\u01B0u"))))))));
@@ -6191,12 +6221,10 @@ var styles$b = StyleSheet.create(__assign(__assign({}, containerStyles), { disab
6191
6221
  paddingBottom: 20,
6192
6222
  alignItems: "center",
6193
6223
  }, modalTitle: {
6194
- fontSize: 18,
6195
6224
  textAlign: "center",
6196
6225
  marginTop: 16,
6197
6226
  marginBottom: 8,
6198
6227
  }, valueText: {
6199
- fontSize: 30,
6200
6228
  textAlign: "center",
6201
6229
  }, clearButton: {
6202
6230
  padding: 8,
@@ -6218,7 +6246,6 @@ var styles$b = StyleSheet.create(__assign(__assign({}, containerStyles), { disab
6218
6246
  justifyContent: "center",
6219
6247
  height: 48,
6220
6248
  }, keyText: {
6221
- fontSize: 22,
6222
6249
  fontWeight: "500",
6223
6250
  }, actionRow: {
6224
6251
  flexDirection: "row",
@@ -6231,7 +6258,6 @@ var styles$b = StyleSheet.create(__assign(__assign({}, containerStyles), { disab
6231
6258
  alignItems: "center",
6232
6259
  paddingVertical: 12,
6233
6260
  }, actionText: {
6234
- fontSize: 16,
6235
6261
  fontWeight: "600",
6236
6262
  }, disabledKey: {
6237
6263
  opacity: 0.5,
@@ -7186,7 +7212,7 @@ var styles$3 = StyleSheet.create({
7186
7212
  });
7187
7213
 
7188
7214
  var SelectionField = function (_a) {
7189
- var style = _a.style, _b = _a.content, content = _b === void 0 ? "" : _b, _c = _a.label, label = _c === void 0 ? "" : _c, _d = _a.error, error = _d === void 0 ? "" : _d, borderColor = _a.borderColor; _a.left; var right = _a.right, textStyle = _a.textStyle; _a.labelStyle; var textProps = _a.textProps, onPress = _a.onPress, _e = _a.disabled, disabled = _e === void 0 ? false : _e, textColor = _a.textColor, labelColor = _a.labelColor, _f = _a.size, size = _f === void 0 ? 16 : _f; _a.theme; var _g = _a.required, required = _g === void 0 ? false : _g, props = __rest(_a, ["style", "content", "label", "error", "borderColor", "left", "right", "textStyle", "labelStyle", "textProps", "onPress", "disabled", "textColor", "labelColor", "size", "theme", "required"]);
7215
+ var style = _a.style, _b = _a.content, content = _b === void 0 ? "" : _b, _c = _a.label, label = _c === void 0 ? "" : _c, _d = _a.error, error = _d === void 0 ? "" : _d, borderColor = _a.borderColor; _a.left; var right = _a.right, textStyle = _a.textStyle; _a.labelStyle; var textProps = _a.textProps, onPress = _a.onPress, _e = _a.disabled, disabled = _e === void 0 ? false : _e, textColor = _a.textColor, labelColor = _a.labelColor; _a.theme; var _f = _a.required, required = _f === void 0 ? false : _f, props = __rest(_a, ["style", "content", "label", "error", "borderColor", "left", "right", "textStyle", "labelStyle", "textProps", "onPress", "disabled", "textColor", "labelColor", "theme", "required"]);
7190
7216
  var theme = useInternalTheme();
7191
7217
  var colors = theme.colors;
7192
7218
  var disabledTextStyle = {
@@ -7239,7 +7265,7 @@ var SelectionField = function (_a) {
7239
7265
  ] },
7240
7266
  label,
7241
7267
  required && React__default.createElement(Text$1, { color: colors.textErrorDefault }, " *"))),
7242
- React__default.createElement(Text$1, __assign({ numberOfLines: 1, color: getColor(), size: size, style: [disabled && disabledTextStyle, textStyle] }, textProps),
7268
+ React__default.createElement(Text$1, __assign({ numberOfLines: 1, color: getColor(), style: [disabled && disabledTextStyle, textStyle] }, textProps),
7243
7269
  content.toString() === "" ? label : content,
7244
7270
  required && content.toString() === "" && (React__default.createElement(Text$1, { color: colors.textErrorDefault }, " *")))),
7245
7271
  right || React__default.createElement(Icon$1, { name: "IconArrowDown", type: "Svg", size: 24 }),
@@ -7336,17 +7362,25 @@ var formatNumberInput = function (value, formatDecimal) {
7336
7362
  return result;
7337
7363
  };
7338
7364
  var NumberKeyboard = function (_a) {
7339
- var _b = _a.value, value = _b === void 0 ? "" : _b, _c = _a.label, label = _c === void 0 ? "" : _c, onChangeText = _a.onChangeText, _d = _a.maxValue, maxValue = _d === void 0 ? 999999999999 : _d, _e = _a.type, type = _e === void 0 ? "integer" : _e, _f = _a.formatDecimal, formatDecimal = _f === void 0 ? 3 : _f, visible = _a.visible, onClose = _a.onClose;
7365
+ var _b = _a.value, value = _b === void 0 ? "" : _b, _c = _a.label, label = _c === void 0 ? "" : _c, onChangeText = _a.onChangeText, _d = _a.maxValue, maxValue = _d === void 0 ? 999999999999 : _d, _e = _a.minValue, minValue = _e === void 0 ? 0 : _e, _f = _a.type, type = _f === void 0 ? "integer" : _f, _g = _a.formatDecimal, formatDecimal = _g === void 0 ? 3 : _g, visible = _a.visible, onClose = _a.onClose;
7340
7366
  var theme = useInternalTheme();
7341
7367
  var colors = theme.colors;
7342
- var _g = useState((value === null || value === void 0 ? void 0 : value.toString()) || ""), inputValue = _g[0], setInputValue = _g[1];
7343
- var _h = useState(true), isFirstInput = _h[0], setIsFirstInput = _h[1];
7368
+ var _h = useState((value === null || value === void 0 ? void 0 : value.toString()) || ""), inputValue = _h[0], setInputValue = _h[1];
7369
+ var _j = useState(true), isFirstInput = _j[0], setIsFirstInput = _j[1];
7370
+ var _k = useState(true), canSave = _k[0], setCanSave = _k[1];
7344
7371
  useEffect(function () {
7345
7372
  if (visible) {
7346
7373
  setInputValue((value === null || value === void 0 ? void 0 : value.toString()) || "");
7347
7374
  setIsFirstInput(true);
7348
7375
  }
7349
7376
  }, [visible, value]);
7377
+ useEffect(function () {
7378
+ var currentValue = Number(inputValue);
7379
+ var minValueNumber = Number(minValue);
7380
+ setCanSave(!isNaN(currentValue) &&
7381
+ !isNaN(minValueNumber) &&
7382
+ currentValue >= minValueNumber);
7383
+ }, [inputValue, minValue]);
7350
7384
  var handleKeyPress = useCallback(function (key) {
7351
7385
  if (key === "del") {
7352
7386
  setInputValue(function (prev) { return prev.slice(0, -1); });
@@ -7355,14 +7389,20 @@ var NumberKeyboard = function (_a) {
7355
7389
  }
7356
7390
  if (key === "000") {
7357
7391
  if (type === "integer" && inputValue.length > 0) {
7358
- setInputValue(function (prev) { return prev + "000"; });
7392
+ var newInputValue_1 = inputValue + "000";
7393
+ var newValue_1 = Number(newInputValue_1);
7394
+ var maxValueNumber_1 = Number(maxValue);
7395
+ if (!isNaN(newValue_1) &&
7396
+ !isNaN(maxValueNumber_1) &&
7397
+ newValue_1 <= maxValueNumber_1) {
7398
+ setInputValue(newInputValue_1);
7399
+ }
7359
7400
  setIsFirstInput(false);
7360
7401
  }
7361
7402
  return;
7362
7403
  }
7363
7404
  if (key === ".") {
7364
7405
  if (type === "float" && !inputValue.includes(".")) {
7365
- // Nếu inputValue là "0" hoặc rỗng, giữ lại số 0 và thêm dấu "."
7366
7406
  if (inputValue === "0" || inputValue === "") {
7367
7407
  setInputValue("0.");
7368
7408
  }
@@ -7378,6 +7418,20 @@ var NumberKeyboard = function (_a) {
7378
7418
  setIsFirstInput(false);
7379
7419
  return;
7380
7420
  }
7421
+ // Kiểm tra nếu input bắt đầu bằng 0 và không có dấu chấm
7422
+ if (inputValue === "0") {
7423
+ if (key === ".") {
7424
+ setInputValue("0.");
7425
+ return;
7426
+ }
7427
+ else if (key >= "1" && key <= "9") {
7428
+ setInputValue(key);
7429
+ return;
7430
+ }
7431
+ else {
7432
+ return;
7433
+ }
7434
+ }
7381
7435
  var newInputValue = inputValue + key;
7382
7436
  var newValue = Number(newInputValue);
7383
7437
  var maxValueNumber = Number(maxValue);
@@ -7401,17 +7455,19 @@ var NumberKeyboard = function (_a) {
7401
7455
  }
7402
7456
  }, [inputValue, maxValue, type, formatDecimal, isFirstInput]);
7403
7457
  var handleClear = useCallback(function () {
7404
- setInputValue("0");
7458
+ setInputValue("");
7405
7459
  setIsFirstInput(true);
7406
7460
  }, []);
7407
7461
  var handleSave = useCallback(function () {
7462
+ if (!canSave)
7463
+ return;
7408
7464
  var finalValue = inputValue;
7409
7465
  if (inputValue.endsWith(".")) {
7410
7466
  finalValue = inputValue.slice(0, -1);
7411
7467
  }
7412
7468
  onChangeText === null || onChangeText === void 0 ? void 0 : onChangeText(finalValue);
7413
7469
  onClose();
7414
- }, [inputValue, onChangeText, onClose]);
7470
+ }, [inputValue, onChangeText, onClose, canSave]);
7415
7471
  var handleClose = useCallback(function () {
7416
7472
  onClose();
7417
7473
  setIsFirstInput(true);
@@ -7419,10 +7475,10 @@ var NumberKeyboard = function (_a) {
7419
7475
  return (React__default.createElement(Modal, { visible: visible, transparent: true, animationType: "fade", onRequestClose: handleClose },
7420
7476
  React__default.createElement(TouchableOpacity, { style: styles.modalOverlay, activeOpacity: 1, onPress: handleClose },
7421
7477
  React__default.createElement(View, { onPress: function () { }, activeOpacity: 1, backgroundColor: colors.surfacePrimaryDefault, style: styles.modalContent },
7422
- React__default.createElement(Text$1, { style: styles.modalTitle }, label),
7478
+ React__default.createElement(Text$1, { style: [styles.text18, styles.modalTitle] }, label),
7423
7479
  React__default.createElement(View, { width: "100%" },
7424
7480
  React__default.createElement(View, { paddingHorizontal: SPACE_40 },
7425
- React__default.createElement(Text$1, { numberOfLines: 1, style: styles.valueText }, formatNumberInput(inputValue, formatDecimal) || "0")),
7481
+ React__default.createElement(Text$1, { numberOfLines: 1, style: [styles.text30, styles.valueText] }, formatNumberInput(inputValue, formatDecimal) || "0")),
7426
7482
  React__default.createElement(TouchableOpacity, { onPress: handleClear, style: styles.clearButton },
7427
7483
  React__default.createElement(Icon$1, { name: "IconClearText", type: "Svg", size: 24, color: colors.textSecondary }))),
7428
7484
  React__default.createElement(View, { style: styles.keyboardGrid }, [
@@ -7439,6 +7495,7 @@ var NumberKeyboard = function (_a) {
7439
7495
  ], onPress: function () { return handleKeyPress(key); }, disabled: (key === "000" && type === "float") ||
7440
7496
  (key === "." && inputValue.includes(".")) }, key === "del" ? (React__default.createElement(Icon$1, { name: "IconDelNumber", type: "Svg", size: 24 })) : (React__default.createElement(Text$1, { style: [
7441
7497
  styles.keyText,
7498
+ styles.text22,
7442
7499
  key === "000" &&
7443
7500
  type === "float" &&
7444
7501
  styles.disabledKeyText,
@@ -7448,10 +7505,14 @@ var NumberKeyboard = function (_a) {
7448
7505
  ] }, key)))); }))); })),
7449
7506
  React__default.createElement(View, { style: styles.actionRow },
7450
7507
  React__default.createElement(TouchableOpacity, { activeOpacity: 0.8, style: styles.actionButton, onPress: handleClose },
7451
- React__default.createElement(Text$1, { style: styles.actionText }, "\u0110\u00F3ng")),
7508
+ React__default.createElement(Text$1, { style: [styles.actionText, styles.text16] }, "\u0110\u00F3ng")),
7452
7509
  React__default.createElement(Spacer, { style: { height: "100%" }, width: 1, backgroundColor: colors.borderPrimaryDefault }),
7453
7510
  React__default.createElement(TouchableOpacity, { activeOpacity: 0.8, style: styles.actionButton, onPress: handleSave },
7454
- React__default.createElement(Text$1, { style: [styles.actionText, { color: colors.textBrandDefault }] }, "L\u01B0u")))))));
7511
+ React__default.createElement(Text$1, { style: [
7512
+ styles.actionText,
7513
+ styles.text16,
7514
+ { color: colors.textBrandDefault },
7515
+ ] }, "L\u01B0u")))))));
7455
7516
  };
7456
7517
  var styles = StyleSheet.create(__assign(__assign({}, containerStyles), { modalOverlay: {
7457
7518
  flex: 1,
@@ -7464,12 +7525,10 @@ var styles = StyleSheet.create(__assign(__assign({}, containerStyles), { modalOv
7464
7525
  paddingBottom: 20,
7465
7526
  alignItems: "center",
7466
7527
  }, modalTitle: {
7467
- fontSize: 18,
7468
7528
  textAlign: "center",
7469
7529
  marginTop: 16,
7470
7530
  marginBottom: 8,
7471
7531
  }, valueText: {
7472
- fontSize: 30,
7473
7532
  textAlign: "center",
7474
7533
  }, clearButton: {
7475
7534
  padding: 8,
@@ -7491,7 +7550,6 @@ var styles = StyleSheet.create(__assign(__assign({}, containerStyles), { modalOv
7491
7550
  justifyContent: "center",
7492
7551
  height: 48,
7493
7552
  }, keyText: {
7494
- fontSize: 22,
7495
7553
  fontWeight: "500",
7496
7554
  }, actionRow: {
7497
7555
  flexDirection: "row",
@@ -7504,7 +7562,6 @@ var styles = StyleSheet.create(__assign(__assign({}, containerStyles), { modalOv
7504
7562
  alignItems: "center",
7505
7563
  paddingVertical: 12,
7506
7564
  }, actionText: {
7507
- fontSize: 16,
7508
7565
  fontWeight: "600",
7509
7566
  }, disabledKey: {
7510
7567
  opacity: 0.5,