@alfalab/core-components-bank-card 5.6.8 → 5.7.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.
- package/Component.d.ts +6 -0
- package/Component.js +15 -10
- package/cssm/Component.d.ts +6 -0
- package/cssm/Component.js +14 -9
- package/cssm/enums.d.ts +6 -0
- package/cssm/enums.js +10 -0
- package/cssm/helpers/getDefaultInputLabel.d.ts +3 -0
- package/cssm/helpers/getDefaultInputLabel.js +19 -0
- package/cssm/types.d.ts +2 -0
- package/cssm/types.js +2 -0
- package/enums.d.ts +6 -0
- package/enums.js +10 -0
- package/esm/Component.d.ts +6 -0
- package/esm/Component.js +15 -10
- package/esm/enums.d.ts +6 -0
- package/esm/enums.js +8 -0
- package/esm/helpers/getDefaultInputLabel.d.ts +3 -0
- package/esm/helpers/getDefaultInputLabel.js +15 -0
- package/esm/index.css +20 -20
- package/esm/types.d.ts +2 -0
- package/esm/types.js +1 -0
- package/helpers/getDefaultInputLabel.d.ts +3 -0
- package/helpers/getDefaultInputLabel.js +19 -0
- package/index.css +20 -20
- package/modern/Component.d.ts +6 -0
- package/modern/Component.js +15 -8
- package/modern/enums.d.ts +6 -0
- package/modern/enums.js +8 -0
- package/modern/helpers/getDefaultInputLabel.d.ts +3 -0
- package/modern/helpers/getDefaultInputLabel.js +15 -0
- package/modern/index.css +20 -20
- package/modern/types.d.ts +2 -0
- package/modern/types.js +1 -0
- package/package.json +2 -2
- package/src/Component.tsx +23 -10
- package/src/enums.ts +5 -0
- package/src/helpers/getDefaultInputLabel.tsx +14 -0
- package/src/types.ts +1 -0
- package/types.d.ts +2 -0
- package/types.js +2 -0
package/Component.d.ts
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
/// <reference types="react" />
|
|
2
2
|
import React from 'react';
|
|
3
3
|
import { ChangeEvent, MouseEvent, ReactNode } from "react";
|
|
4
|
+
import { MaskType } from "./types";
|
|
4
5
|
type BankCardProps = {
|
|
5
6
|
/**
|
|
6
7
|
* Дополнительный класс
|
|
@@ -36,6 +37,11 @@ type BankCardProps = {
|
|
|
36
37
|
* Идентификатор для систем автоматизированного тестирования
|
|
37
38
|
*/
|
|
38
39
|
dataTestId?: string;
|
|
40
|
+
/**
|
|
41
|
+
* Тип вводимой маски. Позволяет устанавливать необходимый тип номера (номер карты или номер счёта)
|
|
42
|
+
* Если параметр не передавать - работает с обоими типами номеров
|
|
43
|
+
*/
|
|
44
|
+
maskType?: MaskType;
|
|
39
45
|
};
|
|
40
46
|
declare const BankCard: React.ForwardRefExoticComponent<BankCardProps & React.RefAttributes<HTMLInputElement>>;
|
|
41
47
|
export { BankCardProps, BankCard };
|
package/Component.js
CHANGED
|
@@ -10,6 +10,8 @@ var AlfaBankLIcon = require('@alfalab/icons-logotype/AlfaBankLIcon');
|
|
|
10
10
|
var MastercardLIcon = require('@alfalab/icons-logotype/MastercardLIcon');
|
|
11
11
|
var MirXxlIcon = require('@alfalab/icons-logotype/MirXxlIcon');
|
|
12
12
|
var VisaXxlIcon = require('@alfalab/icons-logotype/VisaXxlIcon');
|
|
13
|
+
var helpers_getDefaultInputLabel = require('./helpers/getDefaultInputLabel.js');
|
|
14
|
+
var enums = require('./enums.js');
|
|
13
15
|
var utils = require('./utils.js');
|
|
14
16
|
|
|
15
17
|
function _interopDefaultCompat (e) { return e && typeof e === 'object' && 'default' in e ? e : { default: e }; }
|
|
@@ -17,7 +19,7 @@ function _interopDefaultCompat (e) { return e && typeof e === 'object' && 'defau
|
|
|
17
19
|
var React__default = /*#__PURE__*/_interopDefaultCompat(React);
|
|
18
20
|
var cn__default = /*#__PURE__*/_interopDefaultCompat(cn);
|
|
19
21
|
|
|
20
|
-
var styles = {"component":"bank-
|
|
22
|
+
var styles = {"component":"bank-card__component_k6v85","aspectRatioContainer":"bank-card__aspectRatioContainer_k6v85","content":"bank-card__content_k6v85","label":"bank-card__label_k6v85","focused":"bank-card__focused_k6v85","filled":"bank-card__filled_k6v85","input":"bank-card__input_k6v85","bankLogo":"bank-card__bankLogo_k6v85","brandLogo":"bank-card__brandLogo_k6v85","usePhoto":"bank-card__usePhoto_k6v85"};
|
|
21
23
|
require('./index.css')
|
|
22
24
|
|
|
23
25
|
// prettier-ignore
|
|
@@ -40,12 +42,20 @@ var getBrandIcon = function (value) {
|
|
|
40
42
|
return null;
|
|
41
43
|
};
|
|
42
44
|
var BankCard = React__default.default.forwardRef(function (_a, ref) {
|
|
43
|
-
var _b = _a.bankLogo, bankLogo = _b === void 0 ? React__default.default.createElement(AlfaBankLIcon.AlfaBankLIcon, null) : _b, _c = _a.backgroundColor, backgroundColor = _c === void 0 ? '#EF3124' : _c,
|
|
45
|
+
var _b = _a.bankLogo, bankLogo = _b === void 0 ? React__default.default.createElement(AlfaBankLIcon.AlfaBankLIcon, null) : _b, _c = _a.backgroundColor, backgroundColor = _c === void 0 ? '#EF3124' : _c, value = _a.value, className = _a.className, onUsePhoto = _a.onUsePhoto, onChange = _a.onChange, dataTestId = _a.dataTestId, _d = _a.maskType, maskType = _d === void 0 ? enums.MaskTypeEnum.Default : _d, _e = _a.inputLabel, inputLabel = _e === void 0 ? helpers_getDefaultInputLabel.getDefaultInputLabel(maskType) : _e;
|
|
44
46
|
var uncontrolled = value === undefined;
|
|
45
|
-
var
|
|
47
|
+
var _f = React.useState(getBrandIcon(value)), brandIcon = _f[0], setBrandIcon = _f[1];
|
|
46
48
|
var getMask = React.useCallback(function (newValue) {
|
|
47
|
-
|
|
48
|
-
|
|
49
|
+
switch (maskType) {
|
|
50
|
+
case enums.MaskTypeEnum.Card:
|
|
51
|
+
return cardMask;
|
|
52
|
+
case enums.MaskTypeEnum.AccountNumber:
|
|
53
|
+
return accountNumberMask;
|
|
54
|
+
case enums.MaskTypeEnum.Default:
|
|
55
|
+
default:
|
|
56
|
+
return newValue.length <= cardMask.length ? cardMask : accountNumberMask;
|
|
57
|
+
}
|
|
58
|
+
}, [maskType]);
|
|
49
59
|
var handleInputChange = React.useCallback(function (event, payload) {
|
|
50
60
|
if (uncontrolled) {
|
|
51
61
|
setBrandIcon(getBrandIcon(event.target.value));
|
|
@@ -66,10 +76,5 @@ var BankCard = React__default.default.forwardRef(function (_a, ref) {
|
|
|
66
76
|
React__default.default.createElement(coreComponentsMaskedInput.MaskedInput, { ref: ref, value: value, mask: getMask, block: true, label: inputLabel, size: 'm', rightAddons: renderRightAddons(), inputClassName: styles.input, labelClassName: styles.label, filledClassName: styles.filled, focusedClassName: styles.focused, onChange: handleInputChange, dataTestId: dataTestId, inputMode: 'numeric', pattern: '[0-9]*', breakpoint: 1 }),
|
|
67
77
|
brandIcon && React__default.default.createElement("div", { className: styles.brandLogo }, brandIcon)))));
|
|
68
78
|
});
|
|
69
|
-
BankCard.defaultProps = {
|
|
70
|
-
bankLogo: React__default.default.createElement(AlfaBankLIcon.AlfaBankLIcon, null),
|
|
71
|
-
backgroundColor: '#EF3124',
|
|
72
|
-
inputLabel: 'Номер карты или счёта',
|
|
73
|
-
};
|
|
74
79
|
|
|
75
80
|
exports.BankCard = BankCard;
|
package/cssm/Component.d.ts
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
/// <reference types="react" />
|
|
2
2
|
import React from 'react';
|
|
3
3
|
import { ChangeEvent, MouseEvent, ReactNode } from "react";
|
|
4
|
+
import { MaskType } from "./types";
|
|
4
5
|
type BankCardProps = {
|
|
5
6
|
/**
|
|
6
7
|
* Дополнительный класс
|
|
@@ -36,6 +37,11 @@ type BankCardProps = {
|
|
|
36
37
|
* Идентификатор для систем автоматизированного тестирования
|
|
37
38
|
*/
|
|
38
39
|
dataTestId?: string;
|
|
40
|
+
/**
|
|
41
|
+
* Тип вводимой маски. Позволяет устанавливать необходимый тип номера (номер карты или номер счёта)
|
|
42
|
+
* Если параметр не передавать - работает с обоими типами номеров
|
|
43
|
+
*/
|
|
44
|
+
maskType?: MaskType;
|
|
39
45
|
};
|
|
40
46
|
declare const BankCard: React.ForwardRefExoticComponent<BankCardProps & React.RefAttributes<HTMLInputElement>>;
|
|
41
47
|
export { BankCardProps, BankCard };
|
package/cssm/Component.js
CHANGED
|
@@ -10,6 +10,8 @@ var AlfaBankLIcon = require('@alfalab/icons-logotype/AlfaBankLIcon');
|
|
|
10
10
|
var MastercardLIcon = require('@alfalab/icons-logotype/MastercardLIcon');
|
|
11
11
|
var MirXxlIcon = require('@alfalab/icons-logotype/MirXxlIcon');
|
|
12
12
|
var VisaXxlIcon = require('@alfalab/icons-logotype/VisaXxlIcon');
|
|
13
|
+
var helpers_getDefaultInputLabel = require('./helpers/getDefaultInputLabel.js');
|
|
14
|
+
var enums = require('./enums.js');
|
|
13
15
|
var utils = require('./utils.js');
|
|
14
16
|
var styles = require('./index.module.css');
|
|
15
17
|
|
|
@@ -39,12 +41,20 @@ var getBrandIcon = function (value) {
|
|
|
39
41
|
return null;
|
|
40
42
|
};
|
|
41
43
|
var BankCard = React__default.default.forwardRef(function (_a, ref) {
|
|
42
|
-
var _b = _a.bankLogo, bankLogo = _b === void 0 ? React__default.default.createElement(AlfaBankLIcon.AlfaBankLIcon, null) : _b, _c = _a.backgroundColor, backgroundColor = _c === void 0 ? '#EF3124' : _c,
|
|
44
|
+
var _b = _a.bankLogo, bankLogo = _b === void 0 ? React__default.default.createElement(AlfaBankLIcon.AlfaBankLIcon, null) : _b, _c = _a.backgroundColor, backgroundColor = _c === void 0 ? '#EF3124' : _c, value = _a.value, className = _a.className, onUsePhoto = _a.onUsePhoto, onChange = _a.onChange, dataTestId = _a.dataTestId, _d = _a.maskType, maskType = _d === void 0 ? enums.MaskTypeEnum.Default : _d, _e = _a.inputLabel, inputLabel = _e === void 0 ? helpers_getDefaultInputLabel.getDefaultInputLabel(maskType) : _e;
|
|
43
45
|
var uncontrolled = value === undefined;
|
|
44
|
-
var
|
|
46
|
+
var _f = React.useState(getBrandIcon(value)), brandIcon = _f[0], setBrandIcon = _f[1];
|
|
45
47
|
var getMask = React.useCallback(function (newValue) {
|
|
46
|
-
|
|
47
|
-
|
|
48
|
+
switch (maskType) {
|
|
49
|
+
case enums.MaskTypeEnum.Card:
|
|
50
|
+
return cardMask;
|
|
51
|
+
case enums.MaskTypeEnum.AccountNumber:
|
|
52
|
+
return accountNumberMask;
|
|
53
|
+
case enums.MaskTypeEnum.Default:
|
|
54
|
+
default:
|
|
55
|
+
return newValue.length <= cardMask.length ? cardMask : accountNumberMask;
|
|
56
|
+
}
|
|
57
|
+
}, [maskType]);
|
|
48
58
|
var handleInputChange = React.useCallback(function (event, payload) {
|
|
49
59
|
if (uncontrolled) {
|
|
50
60
|
setBrandIcon(getBrandIcon(event.target.value));
|
|
@@ -65,10 +75,5 @@ var BankCard = React__default.default.forwardRef(function (_a, ref) {
|
|
|
65
75
|
React__default.default.createElement(coreComponentsMaskedInput.MaskedInput, { ref: ref, value: value, mask: getMask, block: true, label: inputLabel, size: 'm', rightAddons: renderRightAddons(), inputClassName: styles__default.default.input, labelClassName: styles__default.default.label, filledClassName: styles__default.default.filled, focusedClassName: styles__default.default.focused, onChange: handleInputChange, dataTestId: dataTestId, inputMode: 'numeric', pattern: '[0-9]*', breakpoint: 1 }),
|
|
66
76
|
brandIcon && React__default.default.createElement("div", { className: styles__default.default.brandLogo }, brandIcon)))));
|
|
67
77
|
});
|
|
68
|
-
BankCard.defaultProps = {
|
|
69
|
-
bankLogo: React__default.default.createElement(AlfaBankLIcon.AlfaBankLIcon, null),
|
|
70
|
-
backgroundColor: '#EF3124',
|
|
71
|
-
inputLabel: 'Номер карты или счёта',
|
|
72
|
-
};
|
|
73
78
|
|
|
74
79
|
exports.BankCard = BankCard;
|
package/cssm/enums.d.ts
ADDED
package/cssm/enums.js
ADDED
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, '__esModule', { value: true });
|
|
4
|
+
|
|
5
|
+
exports.MaskTypeEnum = void 0;
|
|
6
|
+
(function (MaskTypeEnum) {
|
|
7
|
+
MaskTypeEnum["Card"] = "card";
|
|
8
|
+
MaskTypeEnum["AccountNumber"] = "account-number";
|
|
9
|
+
MaskTypeEnum["Default"] = "default";
|
|
10
|
+
})(exports.MaskTypeEnum || (exports.MaskTypeEnum = {}));
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, '__esModule', { value: true });
|
|
4
|
+
|
|
5
|
+
var enums = require('../enums.js');
|
|
6
|
+
|
|
7
|
+
var getDefaultInputLabel = function (maskType) {
|
|
8
|
+
switch (maskType) {
|
|
9
|
+
case enums.MaskTypeEnum.Card:
|
|
10
|
+
return 'Номер карты';
|
|
11
|
+
case enums.MaskTypeEnum.AccountNumber:
|
|
12
|
+
return 'Номер счёта';
|
|
13
|
+
case enums.MaskTypeEnum.Default:
|
|
14
|
+
default:
|
|
15
|
+
return 'Номер карты или счёта';
|
|
16
|
+
}
|
|
17
|
+
};
|
|
18
|
+
|
|
19
|
+
exports.getDefaultInputLabel = getDefaultInputLabel;
|
package/cssm/types.d.ts
ADDED
package/cssm/types.js
ADDED
package/enums.d.ts
ADDED
package/enums.js
ADDED
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, '__esModule', { value: true });
|
|
4
|
+
|
|
5
|
+
exports.MaskTypeEnum = void 0;
|
|
6
|
+
(function (MaskTypeEnum) {
|
|
7
|
+
MaskTypeEnum["Card"] = "card";
|
|
8
|
+
MaskTypeEnum["AccountNumber"] = "account-number";
|
|
9
|
+
MaskTypeEnum["Default"] = "default";
|
|
10
|
+
})(exports.MaskTypeEnum || (exports.MaskTypeEnum = {}));
|
package/esm/Component.d.ts
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
/// <reference types="react" />
|
|
2
2
|
import React from 'react';
|
|
3
3
|
import { ChangeEvent, MouseEvent, ReactNode } from "react";
|
|
4
|
+
import { MaskType } from "./types";
|
|
4
5
|
type BankCardProps = {
|
|
5
6
|
/**
|
|
6
7
|
* Дополнительный класс
|
|
@@ -36,6 +37,11 @@ type BankCardProps = {
|
|
|
36
37
|
* Идентификатор для систем автоматизированного тестирования
|
|
37
38
|
*/
|
|
38
39
|
dataTestId?: string;
|
|
40
|
+
/**
|
|
41
|
+
* Тип вводимой маски. Позволяет устанавливать необходимый тип номера (номер карты или номер счёта)
|
|
42
|
+
* Если параметр не передавать - работает с обоими типами номеров
|
|
43
|
+
*/
|
|
44
|
+
maskType?: MaskType;
|
|
39
45
|
};
|
|
40
46
|
declare const BankCard: React.ForwardRefExoticComponent<BankCardProps & React.RefAttributes<HTMLInputElement>>;
|
|
41
47
|
export { BankCardProps, BankCard };
|
package/esm/Component.js
CHANGED
|
@@ -6,9 +6,11 @@ import { AlfaBankLIcon } from '@alfalab/icons-logotype/AlfaBankLIcon';
|
|
|
6
6
|
import { MastercardLIcon } from '@alfalab/icons-logotype/MastercardLIcon';
|
|
7
7
|
import { MirXxlIcon } from '@alfalab/icons-logotype/MirXxlIcon';
|
|
8
8
|
import { VisaXxlIcon } from '@alfalab/icons-logotype/VisaXxlIcon';
|
|
9
|
+
import { getDefaultInputLabel } from './helpers/getDefaultInputLabel.js';
|
|
10
|
+
import { MaskTypeEnum } from './enums.js';
|
|
9
11
|
import { validateCardNumber } from './utils.js';
|
|
10
12
|
|
|
11
|
-
var styles = {"component":"bank-
|
|
13
|
+
var styles = {"component":"bank-card__component_k6v85","aspectRatioContainer":"bank-card__aspectRatioContainer_k6v85","content":"bank-card__content_k6v85","label":"bank-card__label_k6v85","focused":"bank-card__focused_k6v85","filled":"bank-card__filled_k6v85","input":"bank-card__input_k6v85","bankLogo":"bank-card__bankLogo_k6v85","brandLogo":"bank-card__brandLogo_k6v85","usePhoto":"bank-card__usePhoto_k6v85"};
|
|
12
14
|
require('./index.css')
|
|
13
15
|
|
|
14
16
|
// prettier-ignore
|
|
@@ -31,12 +33,20 @@ var getBrandIcon = function (value) {
|
|
|
31
33
|
return null;
|
|
32
34
|
};
|
|
33
35
|
var BankCard = React.forwardRef(function (_a, ref) {
|
|
34
|
-
var _b = _a.bankLogo, bankLogo = _b === void 0 ? React.createElement(AlfaBankLIcon, null) : _b, _c = _a.backgroundColor, backgroundColor = _c === void 0 ? '#EF3124' : _c,
|
|
36
|
+
var _b = _a.bankLogo, bankLogo = _b === void 0 ? React.createElement(AlfaBankLIcon, null) : _b, _c = _a.backgroundColor, backgroundColor = _c === void 0 ? '#EF3124' : _c, value = _a.value, className = _a.className, onUsePhoto = _a.onUsePhoto, onChange = _a.onChange, dataTestId = _a.dataTestId, _d = _a.maskType, maskType = _d === void 0 ? MaskTypeEnum.Default : _d, _e = _a.inputLabel, inputLabel = _e === void 0 ? getDefaultInputLabel(maskType) : _e;
|
|
35
37
|
var uncontrolled = value === undefined;
|
|
36
|
-
var
|
|
38
|
+
var _f = useState(getBrandIcon(value)), brandIcon = _f[0], setBrandIcon = _f[1];
|
|
37
39
|
var getMask = useCallback(function (newValue) {
|
|
38
|
-
|
|
39
|
-
|
|
40
|
+
switch (maskType) {
|
|
41
|
+
case MaskTypeEnum.Card:
|
|
42
|
+
return cardMask;
|
|
43
|
+
case MaskTypeEnum.AccountNumber:
|
|
44
|
+
return accountNumberMask;
|
|
45
|
+
case MaskTypeEnum.Default:
|
|
46
|
+
default:
|
|
47
|
+
return newValue.length <= cardMask.length ? cardMask : accountNumberMask;
|
|
48
|
+
}
|
|
49
|
+
}, [maskType]);
|
|
40
50
|
var handleInputChange = useCallback(function (event, payload) {
|
|
41
51
|
if (uncontrolled) {
|
|
42
52
|
setBrandIcon(getBrandIcon(event.target.value));
|
|
@@ -57,10 +67,5 @@ var BankCard = React.forwardRef(function (_a, ref) {
|
|
|
57
67
|
React.createElement(MaskedInput, { ref: ref, value: value, mask: getMask, block: true, label: inputLabel, size: 'm', rightAddons: renderRightAddons(), inputClassName: styles.input, labelClassName: styles.label, filledClassName: styles.filled, focusedClassName: styles.focused, onChange: handleInputChange, dataTestId: dataTestId, inputMode: 'numeric', pattern: '[0-9]*', breakpoint: 1 }),
|
|
58
68
|
brandIcon && React.createElement("div", { className: styles.brandLogo }, brandIcon)))));
|
|
59
69
|
});
|
|
60
|
-
BankCard.defaultProps = {
|
|
61
|
-
bankLogo: React.createElement(AlfaBankLIcon, null),
|
|
62
|
-
backgroundColor: '#EF3124',
|
|
63
|
-
inputLabel: 'Номер карты или счёта',
|
|
64
|
-
};
|
|
65
70
|
|
|
66
71
|
export { BankCard };
|
package/esm/enums.d.ts
ADDED
package/esm/enums.js
ADDED
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { MaskTypeEnum } from '../enums.js';
|
|
2
|
+
|
|
3
|
+
var getDefaultInputLabel = function (maskType) {
|
|
4
|
+
switch (maskType) {
|
|
5
|
+
case MaskTypeEnum.Card:
|
|
6
|
+
return 'Номер карты';
|
|
7
|
+
case MaskTypeEnum.AccountNumber:
|
|
8
|
+
return 'Номер счёта';
|
|
9
|
+
case MaskTypeEnum.Default:
|
|
10
|
+
default:
|
|
11
|
+
return 'Номер карты или счёта';
|
|
12
|
+
}
|
|
13
|
+
};
|
|
14
|
+
|
|
15
|
+
export { getDefaultInputLabel };
|
package/esm/index.css
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/* hash:
|
|
1
|
+
/* hash: 11twg */
|
|
2
2
|
:root { /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */
|
|
3
3
|
} /* deprecated */ :root {
|
|
4
4
|
--color-light-neutral-1500: #121213;
|
|
@@ -22,7 +22,7 @@
|
|
|
22
22
|
--font-family-styrene: 'Styrene UI', system-ui, -apple-system, 'Segoe UI', Roboto,
|
|
23
23
|
'Helvetica Neue', Helvetica, sans-serif;
|
|
24
24
|
} :root {
|
|
25
|
-
} .bank-
|
|
25
|
+
} .bank-card__component_k6v85 {
|
|
26
26
|
/* TODO: как это будет собираться и работать в webView */
|
|
27
27
|
--form-control-border-radius: 0;
|
|
28
28
|
--form-control-border-bottom: 1px solid var(--color-light-neutral-translucent-700);
|
|
@@ -41,10 +41,10 @@
|
|
|
41
41
|
max-width: 343px;
|
|
42
42
|
|
|
43
43
|
font-family: var(--font-family-styrene);
|
|
44
|
-
} .bank-
|
|
44
|
+
} .bank-card__aspectRatioContainer_k6v85 {
|
|
45
45
|
/* Эталонный размер 343x216 */
|
|
46
46
|
padding-bottom: 63%;
|
|
47
|
-
} .bank-
|
|
47
|
+
} .bank-card__content_k6v85 {
|
|
48
48
|
position: absolute;
|
|
49
49
|
top: 0;
|
|
50
50
|
right: 0;
|
|
@@ -56,26 +56,26 @@
|
|
|
56
56
|
padding-right: var(--gap-l);
|
|
57
57
|
border-radius: var(--border-radius-l);
|
|
58
58
|
box-sizing: border-box;
|
|
59
|
-
} .bank-
|
|
59
|
+
} .bank-card__label_k6v85 {
|
|
60
60
|
left: 0;
|
|
61
61
|
transform: translateY(-1px);
|
|
62
62
|
color: var(--color-light-text-secondary);
|
|
63
63
|
font-size: 20px;
|
|
64
64
|
line-height: 24px
|
|
65
|
-
} @media (max-width: 360px) { .bank-
|
|
65
|
+
} @media (max-width: 360px) { .bank-card__label_k6v85 {
|
|
66
66
|
font-size: 16px
|
|
67
67
|
}
|
|
68
|
-
} .bank-
|
|
69
|
-
.bank-
|
|
68
|
+
} .bank-card__focused_k6v85 .bank-card__label_k6v85,
|
|
69
|
+
.bank-card__filled_k6v85 .bank-card__label_k6v85 {
|
|
70
70
|
color: var(--color-light-neutral-1500);
|
|
71
71
|
transform: translateY(-19px) scale(0.6)
|
|
72
|
-
} @media (max-width: 360px) { .bank-
|
|
73
|
-
.bank-
|
|
72
|
+
} @media (max-width: 360px) { .bank-card__focused_k6v85 .bank-card__label_k6v85,
|
|
73
|
+
.bank-card__filled_k6v85 .bank-card__label_k6v85 {
|
|
74
74
|
transform: translateY(-22px) scale(0.75)
|
|
75
75
|
}
|
|
76
|
-
} .bank-
|
|
76
|
+
} .bank-card__focused_k6v85:before {
|
|
77
77
|
transform: scale(1) !important;
|
|
78
|
-
} .bank-
|
|
78
|
+
} .bank-card__input_k6v85 {
|
|
79
79
|
font-size: 20px;
|
|
80
80
|
line-height: 24px;
|
|
81
81
|
font-weight: 400;
|
|
@@ -88,27 +88,27 @@
|
|
|
88
88
|
/* TODO: обсудить с дизайнером, почему инпут не соответствует дизайн-системе, либо уменьшить каскад в form-control */
|
|
89
89
|
padding-left: 0 !important;
|
|
90
90
|
padding-bottom: var(--gap-2xs) !important
|
|
91
|
-
} @media (max-width: 360px) { .bank-
|
|
91
|
+
} @media (max-width: 360px) { .bank-card__input_k6v85 {
|
|
92
92
|
font-size: 16px
|
|
93
93
|
}
|
|
94
|
-
} .bank-
|
|
94
|
+
} .bank-card__bankLogo_k6v85 {
|
|
95
95
|
position: absolute;
|
|
96
96
|
top: 20px;
|
|
97
97
|
left: 20px
|
|
98
|
-
} .bank-
|
|
98
|
+
} .bank-card__bankLogo_k6v85 svg {
|
|
99
99
|
max-height: 32px;
|
|
100
100
|
width: auto;
|
|
101
101
|
display: block
|
|
102
|
-
} .bank-
|
|
102
|
+
} .bank-card__bankLogo_k6v85 svg g {
|
|
103
103
|
fill: var(--color-light-neutral-1500);
|
|
104
|
-
} .bank-
|
|
104
|
+
} .bank-card__brandLogo_k6v85 {
|
|
105
105
|
position: absolute;
|
|
106
106
|
bottom: 20px;
|
|
107
107
|
right: 20px
|
|
108
|
-
} .bank-
|
|
108
|
+
} .bank-card__brandLogo_k6v85 svg {
|
|
109
109
|
display: block;
|
|
110
110
|
fill: var(--color-light-neutral-1500);
|
|
111
|
-
} .bank-
|
|
111
|
+
} .bank-card__usePhoto_k6v85 {
|
|
112
112
|
display: block;
|
|
113
113
|
margin: 0;
|
|
114
114
|
padding: 0;
|
|
@@ -125,7 +125,7 @@
|
|
|
125
125
|
|
|
126
126
|
/* В макете иконка прилегает к правому краю поля, а по дизайн-системе там должен быть отступ */
|
|
127
127
|
margin-right: calc(var(--gap-s) * -1)
|
|
128
|
-
} .bank-
|
|
128
|
+
} .bank-card__usePhoto_k6v85 svg {
|
|
129
129
|
fill: var(--color-light-neutral-1500);
|
|
130
130
|
display: block;
|
|
131
131
|
}
|
package/esm/types.d.ts
ADDED
package/esm/types.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, '__esModule', { value: true });
|
|
4
|
+
|
|
5
|
+
var enums = require('../enums.js');
|
|
6
|
+
|
|
7
|
+
var getDefaultInputLabel = function (maskType) {
|
|
8
|
+
switch (maskType) {
|
|
9
|
+
case enums.MaskTypeEnum.Card:
|
|
10
|
+
return 'Номер карты';
|
|
11
|
+
case enums.MaskTypeEnum.AccountNumber:
|
|
12
|
+
return 'Номер счёта';
|
|
13
|
+
case enums.MaskTypeEnum.Default:
|
|
14
|
+
default:
|
|
15
|
+
return 'Номер карты или счёта';
|
|
16
|
+
}
|
|
17
|
+
};
|
|
18
|
+
|
|
19
|
+
exports.getDefaultInputLabel = getDefaultInputLabel;
|
package/index.css
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/* hash:
|
|
1
|
+
/* hash: 11twg */
|
|
2
2
|
:root { /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */
|
|
3
3
|
} /* deprecated */ :root {
|
|
4
4
|
--color-light-neutral-1500: #121213;
|
|
@@ -22,7 +22,7 @@
|
|
|
22
22
|
--font-family-styrene: 'Styrene UI', system-ui, -apple-system, 'Segoe UI', Roboto,
|
|
23
23
|
'Helvetica Neue', Helvetica, sans-serif;
|
|
24
24
|
} :root {
|
|
25
|
-
} .bank-
|
|
25
|
+
} .bank-card__component_k6v85 {
|
|
26
26
|
/* TODO: как это будет собираться и работать в webView */
|
|
27
27
|
--form-control-border-radius: 0;
|
|
28
28
|
--form-control-border-bottom: 1px solid var(--color-light-neutral-translucent-700);
|
|
@@ -41,10 +41,10 @@
|
|
|
41
41
|
max-width: 343px;
|
|
42
42
|
|
|
43
43
|
font-family: var(--font-family-styrene);
|
|
44
|
-
} .bank-
|
|
44
|
+
} .bank-card__aspectRatioContainer_k6v85 {
|
|
45
45
|
/* Эталонный размер 343x216 */
|
|
46
46
|
padding-bottom: 63%;
|
|
47
|
-
} .bank-
|
|
47
|
+
} .bank-card__content_k6v85 {
|
|
48
48
|
position: absolute;
|
|
49
49
|
top: 0;
|
|
50
50
|
right: 0;
|
|
@@ -56,26 +56,26 @@
|
|
|
56
56
|
padding-right: var(--gap-l);
|
|
57
57
|
border-radius: var(--border-radius-l);
|
|
58
58
|
box-sizing: border-box;
|
|
59
|
-
} .bank-
|
|
59
|
+
} .bank-card__label_k6v85 {
|
|
60
60
|
left: 0;
|
|
61
61
|
transform: translateY(-1px);
|
|
62
62
|
color: var(--color-light-text-secondary);
|
|
63
63
|
font-size: 20px;
|
|
64
64
|
line-height: 24px
|
|
65
|
-
} @media (max-width: 360px) { .bank-
|
|
65
|
+
} @media (max-width: 360px) { .bank-card__label_k6v85 {
|
|
66
66
|
font-size: 16px
|
|
67
67
|
}
|
|
68
|
-
} .bank-
|
|
69
|
-
.bank-
|
|
68
|
+
} .bank-card__focused_k6v85 .bank-card__label_k6v85,
|
|
69
|
+
.bank-card__filled_k6v85 .bank-card__label_k6v85 {
|
|
70
70
|
color: var(--color-light-neutral-1500);
|
|
71
71
|
transform: translateY(-19px) scale(0.6)
|
|
72
|
-
} @media (max-width: 360px) { .bank-
|
|
73
|
-
.bank-
|
|
72
|
+
} @media (max-width: 360px) { .bank-card__focused_k6v85 .bank-card__label_k6v85,
|
|
73
|
+
.bank-card__filled_k6v85 .bank-card__label_k6v85 {
|
|
74
74
|
transform: translateY(-22px) scale(0.75)
|
|
75
75
|
}
|
|
76
|
-
} .bank-
|
|
76
|
+
} .bank-card__focused_k6v85:before {
|
|
77
77
|
transform: scale(1) !important;
|
|
78
|
-
} .bank-
|
|
78
|
+
} .bank-card__input_k6v85 {
|
|
79
79
|
font-size: 20px;
|
|
80
80
|
line-height: 24px;
|
|
81
81
|
font-weight: 400;
|
|
@@ -88,27 +88,27 @@
|
|
|
88
88
|
/* TODO: обсудить с дизайнером, почему инпут не соответствует дизайн-системе, либо уменьшить каскад в form-control */
|
|
89
89
|
padding-left: 0 !important;
|
|
90
90
|
padding-bottom: var(--gap-2xs) !important
|
|
91
|
-
} @media (max-width: 360px) { .bank-
|
|
91
|
+
} @media (max-width: 360px) { .bank-card__input_k6v85 {
|
|
92
92
|
font-size: 16px
|
|
93
93
|
}
|
|
94
|
-
} .bank-
|
|
94
|
+
} .bank-card__bankLogo_k6v85 {
|
|
95
95
|
position: absolute;
|
|
96
96
|
top: 20px;
|
|
97
97
|
left: 20px
|
|
98
|
-
} .bank-
|
|
98
|
+
} .bank-card__bankLogo_k6v85 svg {
|
|
99
99
|
max-height: 32px;
|
|
100
100
|
width: auto;
|
|
101
101
|
display: block
|
|
102
|
-
} .bank-
|
|
102
|
+
} .bank-card__bankLogo_k6v85 svg g {
|
|
103
103
|
fill: var(--color-light-neutral-1500);
|
|
104
|
-
} .bank-
|
|
104
|
+
} .bank-card__brandLogo_k6v85 {
|
|
105
105
|
position: absolute;
|
|
106
106
|
bottom: 20px;
|
|
107
107
|
right: 20px
|
|
108
|
-
} .bank-
|
|
108
|
+
} .bank-card__brandLogo_k6v85 svg {
|
|
109
109
|
display: block;
|
|
110
110
|
fill: var(--color-light-neutral-1500);
|
|
111
|
-
} .bank-
|
|
111
|
+
} .bank-card__usePhoto_k6v85 {
|
|
112
112
|
display: block;
|
|
113
113
|
margin: 0;
|
|
114
114
|
padding: 0;
|
|
@@ -125,7 +125,7 @@
|
|
|
125
125
|
|
|
126
126
|
/* В макете иконка прилегает к правому краю поля, а по дизайн-системе там должен быть отступ */
|
|
127
127
|
margin-right: calc(var(--gap-s) * -1)
|
|
128
|
-
} .bank-
|
|
128
|
+
} .bank-card__usePhoto_k6v85 svg {
|
|
129
129
|
fill: var(--color-light-neutral-1500);
|
|
130
130
|
display: block;
|
|
131
131
|
}
|
package/modern/Component.d.ts
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
/// <reference types="react" />
|
|
2
2
|
import React from 'react';
|
|
3
3
|
import { ChangeEvent, MouseEvent, ReactNode } from "react";
|
|
4
|
+
import { MaskType } from "./types";
|
|
4
5
|
type BankCardProps = {
|
|
5
6
|
/**
|
|
6
7
|
* Дополнительный класс
|
|
@@ -36,6 +37,11 @@ type BankCardProps = {
|
|
|
36
37
|
* Идентификатор для систем автоматизированного тестирования
|
|
37
38
|
*/
|
|
38
39
|
dataTestId?: string;
|
|
40
|
+
/**
|
|
41
|
+
* Тип вводимой маски. Позволяет устанавливать необходимый тип номера (номер карты или номер счёта)
|
|
42
|
+
* Если параметр не передавать - работает с обоими типами номеров
|
|
43
|
+
*/
|
|
44
|
+
maskType?: MaskType;
|
|
39
45
|
};
|
|
40
46
|
declare const BankCard: React.ForwardRefExoticComponent<BankCardProps & React.RefAttributes<HTMLInputElement>>;
|
|
41
47
|
export { BankCardProps, BankCard };
|
package/modern/Component.js
CHANGED
|
@@ -6,9 +6,11 @@ import { AlfaBankLIcon } from '@alfalab/icons-logotype/AlfaBankLIcon';
|
|
|
6
6
|
import { MastercardLIcon } from '@alfalab/icons-logotype/MastercardLIcon';
|
|
7
7
|
import { MirXxlIcon } from '@alfalab/icons-logotype/MirXxlIcon';
|
|
8
8
|
import { VisaXxlIcon } from '@alfalab/icons-logotype/VisaXxlIcon';
|
|
9
|
+
import { getDefaultInputLabel } from './helpers/getDefaultInputLabel.js';
|
|
10
|
+
import { MaskTypeEnum } from './enums.js';
|
|
9
11
|
import { validateCardNumber } from './utils.js';
|
|
10
12
|
|
|
11
|
-
const styles = {"component":"bank-
|
|
13
|
+
const styles = {"component":"bank-card__component_k6v85","aspectRatioContainer":"bank-card__aspectRatioContainer_k6v85","content":"bank-card__content_k6v85","label":"bank-card__label_k6v85","focused":"bank-card__focused_k6v85","filled":"bank-card__filled_k6v85","input":"bank-card__input_k6v85","bankLogo":"bank-card__bankLogo_k6v85","brandLogo":"bank-card__brandLogo_k6v85","usePhoto":"bank-card__usePhoto_k6v85"};
|
|
12
14
|
require('./index.css')
|
|
13
15
|
|
|
14
16
|
// prettier-ignore
|
|
@@ -29,10 +31,20 @@ const getBrandIcon = (value = '') => {
|
|
|
29
31
|
}
|
|
30
32
|
return null;
|
|
31
33
|
};
|
|
32
|
-
const BankCard = React.forwardRef(({ bankLogo = React.createElement(AlfaBankLIcon, null), backgroundColor = '#EF3124',
|
|
34
|
+
const BankCard = React.forwardRef(({ bankLogo = React.createElement(AlfaBankLIcon, null), backgroundColor = '#EF3124', value, className, onUsePhoto, onChange, dataTestId, maskType = MaskTypeEnum.Default, inputLabel = getDefaultInputLabel(maskType), }, ref) => {
|
|
33
35
|
const uncontrolled = value === undefined;
|
|
34
36
|
const [brandIcon, setBrandIcon] = useState(getBrandIcon(value));
|
|
35
|
-
const getMask = useCallback((newValue) =>
|
|
37
|
+
const getMask = useCallback((newValue) => {
|
|
38
|
+
switch (maskType) {
|
|
39
|
+
case MaskTypeEnum.Card:
|
|
40
|
+
return cardMask;
|
|
41
|
+
case MaskTypeEnum.AccountNumber:
|
|
42
|
+
return accountNumberMask;
|
|
43
|
+
case MaskTypeEnum.Default:
|
|
44
|
+
default:
|
|
45
|
+
return newValue.length <= cardMask.length ? cardMask : accountNumberMask;
|
|
46
|
+
}
|
|
47
|
+
}, [maskType]);
|
|
36
48
|
const handleInputChange = useCallback((event, payload) => {
|
|
37
49
|
if (uncontrolled) {
|
|
38
50
|
setBrandIcon(getBrandIcon(event.target.value));
|
|
@@ -53,10 +65,5 @@ const BankCard = React.forwardRef(({ bankLogo = React.createElement(AlfaBankLIco
|
|
|
53
65
|
React.createElement(MaskedInput, { ref: ref, value: value, mask: getMask, block: true, label: inputLabel, size: 'm', rightAddons: renderRightAddons(), inputClassName: styles.input, labelClassName: styles.label, filledClassName: styles.filled, focusedClassName: styles.focused, onChange: handleInputChange, dataTestId: dataTestId, inputMode: 'numeric', pattern: '[0-9]*', breakpoint: 1 }),
|
|
54
66
|
brandIcon && React.createElement("div", { className: styles.brandLogo }, brandIcon)))));
|
|
55
67
|
});
|
|
56
|
-
BankCard.defaultProps = {
|
|
57
|
-
bankLogo: React.createElement(AlfaBankLIcon, null),
|
|
58
|
-
backgroundColor: '#EF3124',
|
|
59
|
-
inputLabel: 'Номер карты или счёта',
|
|
60
|
-
};
|
|
61
68
|
|
|
62
69
|
export { BankCard };
|
package/modern/enums.js
ADDED
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { MaskTypeEnum } from '../enums.js';
|
|
2
|
+
|
|
3
|
+
const getDefaultInputLabel = (maskType) => {
|
|
4
|
+
switch (maskType) {
|
|
5
|
+
case MaskTypeEnum.Card:
|
|
6
|
+
return 'Номер карты';
|
|
7
|
+
case MaskTypeEnum.AccountNumber:
|
|
8
|
+
return 'Номер счёта';
|
|
9
|
+
case MaskTypeEnum.Default:
|
|
10
|
+
default:
|
|
11
|
+
return 'Номер карты или счёта';
|
|
12
|
+
}
|
|
13
|
+
};
|
|
14
|
+
|
|
15
|
+
export { getDefaultInputLabel };
|
package/modern/index.css
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/* hash:
|
|
1
|
+
/* hash: 11twg */
|
|
2
2
|
:root { /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */
|
|
3
3
|
} /* deprecated */ :root {
|
|
4
4
|
--color-light-neutral-1500: #121213;
|
|
@@ -22,7 +22,7 @@
|
|
|
22
22
|
--font-family-styrene: 'Styrene UI', system-ui, -apple-system, 'Segoe UI', Roboto,
|
|
23
23
|
'Helvetica Neue', Helvetica, sans-serif;
|
|
24
24
|
} :root {
|
|
25
|
-
} .bank-
|
|
25
|
+
} .bank-card__component_k6v85 {
|
|
26
26
|
/* TODO: как это будет собираться и работать в webView */
|
|
27
27
|
--form-control-border-radius: 0;
|
|
28
28
|
--form-control-border-bottom: 1px solid var(--color-light-neutral-translucent-700);
|
|
@@ -41,10 +41,10 @@
|
|
|
41
41
|
max-width: 343px;
|
|
42
42
|
|
|
43
43
|
font-family: var(--font-family-styrene);
|
|
44
|
-
} .bank-
|
|
44
|
+
} .bank-card__aspectRatioContainer_k6v85 {
|
|
45
45
|
/* Эталонный размер 343x216 */
|
|
46
46
|
padding-bottom: 63%;
|
|
47
|
-
} .bank-
|
|
47
|
+
} .bank-card__content_k6v85 {
|
|
48
48
|
position: absolute;
|
|
49
49
|
top: 0;
|
|
50
50
|
right: 0;
|
|
@@ -56,26 +56,26 @@
|
|
|
56
56
|
padding-right: var(--gap-l);
|
|
57
57
|
border-radius: var(--border-radius-l);
|
|
58
58
|
box-sizing: border-box;
|
|
59
|
-
} .bank-
|
|
59
|
+
} .bank-card__label_k6v85 {
|
|
60
60
|
left: 0;
|
|
61
61
|
transform: translateY(-1px);
|
|
62
62
|
color: var(--color-light-text-secondary);
|
|
63
63
|
font-size: 20px;
|
|
64
64
|
line-height: 24px
|
|
65
|
-
} @media (max-width: 360px) { .bank-
|
|
65
|
+
} @media (max-width: 360px) { .bank-card__label_k6v85 {
|
|
66
66
|
font-size: 16px
|
|
67
67
|
}
|
|
68
|
-
} .bank-
|
|
69
|
-
.bank-
|
|
68
|
+
} .bank-card__focused_k6v85 .bank-card__label_k6v85,
|
|
69
|
+
.bank-card__filled_k6v85 .bank-card__label_k6v85 {
|
|
70
70
|
color: var(--color-light-neutral-1500);
|
|
71
71
|
transform: translateY(-19px) scale(0.6)
|
|
72
|
-
} @media (max-width: 360px) { .bank-
|
|
73
|
-
.bank-
|
|
72
|
+
} @media (max-width: 360px) { .bank-card__focused_k6v85 .bank-card__label_k6v85,
|
|
73
|
+
.bank-card__filled_k6v85 .bank-card__label_k6v85 {
|
|
74
74
|
transform: translateY(-22px) scale(0.75)
|
|
75
75
|
}
|
|
76
|
-
} .bank-
|
|
76
|
+
} .bank-card__focused_k6v85:before {
|
|
77
77
|
transform: scale(1) !important;
|
|
78
|
-
} .bank-
|
|
78
|
+
} .bank-card__input_k6v85 {
|
|
79
79
|
font-size: 20px;
|
|
80
80
|
line-height: 24px;
|
|
81
81
|
font-weight: 400;
|
|
@@ -88,27 +88,27 @@
|
|
|
88
88
|
/* TODO: обсудить с дизайнером, почему инпут не соответствует дизайн-системе, либо уменьшить каскад в form-control */
|
|
89
89
|
padding-left: 0 !important;
|
|
90
90
|
padding-bottom: var(--gap-2xs) !important
|
|
91
|
-
} @media (max-width: 360px) { .bank-
|
|
91
|
+
} @media (max-width: 360px) { .bank-card__input_k6v85 {
|
|
92
92
|
font-size: 16px
|
|
93
93
|
}
|
|
94
|
-
} .bank-
|
|
94
|
+
} .bank-card__bankLogo_k6v85 {
|
|
95
95
|
position: absolute;
|
|
96
96
|
top: 20px;
|
|
97
97
|
left: 20px
|
|
98
|
-
} .bank-
|
|
98
|
+
} .bank-card__bankLogo_k6v85 svg {
|
|
99
99
|
max-height: 32px;
|
|
100
100
|
width: auto;
|
|
101
101
|
display: block
|
|
102
|
-
} .bank-
|
|
102
|
+
} .bank-card__bankLogo_k6v85 svg g {
|
|
103
103
|
fill: var(--color-light-neutral-1500);
|
|
104
|
-
} .bank-
|
|
104
|
+
} .bank-card__brandLogo_k6v85 {
|
|
105
105
|
position: absolute;
|
|
106
106
|
bottom: 20px;
|
|
107
107
|
right: 20px
|
|
108
|
-
} .bank-
|
|
108
|
+
} .bank-card__brandLogo_k6v85 svg {
|
|
109
109
|
display: block;
|
|
110
110
|
fill: var(--color-light-neutral-1500);
|
|
111
|
-
} .bank-
|
|
111
|
+
} .bank-card__usePhoto_k6v85 {
|
|
112
112
|
display: block;
|
|
113
113
|
margin: 0;
|
|
114
114
|
padding: 0;
|
|
@@ -125,7 +125,7 @@
|
|
|
125
125
|
|
|
126
126
|
/* В макете иконка прилегает к правому краю поля, а по дизайн-системе там должен быть отступ */
|
|
127
127
|
margin-right: calc(var(--gap-s) * -1)
|
|
128
|
-
} .bank-
|
|
128
|
+
} .bank-card__usePhoto_k6v85 svg {
|
|
129
129
|
fill: var(--color-light-neutral-1500);
|
|
130
130
|
display: block;
|
|
131
131
|
}
|
package/modern/types.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@alfalab/core-components-bank-card",
|
|
3
|
-
"version": "5.
|
|
3
|
+
"version": "5.7.0",
|
|
4
4
|
"description": "Bank card component",
|
|
5
5
|
"keywords": [],
|
|
6
6
|
"license": "MIT",
|
|
@@ -15,7 +15,7 @@
|
|
|
15
15
|
"react-dom": "^16.9.0 || ^17.0.1 || ^18.0.0"
|
|
16
16
|
},
|
|
17
17
|
"dependencies": {
|
|
18
|
-
"@alfalab/core-components-masked-input": "^6.3.
|
|
18
|
+
"@alfalab/core-components-masked-input": "^6.3.5",
|
|
19
19
|
"@alfalab/icons-glyph": "^2.139.0",
|
|
20
20
|
"@alfalab/icons-logotype": "^2.27.0",
|
|
21
21
|
"classnames": "^2.3.1",
|
package/src/Component.tsx
CHANGED
|
@@ -8,6 +8,9 @@ import { MastercardLIcon } from '@alfalab/icons-logotype/MastercardLIcon';
|
|
|
8
8
|
import { MirXxlIcon } from '@alfalab/icons-logotype/MirXxlIcon';
|
|
9
9
|
import { VisaXxlIcon } from '@alfalab/icons-logotype/VisaXxlIcon';
|
|
10
10
|
|
|
11
|
+
import { getDefaultInputLabel } from './helpers/getDefaultInputLabel';
|
|
12
|
+
import { MaskTypeEnum } from './enums';
|
|
13
|
+
import { MaskType } from './types';
|
|
11
14
|
import { validateCardNumber } from './utils';
|
|
12
15
|
|
|
13
16
|
import styles from './index.module.css';
|
|
@@ -52,6 +55,12 @@ export type BankCardProps = {
|
|
|
52
55
|
* Идентификатор для систем автоматизированного тестирования
|
|
53
56
|
*/
|
|
54
57
|
dataTestId?: string;
|
|
58
|
+
|
|
59
|
+
/**
|
|
60
|
+
* Тип вводимой маски. Позволяет устанавливать необходимый тип номера (номер карты или номер счёта)
|
|
61
|
+
* Если параметр не передавать - работает с обоими типами номеров
|
|
62
|
+
*/
|
|
63
|
+
maskType?: MaskType;
|
|
55
64
|
};
|
|
56
65
|
|
|
57
66
|
// prettier-ignore
|
|
@@ -76,12 +85,13 @@ export const BankCard = React.forwardRef<HTMLInputElement, BankCardProps>(
|
|
|
76
85
|
{
|
|
77
86
|
bankLogo = <AlfaBankLIcon />,
|
|
78
87
|
backgroundColor = '#EF3124',
|
|
79
|
-
inputLabel = 'Номер карты или счёта',
|
|
80
88
|
value,
|
|
81
89
|
className,
|
|
82
90
|
onUsePhoto,
|
|
83
91
|
onChange,
|
|
84
92
|
dataTestId,
|
|
93
|
+
maskType = MaskTypeEnum.Default,
|
|
94
|
+
inputLabel = getDefaultInputLabel(maskType),
|
|
85
95
|
},
|
|
86
96
|
ref,
|
|
87
97
|
) => {
|
|
@@ -90,9 +100,18 @@ export const BankCard = React.forwardRef<HTMLInputElement, BankCardProps>(
|
|
|
90
100
|
const [brandIcon, setBrandIcon] = useState<ReactNode>(getBrandIcon(value));
|
|
91
101
|
|
|
92
102
|
const getMask = useCallback(
|
|
93
|
-
(newValue: string) =>
|
|
94
|
-
|
|
95
|
-
|
|
103
|
+
(newValue: string) => {
|
|
104
|
+
switch (maskType) {
|
|
105
|
+
case MaskTypeEnum.Card:
|
|
106
|
+
return cardMask;
|
|
107
|
+
case MaskTypeEnum.AccountNumber:
|
|
108
|
+
return accountNumberMask;
|
|
109
|
+
case MaskTypeEnum.Default:
|
|
110
|
+
default:
|
|
111
|
+
return newValue.length <= cardMask.length ? cardMask : accountNumberMask;
|
|
112
|
+
}
|
|
113
|
+
},
|
|
114
|
+
[maskType],
|
|
96
115
|
);
|
|
97
116
|
|
|
98
117
|
const handleInputChange = useCallback(
|
|
@@ -153,9 +172,3 @@ export const BankCard = React.forwardRef<HTMLInputElement, BankCardProps>(
|
|
|
153
172
|
);
|
|
154
173
|
},
|
|
155
174
|
);
|
|
156
|
-
|
|
157
|
-
BankCard.defaultProps = {
|
|
158
|
-
bankLogo: <AlfaBankLIcon />,
|
|
159
|
-
backgroundColor: '#EF3124',
|
|
160
|
-
inputLabel: 'Номер карты или счёта',
|
|
161
|
-
};
|
package/src/enums.ts
ADDED
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { MaskTypeEnum } from '../enums';
|
|
2
|
+
import { MaskType } from '../types';
|
|
3
|
+
|
|
4
|
+
export const getDefaultInputLabel = (maskType: MaskType) => {
|
|
5
|
+
switch (maskType) {
|
|
6
|
+
case MaskTypeEnum.Card:
|
|
7
|
+
return 'Номер карты';
|
|
8
|
+
case MaskTypeEnum.AccountNumber:
|
|
9
|
+
return 'Номер счёта';
|
|
10
|
+
case MaskTypeEnum.Default:
|
|
11
|
+
default:
|
|
12
|
+
return 'Номер карты или счёта';
|
|
13
|
+
}
|
|
14
|
+
};
|
package/src/types.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export type MaskType = 'default' | 'card' | 'account-number';
|
package/types.d.ts
ADDED
package/types.js
ADDED