@cloud-ru/uikit-product-fields-predefined 2.4.8-preview-611dfd0c.0 → 2.4.8-preview-5e39e65e.0

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.
Files changed (32) hide show
  1. package/README.md +8 -3
  2. package/dist/cjs/components/FieldCode/FieldCode.d.ts +3 -8
  3. package/dist/cjs/components/FieldCode/FieldCode.js +2 -9
  4. package/dist/cjs/components/FieldCode/hooks/index.d.ts +1 -1
  5. package/dist/cjs/components/FieldCode/hooks/index.js +1 -1
  6. package/dist/cjs/components/FieldCode/hooks/useFieldCodeValidate.d.ts +8 -0
  7. package/dist/cjs/components/FieldCode/hooks/useFieldCodeValidate.js +24 -0
  8. package/dist/cjs/components/FieldCode/index.d.ts +1 -0
  9. package/dist/cjs/components/FieldCode/index.js +3 -0
  10. package/dist/cjs/components/FieldCode/styles.module.css +1 -1
  11. package/dist/esm/components/FieldCode/FieldCode.d.ts +3 -8
  12. package/dist/esm/components/FieldCode/FieldCode.js +3 -10
  13. package/dist/esm/components/FieldCode/hooks/index.d.ts +1 -1
  14. package/dist/esm/components/FieldCode/hooks/index.js +1 -1
  15. package/dist/esm/components/FieldCode/hooks/useFieldCodeValidate.d.ts +8 -0
  16. package/dist/esm/components/FieldCode/hooks/useFieldCodeValidate.js +21 -0
  17. package/dist/esm/components/FieldCode/index.d.ts +1 -0
  18. package/dist/esm/components/FieldCode/index.js +1 -0
  19. package/dist/esm/components/FieldCode/styles.module.css +1 -1
  20. package/dist/tsconfig.cjs.tsbuildinfo +1 -1
  21. package/dist/tsconfig.esm.tsbuildinfo +1 -1
  22. package/package.json +2 -2
  23. package/src/components/FieldCode/FieldCode.tsx +7 -21
  24. package/src/components/FieldCode/hooks/index.ts +1 -1
  25. package/src/components/FieldCode/hooks/useFieldCodeValidate.ts +35 -0
  26. package/src/components/FieldCode/index.ts +1 -0
  27. package/src/components/FieldCode/styles.module.scss +1 -1
  28. package/dist/cjs/components/FieldCode/hooks/useFieldCodeError.d.ts +0 -14
  29. package/dist/cjs/components/FieldCode/hooks/useFieldCodeError.js +0 -26
  30. package/dist/esm/components/FieldCode/hooks/useFieldCodeError.d.ts +0 -14
  31. package/dist/esm/components/FieldCode/hooks/useFieldCodeError.js +0 -23
  32. package/src/components/FieldCode/hooks/useFieldCodeError.ts +0 -44
package/README.md CHANGED
@@ -351,6 +351,12 @@
351
351
  | onChange | `(value: string, mask: InputMask<Record<string, unknown>>) => void` | - | |
352
352
  | ref | `LegacyRef<HTMLInputElement>` | - | Allows getting a ref to the component instance. Once the component unmounts, React will set `ref.current` to `null` (or call the ref with `null` if you passed a callback ref). @see {@link https://react.dev/learn/referencing-values-with-refs#refs-and-the-dom React Docs} |
353
353
  | key | `Key` | - | |
354
+ ## useFieldCodeValidate
355
+ Возвращает функцию валидации значения кода (пусто / неполный код).
356
+ ### Props
357
+ | name | type | default value | description |
358
+ |------|------|---------------|-------------|
359
+ | codeLength* | `number` | - | Ожидаемая длина кода (цифр) |
354
360
  ## FieldCode
355
361
  ### Props
356
362
  | name | type | default value | description |
@@ -359,11 +365,10 @@
359
365
  | className | `string` | - | CSS-класс компонента |
360
366
  | cellClassName | `string` | - | CSS-класс ячейки кода |
361
367
  | spacing | `number[]` | - | Позиции, после которых нужно вставить пробел (индексы символов, после которых будет пробел) |
362
- | showEmptyChars | `boolean` | - | Подсветить пустые символы кода. Если не задано, совпадает с `validate`. |
368
+ | showEmptyChars | `boolean` | - | Подсветить пустые символы кода |
363
369
  | resendCode | `ResendCodeProps` | - | Компонент отправки нового кода |
364
370
  | focusEffects | `readonly FieldCodeFocusEffect[]` | - | Сценарии автофокуса; по умолчанию — первая ячейка при монтировании и после сброса (см. `FieldCodeFocusEffect`) |
365
- | validate | `boolean` | - | Встроенная валидация: пустое значение и неполный код |
366
- | invalidCode | `boolean` | - | Показать сообщение «неверный код» (учитывается, если нет своего `error` и нет ошибки валидации) |
371
+ | invalidCode | `string` | - | Сообщение при неверном коде, если не передан свой `error` |
367
372
  | value | `string` | - | Значение кода |
368
373
  | onChange | `(code: string) => void` | - | Колбек изменения значения |
369
374
  | onComplete | `(code: string) => void` | - | Колбек достижения ввода всех символов кода |
@@ -18,19 +18,14 @@ export type FieldCodeOwnProps = {
18
18
  cellClassName?: string;
19
19
  /** Позиции, после которых нужно вставить пробел (индексы символов, после которых будет пробел) */
20
20
  spacing?: number[];
21
- /**
22
- * Подсветить пустые символы кода.
23
- * Если не задано, совпадает с `validate`.
24
- */
21
+ /** Подсветить пустые символы кода */
25
22
  showEmptyChars?: boolean;
26
23
  /** Компонент отправки нового кода */
27
24
  resendCode?: ResendCodeProps;
28
25
  /** Сценарии автофокуса; по умолчанию — первая ячейка при монтировании и после сброса (см. `FieldCodeFocusEffect`) */
29
26
  focusEffects?: readonly FieldCodeFocusEffect[];
30
- /** Встроенная валидация: пустое значение и неполный код */
31
- validate?: boolean;
32
- /** Показать сообщение «неверный код» (учитывается, если нет своего `error` и нет ошибки валидации) */
33
- invalidCode?: boolean;
27
+ /** Сообщение при неверном коде, если не передан свой `error` */
28
+ invalidCode?: string;
34
29
  };
35
30
  export type FieldCodeProps = FieldCodeOwnProps & Omit<UseCodeInputParams, 'moveFocus'> & Pick<FieldDecoratorProps, 'size' | 'disabled' | 'label' | 'error' | 'data-test-id'>;
36
31
  export declare const FieldCode: import("react").ForwardRefExoticComponent<FieldCodeOwnProps & Omit<UseCodeInputParams, "moveFocus"> & Pick<FieldDecoratorProps, "size" | "label" | "error" | "disabled" | "data-test-id"> & import("react").RefAttributes<FieldCodeRef>>;
@@ -15,8 +15,7 @@ const styles_module_scss_1 = __importDefault(require('./styles.module.css'));
15
15
  const utils_1 = require("./utils");
16
16
  exports.FieldCode = (0, react_1.forwardRef)(function FieldCode(props, ref) {
17
17
  var _a;
18
- const { codeLength, className, cellClassName, value, onChange, spacing, onComplete, size, disabled, label, error, validate = false, invalidCode = false, showEmptyChars: showEmptyCharsProp, resendCode, focusEffects = constants_1.FIELD_CODE_DEFAULT_FOCUS_EFFECTS, 'data-test-id': dataTestId, } = props;
19
- const showEmptyChars = showEmptyCharsProp !== null && showEmptyCharsProp !== void 0 ? showEmptyCharsProp : validate;
18
+ const { codeLength, className, cellClassName, value, onChange, spacing, onComplete, size, disabled, label, error, invalidCode, showEmptyChars, resendCode, focusEffects = constants_1.FIELD_CODE_DEFAULT_FOCUS_EFFECTS, 'data-test-id': dataTestId, } = props;
20
19
  const { inputsRef, moveFocus, blurFields } = (0, hooks_1.useFocusCell)(codeLength);
21
20
  const { code, cellHandlers, onChangeCode } = (0, hooks_1.useCodeInput)({ value, onChange, codeLength, moveFocus, onComplete });
22
21
  const { resetCode } = (0, hooks_1.useFieldHelpers)({
@@ -32,13 +31,7 @@ exports.FieldCode = (0, react_1.forwardRef)(function FieldCode(props, ref) {
32
31
  blurFields,
33
32
  resetCode,
34
33
  }), [moveFocus, blurFields, resetCode]);
35
- const resolvedError = (0, hooks_1.useFieldCodeError)({
36
- validate,
37
- value,
38
- codeLength,
39
- invalidCode,
40
- error,
41
- });
34
+ const resolvedError = error !== null && error !== void 0 ? error : invalidCode;
42
35
  const resolvedDecoratorProps = {
43
36
  label,
44
37
  disabled,
@@ -1,4 +1,4 @@
1
1
  export * from './useCodeInput';
2
- export * from './useFieldCodeError';
2
+ export * from './useFieldCodeValidate';
3
3
  export * from './useFocusCell';
4
4
  export * from './useFieldHelpers';
@@ -15,6 +15,6 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
15
15
  };
16
16
  Object.defineProperty(exports, "__esModule", { value: true });
17
17
  __exportStar(require("./useCodeInput"), exports);
18
- __exportStar(require("./useFieldCodeError"), exports);
18
+ __exportStar(require("./useFieldCodeValidate"), exports);
19
19
  __exportStar(require("./useFocusCell"), exports);
20
20
  __exportStar(require("./useFieldHelpers"), exports);
@@ -0,0 +1,8 @@
1
+ export type UseFieldCodeValidateParams = {
2
+ /** Ожидаемая длина кода (цифр) */
3
+ codeLength: number;
4
+ };
5
+ /**
6
+ * Возвращает функцию валидации значения кода (пусто / неполный код).
7
+ */
8
+ export declare function useFieldCodeValidate(params: UseFieldCodeValidateParams): (value?: string | number) => string | undefined;
@@ -0,0 +1,24 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.useFieldCodeValidate = useFieldCodeValidate;
4
+ const react_1 = require("react");
5
+ const uikit_product_locale_1 = require("@cloud-ru/uikit-product-locale");
6
+ const utils_1 = require("../utils");
7
+ /**
8
+ * Возвращает функцию валидации значения кода (пусто / неполный код).
9
+ */
10
+ function useFieldCodeValidate(params) {
11
+ const { codeLength } = params;
12
+ const { t } = (0, uikit_product_locale_1.useLocale)('FieldsPredefined');
13
+ return (0, react_1.useCallback)((value) => {
14
+ const str = value != null ? String(value) : '';
15
+ const digits = str.split('').filter(utils_1.isNumberChar).join('');
16
+ if (digits.length === 0) {
17
+ return t('FieldCode.required');
18
+ }
19
+ if (digits.length < codeLength) {
20
+ return t('FieldCode.minLength', { count: codeLength });
21
+ }
22
+ return undefined;
23
+ }, [codeLength, t]);
24
+ }
@@ -1 +1,2 @@
1
1
  export * from './FieldCode';
2
+ export { useFieldCodeValidate, type UseFieldCodeValidateParams } from './hooks/useFieldCodeValidate';
@@ -14,4 +14,7 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
14
  for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
15
  };
16
16
  Object.defineProperty(exports, "__esModule", { value: true });
17
+ exports.useFieldCodeValidate = void 0;
17
18
  __exportStar(require("./FieldCode"), exports);
19
+ var useFieldCodeValidate_1 = require("./hooks/useFieldCodeValidate");
20
+ Object.defineProperty(exports, "useFieldCodeValidate", { enumerable: true, get: function () { return useFieldCodeValidate_1.useFieldCodeValidate; } });
@@ -20,7 +20,7 @@
20
20
  }
21
21
 
22
22
  .cellSpacing[data-size=s]{
23
- margin-right:2px;
23
+ margin-right:8px;
24
24
  }
25
25
  .cellSpacing[data-size=m]{
26
26
  margin-right:8px;
@@ -18,19 +18,14 @@ export type FieldCodeOwnProps = {
18
18
  cellClassName?: string;
19
19
  /** Позиции, после которых нужно вставить пробел (индексы символов, после которых будет пробел) */
20
20
  spacing?: number[];
21
- /**
22
- * Подсветить пустые символы кода.
23
- * Если не задано, совпадает с `validate`.
24
- */
21
+ /** Подсветить пустые символы кода */
25
22
  showEmptyChars?: boolean;
26
23
  /** Компонент отправки нового кода */
27
24
  resendCode?: ResendCodeProps;
28
25
  /** Сценарии автофокуса; по умолчанию — первая ячейка при монтировании и после сброса (см. `FieldCodeFocusEffect`) */
29
26
  focusEffects?: readonly FieldCodeFocusEffect[];
30
- /** Встроенная валидация: пустое значение и неполный код */
31
- validate?: boolean;
32
- /** Показать сообщение «неверный код» (учитывается, если нет своего `error` и нет ошибки валидации) */
33
- invalidCode?: boolean;
27
+ /** Сообщение при неверном коде, если не передан свой `error` */
28
+ invalidCode?: string;
34
29
  };
35
30
  export type FieldCodeProps = FieldCodeOwnProps & Omit<UseCodeInputParams, 'moveFocus'> & Pick<FieldDecoratorProps, 'size' | 'disabled' | 'label' | 'error' | 'data-test-id'>;
36
31
  export declare const FieldCode: import("react").ForwardRefExoticComponent<FieldCodeOwnProps & Omit<UseCodeInputParams, "moveFocus"> & Pick<FieldDecoratorProps, "size" | "label" | "error" | "disabled" | "data-test-id"> & import("react").RefAttributes<FieldCodeRef>>;
@@ -4,13 +4,12 @@ import { forwardRef, useImperativeHandle } from 'react';
4
4
  import { FieldDecorator } from '@snack-uikit/fields';
5
5
  import { Cell, ResendCode } from './components';
6
6
  import { FIELD_CODE_DEFAULT_FOCUS_EFFECTS } from './constants';
7
- import { useCodeInput, useFieldCodeError, useFieldHelpers, useFocusCell } from './hooks';
7
+ import { useCodeInput, useFieldHelpers, useFocusCell } from './hooks';
8
8
  import styles from './styles.module.css';
9
9
  import { getCellValidationState } from './utils';
10
10
  export const FieldCode = forwardRef(function FieldCode(props, ref) {
11
11
  var _a;
12
- const { codeLength, className, cellClassName, value, onChange, spacing, onComplete, size, disabled, label, error, validate = false, invalidCode = false, showEmptyChars: showEmptyCharsProp, resendCode, focusEffects = FIELD_CODE_DEFAULT_FOCUS_EFFECTS, 'data-test-id': dataTestId, } = props;
13
- const showEmptyChars = showEmptyCharsProp !== null && showEmptyCharsProp !== void 0 ? showEmptyCharsProp : validate;
12
+ const { codeLength, className, cellClassName, value, onChange, spacing, onComplete, size, disabled, label, error, invalidCode, showEmptyChars, resendCode, focusEffects = FIELD_CODE_DEFAULT_FOCUS_EFFECTS, 'data-test-id': dataTestId, } = props;
14
13
  const { inputsRef, moveFocus, blurFields } = useFocusCell(codeLength);
15
14
  const { code, cellHandlers, onChangeCode } = useCodeInput({ value, onChange, codeLength, moveFocus, onComplete });
16
15
  const { resetCode } = useFieldHelpers({
@@ -26,13 +25,7 @@ export const FieldCode = forwardRef(function FieldCode(props, ref) {
26
25
  blurFields,
27
26
  resetCode,
28
27
  }), [moveFocus, blurFields, resetCode]);
29
- const resolvedError = useFieldCodeError({
30
- validate,
31
- value,
32
- codeLength,
33
- invalidCode,
34
- error,
35
- });
28
+ const resolvedError = error !== null && error !== void 0 ? error : invalidCode;
36
29
  const resolvedDecoratorProps = {
37
30
  label,
38
31
  disabled,
@@ -1,4 +1,4 @@
1
1
  export * from './useCodeInput';
2
- export * from './useFieldCodeError';
2
+ export * from './useFieldCodeValidate';
3
3
  export * from './useFocusCell';
4
4
  export * from './useFieldHelpers';
@@ -1,4 +1,4 @@
1
1
  export * from './useCodeInput';
2
- export * from './useFieldCodeError';
2
+ export * from './useFieldCodeValidate';
3
3
  export * from './useFocusCell';
4
4
  export * from './useFieldHelpers';
@@ -0,0 +1,8 @@
1
+ export type UseFieldCodeValidateParams = {
2
+ /** Ожидаемая длина кода (цифр) */
3
+ codeLength: number;
4
+ };
5
+ /**
6
+ * Возвращает функцию валидации значения кода (пусто / неполный код).
7
+ */
8
+ export declare function useFieldCodeValidate(params: UseFieldCodeValidateParams): (value?: string | number) => string | undefined;
@@ -0,0 +1,21 @@
1
+ import { useCallback } from 'react';
2
+ import { useLocale } from '@cloud-ru/uikit-product-locale';
3
+ import { isNumberChar } from '../utils';
4
+ /**
5
+ * Возвращает функцию валидации значения кода (пусто / неполный код).
6
+ */
7
+ export function useFieldCodeValidate(params) {
8
+ const { codeLength } = params;
9
+ const { t } = useLocale('FieldsPredefined');
10
+ return useCallback((value) => {
11
+ const str = value != null ? String(value) : '';
12
+ const digits = str.split('').filter(isNumberChar).join('');
13
+ if (digits.length === 0) {
14
+ return t('FieldCode.required');
15
+ }
16
+ if (digits.length < codeLength) {
17
+ return t('FieldCode.minLength', { count: codeLength });
18
+ }
19
+ return undefined;
20
+ }, [codeLength, t]);
21
+ }
@@ -1 +1,2 @@
1
1
  export * from './FieldCode';
2
+ export { useFieldCodeValidate, type UseFieldCodeValidateParams } from './hooks/useFieldCodeValidate';
@@ -1 +1,2 @@
1
1
  export * from './FieldCode';
2
+ export { useFieldCodeValidate } from './hooks/useFieldCodeValidate';
@@ -20,7 +20,7 @@
20
20
  }
21
21
 
22
22
  .cellSpacing[data-size=s]{
23
- margin-right:2px;
23
+ margin-right:8px;
24
24
  }
25
25
  .cellSpacing[data-size=m]{
26
26
  margin-right:8px;