@alfalab/core-components-confirmation 15.0.11 → 15.1.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/components/base-confirmation/component.js +3 -2
- package/components/base-confirmation/component.js.map +1 -1
- package/components/base-confirmation/index.css +2 -2
- package/components/base-confirmation/index.module.css.js +1 -1
- package/components/countdown-loader/index.css +1 -1
- package/components/countdown-loader/index.module.css.js +1 -1
- package/components/header/index.css +1 -1
- package/components/header/index.module.css.js +1 -1
- package/components/screens/fatal-error/index.css +6 -6
- package/components/screens/fatal-error/index.module.css.js +1 -1
- package/components/screens/hint/index.css +12 -12
- package/components/screens/hint/index.module.css.js +1 -1
- package/components/screens/initial/component.js +2 -2
- package/components/screens/initial/component.js.map +1 -1
- package/components/screens/initial/index.css +19 -19
- package/components/screens/initial/index.module.css.js +1 -1
- package/components/screens/temp-block/index.css +8 -8
- package/components/screens/temp-block/index.module.css.js +1 -1
- package/components/screens/temp-block-over/index.css +5 -5
- package/components/screens/temp-block-over/index.module.css.js +1 -1
- package/context.js +1 -0
- package/context.js.map +1 -1
- package/cssm/components/base-confirmation/component.js +3 -2
- package/cssm/components/base-confirmation/component.js.map +1 -1
- package/cssm/components/screens/initial/component.js +2 -2
- package/cssm/components/screens/initial/component.js.map +1 -1
- package/cssm/context.js +1 -0
- package/cssm/context.js.map +1 -1
- package/cssm/types.d.ts +6 -1
- package/cssm/types.js.map +1 -1
- package/esm/components/base-confirmation/component.js +3 -2
- package/esm/components/base-confirmation/component.js.map +1 -1
- package/esm/components/base-confirmation/index.css +2 -2
- package/esm/components/base-confirmation/index.module.css.js +1 -1
- package/esm/components/countdown-loader/index.css +1 -1
- package/esm/components/countdown-loader/index.module.css.js +1 -1
- package/esm/components/header/index.css +1 -1
- package/esm/components/header/index.module.css.js +1 -1
- package/esm/components/screens/fatal-error/index.css +6 -6
- package/esm/components/screens/fatal-error/index.module.css.js +1 -1
- package/esm/components/screens/hint/index.css +12 -12
- package/esm/components/screens/hint/index.module.css.js +1 -1
- package/esm/components/screens/initial/component.js +2 -2
- package/esm/components/screens/initial/component.js.map +1 -1
- package/esm/components/screens/initial/index.css +19 -19
- package/esm/components/screens/initial/index.module.css.js +1 -1
- package/esm/components/screens/temp-block/index.css +8 -8
- package/esm/components/screens/temp-block/index.module.css.js +1 -1
- package/esm/components/screens/temp-block-over/index.css +5 -5
- package/esm/components/screens/temp-block-over/index.module.css.js +1 -1
- package/esm/context.js +1 -0
- package/esm/context.js.map +1 -1
- package/esm/types.d.ts +6 -1
- package/esm/types.js.map +1 -1
- package/modern/components/base-confirmation/component.js +2 -1
- package/modern/components/base-confirmation/component.js.map +1 -1
- package/modern/components/base-confirmation/index.css +2 -2
- package/modern/components/base-confirmation/index.module.css.js +1 -1
- package/modern/components/countdown-loader/index.css +1 -1
- package/modern/components/countdown-loader/index.module.css.js +1 -1
- package/modern/components/header/index.css +1 -1
- package/modern/components/header/index.module.css.js +1 -1
- package/modern/components/screens/fatal-error/index.css +6 -6
- package/modern/components/screens/fatal-error/index.module.css.js +1 -1
- package/modern/components/screens/hint/index.css +12 -12
- package/modern/components/screens/hint/index.module.css.js +1 -1
- package/modern/components/screens/initial/component.js +2 -2
- package/modern/components/screens/initial/component.js.map +1 -1
- package/modern/components/screens/initial/index.css +19 -19
- package/modern/components/screens/initial/index.module.css.js +1 -1
- package/modern/components/screens/temp-block/index.css +8 -8
- package/modern/components/screens/temp-block/index.module.css.js +1 -1
- package/modern/components/screens/temp-block-over/index.css +5 -5
- package/modern/components/screens/temp-block-over/index.module.css.js +1 -1
- package/modern/context.js +1 -0
- package/modern/context.js.map +1 -1
- package/modern/types.d.ts +6 -1
- package/modern/types.js.map +1 -1
- package/moderncssm/components/base-confirmation/component.js +2 -1
- package/moderncssm/components/base-confirmation/component.js.map +1 -1
- package/moderncssm/components/screens/initial/component.js +2 -2
- package/moderncssm/components/screens/initial/component.js.map +1 -1
- package/moderncssm/context.js +1 -0
- package/moderncssm/context.js.map +1 -1
- package/moderncssm/types.d.ts +6 -1
- package/moderncssm/types.js.map +1 -1
- package/package.json +2 -2
- package/src/components/base-confirmation/component.tsx +2 -0
- package/src/components/screens/initial/component.tsx +2 -0
- package/src/context.ts +1 -0
- package/src/types.ts +7 -0
- package/types.d.ts +6 -1
- package/types.js.map +1 -1
|
@@ -27,64 +27,64 @@
|
|
|
27
27
|
:root {
|
|
28
28
|
--confirmation-text-color: var(--color-light-text-primary)
|
|
29
29
|
}
|
|
30
|
-
.
|
|
30
|
+
.confirmation__component_dwua5 {
|
|
31
31
|
display: flex;
|
|
32
32
|
flex-direction: column;
|
|
33
33
|
}
|
|
34
|
-
.
|
|
34
|
+
.confirmation__phone_dwua5.confirmation__phone_dwua5 {
|
|
35
35
|
color: var(--color-light-text-primary);
|
|
36
36
|
margin-bottom: var(--gap-32);
|
|
37
37
|
}
|
|
38
|
-
.
|
|
38
|
+
.confirmation__typographyTheme_dwua5.confirmation__typographyTheme_dwua5 {
|
|
39
39
|
font-size: 16px;
|
|
40
40
|
line-height: 24px;
|
|
41
41
|
font-weight: 400;
|
|
42
42
|
font-family: var(--font-family-system);
|
|
43
43
|
color: var(--confirmation-text-color);
|
|
44
44
|
}
|
|
45
|
-
.
|
|
45
|
+
.confirmation__typographyThemeMobile_dwua5.confirmation__typographyThemeMobile_dwua5 {
|
|
46
46
|
color: var(--color-light-text-secondary);
|
|
47
47
|
}
|
|
48
|
-
.
|
|
48
|
+
.confirmation__compact_dwua5 {
|
|
49
49
|
margin-bottom: var(--gap-24);
|
|
50
50
|
}
|
|
51
|
-
.
|
|
51
|
+
.confirmation__loaderWrap_dwua5 {
|
|
52
52
|
display: flex;
|
|
53
53
|
align-items: center;
|
|
54
54
|
}
|
|
55
|
-
.
|
|
55
|
+
.confirmation__left_dwua5 {
|
|
56
56
|
align-items: flex-start;
|
|
57
57
|
}
|
|
58
|
-
.
|
|
58
|
+
.confirmation__center_dwua5 {
|
|
59
59
|
align-items: center;
|
|
60
60
|
text-align: center;
|
|
61
61
|
}
|
|
62
|
-
.
|
|
62
|
+
.confirmation__center_dwua5 .confirmation__loaderWrap_dwua5 {
|
|
63
63
|
justify-content: center;
|
|
64
64
|
}
|
|
65
|
-
.
|
|
65
|
+
.confirmation__codeInput_dwua5 {
|
|
66
66
|
margin-bottom: var(--gap-12);
|
|
67
67
|
}
|
|
68
|
-
.
|
|
68
|
+
.confirmation__smsBtn_dwua5.confirmation__smsBtn_dwua5 {
|
|
69
69
|
min-height: var(--size-xs-height);
|
|
70
70
|
}
|
|
71
|
-
.
|
|
71
|
+
.confirmation__smsComeLink_dwua5.confirmation__smsComeLink_dwua5 {
|
|
72
72
|
font-size: 14px;
|
|
73
73
|
line-height: 20px;
|
|
74
74
|
font-weight: 500;
|
|
75
75
|
font-family: var(--font-family-system);
|
|
76
76
|
}
|
|
77
|
-
.
|
|
77
|
+
.confirmation__countdownContainer_dwua5.confirmation__countdownContainer_dwua5 {
|
|
78
78
|
color: var(--color-light-text-secondary);
|
|
79
79
|
margin-bottom: var(--gap-24);
|
|
80
80
|
}
|
|
81
|
-
.
|
|
81
|
+
.confirmation__countdownMobile_dwua5.confirmation__countdownMobile_dwua5 {
|
|
82
82
|
margin-bottom: var(--gap-20);
|
|
83
83
|
}
|
|
84
|
-
.
|
|
84
|
+
.confirmation__countdownLoaderMobile_dwua5.confirmation__countdownLoaderMobile_dwua5 {
|
|
85
85
|
margin-bottom: var(--gap-16);
|
|
86
86
|
}
|
|
87
|
-
.
|
|
87
|
+
.confirmation__timeCounter_dwua5 {
|
|
88
88
|
display: inline-block;
|
|
89
89
|
min-width: 47px;
|
|
90
90
|
color: var(--color-light-text-secondary);
|
|
@@ -92,14 +92,14 @@
|
|
|
92
92
|
font-feature-settings: lining-nums tabular-nums;
|
|
93
93
|
font-variant-numeric: lining-nums tabular-nums;
|
|
94
94
|
}
|
|
95
|
-
.
|
|
95
|
+
.confirmation__getCodeButton_dwua5 {
|
|
96
96
|
position: relative;
|
|
97
97
|
top: var(--gap-4-neg);
|
|
98
98
|
margin-bottom: var(--gap-16);
|
|
99
99
|
}
|
|
100
|
-
.
|
|
100
|
+
.confirmation__getCodeButtonMobile_dwua5 {
|
|
101
101
|
margin-bottom: var(--gap-0);
|
|
102
102
|
}
|
|
103
|
-
.
|
|
103
|
+
.confirmation__containerInput_dwua5 {
|
|
104
104
|
min-height: 80px;
|
|
105
105
|
}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import './index.css';
|
|
2
2
|
|
|
3
|
-
var styles = {"component":"
|
|
3
|
+
var styles = {"component":"confirmation__component_dwua5","phone":"confirmation__phone_dwua5","typographyTheme":"confirmation__typographyTheme_dwua5","typographyThemeMobile":"confirmation__typographyThemeMobile_dwua5","compact":"confirmation__compact_dwua5","loaderWrap":"confirmation__loaderWrap_dwua5","left":"confirmation__left_dwua5","center":"confirmation__center_dwua5","codeInput":"confirmation__codeInput_dwua5","smsBtn":"confirmation__smsBtn_dwua5","smsComeLink":"confirmation__smsComeLink_dwua5","countdownContainer":"confirmation__countdownContainer_dwua5","countdownMobile":"confirmation__countdownMobile_dwua5","countdownLoaderMobile":"confirmation__countdownLoaderMobile_dwua5","timeCounter":"confirmation__timeCounter_dwua5","getCodeButton":"confirmation__getCodeButton_dwua5","getCodeButtonMobile":"confirmation__getCodeButtonMobile_dwua5","containerInput":"confirmation__containerInput_dwua5"};
|
|
4
4
|
|
|
5
5
|
export { styles as default };
|
|
6
6
|
//# sourceMappingURL=index.module.css.js.map
|
|
@@ -13,32 +13,32 @@
|
|
|
13
13
|
:root {
|
|
14
14
|
--confirmation-text-color: var(--color-light-text-primary)
|
|
15
15
|
}
|
|
16
|
-
.
|
|
16
|
+
.confirmation__component_1lclb {
|
|
17
17
|
display: flex;
|
|
18
18
|
flex-direction: column;
|
|
19
19
|
}
|
|
20
|
-
.
|
|
20
|
+
.confirmation__center_1lclb {
|
|
21
21
|
align-items: center;
|
|
22
22
|
text-align: center;
|
|
23
23
|
}
|
|
24
|
-
.
|
|
24
|
+
.confirmation__typographyTheme_1lclb.confirmation__typographyTheme_1lclb {
|
|
25
25
|
font-size: 16px;
|
|
26
26
|
line-height: 24px;
|
|
27
27
|
font-weight: 400;
|
|
28
28
|
font-family: var(--font-family-system);
|
|
29
29
|
color: var(--confirmation-text-color);
|
|
30
30
|
}
|
|
31
|
-
.
|
|
31
|
+
.confirmation__typographyThemeMobile_1lclb.confirmation__typographyThemeMobile_1lclb {
|
|
32
32
|
color: var(--color-light-text-secondary);
|
|
33
33
|
}
|
|
34
|
-
.
|
|
34
|
+
.confirmation__description_1lclb.confirmation__description_1lclb {
|
|
35
35
|
margin-bottom: var(--gap-8);
|
|
36
36
|
}
|
|
37
|
-
.
|
|
37
|
+
.confirmation__countdownWrap_1lclb {
|
|
38
38
|
display: flex;
|
|
39
39
|
align-items: center;
|
|
40
40
|
}
|
|
41
|
-
.
|
|
41
|
+
.confirmation__timeCounter_1lclb {
|
|
42
42
|
display: inline-block;
|
|
43
43
|
min-width: 47px;
|
|
44
44
|
color: var(--color-light-text-secondary);
|
|
@@ -46,6 +46,6 @@
|
|
|
46
46
|
font-feature-settings: lining-nums tabular-nums;
|
|
47
47
|
font-variant-numeric: lining-nums tabular-nums;
|
|
48
48
|
}
|
|
49
|
-
.
|
|
49
|
+
.confirmation__loader_1lclb {
|
|
50
50
|
margin-right: var(--gap-8);
|
|
51
51
|
}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import './index.css';
|
|
2
2
|
|
|
3
|
-
var styles = {"component":"
|
|
3
|
+
var styles = {"component":"confirmation__component_1lclb","center":"confirmation__center_1lclb","typographyTheme":"confirmation__typographyTheme_1lclb","typographyThemeMobile":"confirmation__typographyThemeMobile_1lclb","description":"confirmation__description_1lclb","countdownWrap":"confirmation__countdownWrap_1lclb","timeCounter":"confirmation__timeCounter_1lclb","loader":"confirmation__loader_1lclb"};
|
|
4
4
|
|
|
5
5
|
export { styles as default };
|
|
6
6
|
//# sourceMappingURL=index.module.css.js.map
|
|
@@ -13,24 +13,24 @@
|
|
|
13
13
|
:root {
|
|
14
14
|
--confirmation-text-color: var(--color-light-text-primary)
|
|
15
15
|
}
|
|
16
|
-
.
|
|
16
|
+
.confirmation__component_dkqvd {
|
|
17
17
|
display: flex;
|
|
18
18
|
flex-direction: column;
|
|
19
19
|
}
|
|
20
|
-
.
|
|
20
|
+
.confirmation__center_dkqvd {
|
|
21
21
|
align-items: center;
|
|
22
22
|
text-align: center;
|
|
23
23
|
}
|
|
24
|
-
.
|
|
24
|
+
.confirmation__typographyTheme_dkqvd.confirmation__typographyTheme_dkqvd {
|
|
25
25
|
font-size: 16px;
|
|
26
26
|
line-height: 24px;
|
|
27
27
|
font-weight: 400;
|
|
28
28
|
font-family: var(--font-family-system);
|
|
29
29
|
color: var(--confirmation-text-color);
|
|
30
30
|
}
|
|
31
|
-
.
|
|
31
|
+
.confirmation__typographyThemeMobile_dkqvd.confirmation__typographyThemeMobile_dkqvd {
|
|
32
32
|
color: var(--color-light-text-secondary);
|
|
33
33
|
}
|
|
34
|
-
.
|
|
34
|
+
.confirmation__button_dkqvd.confirmation__button_dkqvd {
|
|
35
35
|
margin-top: var(--gap-32);
|
|
36
36
|
}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import './index.css';
|
|
2
2
|
|
|
3
|
-
var styles = {"component":"
|
|
3
|
+
var styles = {"component":"confirmation__component_dkqvd","center":"confirmation__center_dkqvd","typographyTheme":"confirmation__typographyTheme_dkqvd","typographyThemeMobile":"confirmation__typographyThemeMobile_dkqvd","button":"confirmation__button_dkqvd"};
|
|
4
4
|
|
|
5
5
|
export { styles as default };
|
|
6
6
|
//# sourceMappingURL=index.module.css.js.map
|
package/esm/context.js
CHANGED
package/esm/context.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"context.js","sources":["../src/context.ts"],"sourcesContent":["import { createContext } from 'react';\n\nimport { type TConfirmationContext } from './types';\nimport { ONE_DAY, ONE_MINUTE } from './utils';\n\nconst mockFn = () => undefined;\n\nexport const ConfirmationContext = createContext<TConfirmationContext>({\n alignContent: 'left',\n titleTag: 'h3',\n texts: {},\n state: 'INITIAL',\n screen: 'INITIAL',\n requiredCharAmount: 5,\n countdownDuration: ONE_MINUTE,\n timeLeft: ONE_MINUTE,\n tempBlockDuration: ONE_DAY,\n phone: '',\n hideCountdownSection: false,\n breakpoint: 1024,\n client: 'desktop',\n initialScreenHintSlot: null,\n onTempBlockFinished: mockFn,\n onInputFinished: mockFn,\n onChangeState: mockFn,\n onSmsRetryClick: mockFn,\n onChangeScreen: mockFn,\n onFatalErrorOkButtonClick: mockFn,\n});\n"],"names":[],"mappings":";;;AAKA,IAAM,MAAM,GAAG,YAAA,EAAM,OAAA,SAAS,CAAA,EAAA;AAEvB,IAAM,mBAAmB,GAAG,aAAa,CAAuB;AACnE,IAAA,YAAY,EAAE,MAAM;AACpB,IAAA,QAAQ,EAAE,IAAI;AACd,IAAA,KAAK,EAAE,EAAE;AACT,IAAA,KAAK,EAAE,SAAS;AAChB,IAAA,MAAM,EAAE,SAAS;AACjB,IAAA,kBAAkB,EAAE,CAAC;AACrB,IAAA,iBAAiB,EAAE,UAAU;AAC7B,IAAA,QAAQ,EAAE,UAAU;AACpB,IAAA,iBAAiB,EAAE,OAAO;AAC1B,IAAA,KAAK,EAAE,EAAE;AACT,IAAA,oBAAoB,EAAE,KAAK;AAC3B,IAAA,UAAU,EAAE,IAAI;AAChB,IAAA,MAAM,EAAE,SAAS;AACjB,IAAA,qBAAqB,EAAE,IAAI;AAC3B,IAAA,mBAAmB,EAAE,MAAM;AAC3B,IAAA,eAAe,EAAE,MAAM;AACvB,IAAA,aAAa,EAAE,MAAM;AACrB,IAAA,eAAe,EAAE,MAAM;AACvB,IAAA,cAAc,EAAE,MAAM;AACtB,IAAA,yBAAyB,EAAE,MAAM;AACpC,CAAA;;;;"}
|
|
1
|
+
{"version":3,"file":"context.js","sources":["../src/context.ts"],"sourcesContent":["import { createContext } from 'react';\n\nimport { type TConfirmationContext } from './types';\nimport { ONE_DAY, ONE_MINUTE } from './utils';\n\nconst mockFn = () => undefined;\n\nexport const ConfirmationContext = createContext<TConfirmationContext>({\n alignContent: 'left',\n titleTag: 'h3',\n texts: {},\n state: 'INITIAL',\n screen: 'INITIAL',\n requiredCharAmount: 5,\n countdownDuration: ONE_MINUTE,\n timeLeft: ONE_MINUTE,\n tempBlockDuration: ONE_DAY,\n phone: '',\n hideCountdownSection: false,\n breakpoint: 1024,\n client: 'desktop',\n initialScreenHintSlot: null,\n strictFocus: false,\n onTempBlockFinished: mockFn,\n onInputFinished: mockFn,\n onChangeState: mockFn,\n onSmsRetryClick: mockFn,\n onChangeScreen: mockFn,\n onFatalErrorOkButtonClick: mockFn,\n});\n"],"names":[],"mappings":";;;AAKA,IAAM,MAAM,GAAG,YAAA,EAAM,OAAA,SAAS,CAAA,EAAA;AAEvB,IAAM,mBAAmB,GAAG,aAAa,CAAuB;AACnE,IAAA,YAAY,EAAE,MAAM;AACpB,IAAA,QAAQ,EAAE,IAAI;AACd,IAAA,KAAK,EAAE,EAAE;AACT,IAAA,KAAK,EAAE,SAAS;AAChB,IAAA,MAAM,EAAE,SAAS;AACjB,IAAA,kBAAkB,EAAE,CAAC;AACrB,IAAA,iBAAiB,EAAE,UAAU;AAC7B,IAAA,QAAQ,EAAE,UAAU;AACpB,IAAA,iBAAiB,EAAE,OAAO;AAC1B,IAAA,KAAK,EAAE,EAAE;AACT,IAAA,oBAAoB,EAAE,KAAK;AAC3B,IAAA,UAAU,EAAE,IAAI;AAChB,IAAA,MAAM,EAAE,SAAS;AACjB,IAAA,qBAAqB,EAAE,IAAI;AAC3B,IAAA,WAAW,EAAE,KAAK;AAClB,IAAA,mBAAmB,EAAE,MAAM;AAC3B,IAAA,eAAe,EAAE,MAAM;AACvB,IAAA,aAAa,EAAE,MAAM;AACrB,IAAA,eAAe,EAAE,MAAM;AACvB,IAAA,cAAc,EAAE,MAAM;AACtB,IAAA,yBAAyB,EAAE,MAAM;AACpC,CAAA;;;;"}
|
package/esm/types.d.ts
CHANGED
|
@@ -117,8 +117,13 @@ export interface ConfirmationProps {
|
|
|
117
117
|
* @default 1300
|
|
118
118
|
*/
|
|
119
119
|
errorVisibleDuration?: number;
|
|
120
|
+
/**
|
|
121
|
+
* Ограничение навигации фокусом между ячейками
|
|
122
|
+
* @default false
|
|
123
|
+
*/
|
|
124
|
+
strictFocus?: boolean;
|
|
120
125
|
}
|
|
121
|
-
export type TConfirmationContext = Required<Pick<ConfirmationProps, 'alignContent' | 'titleTag' | 'texts' | 'state' | 'screen' | 'requiredCharAmount' | 'onInputFinished' | 'countdownDuration' | 'onChangeState' | 'onSmsRetryClick' | 'onChangeScreen' | 'onFatalErrorOkButtonClick' | 'tempBlockDuration' | 'hideCountdownSection'>> & Pick<ConfirmationProps, 'phone' | 'blockSmsRetry' | 'onTempBlockFinished' | 'clearCodeOnError' | 'initialScreenHintSlot' | 'errorVisibleDuration' | 'breakpoint' | 'client'> & {
|
|
126
|
+
export type TConfirmationContext = Required<Pick<ConfirmationProps, 'alignContent' | 'titleTag' | 'texts' | 'state' | 'screen' | 'requiredCharAmount' | 'onInputFinished' | 'countdownDuration' | 'onChangeState' | 'onSmsRetryClick' | 'onChangeScreen' | 'onFatalErrorOkButtonClick' | 'tempBlockDuration' | 'hideCountdownSection' | 'strictFocus'>> & Pick<ConfirmationProps, 'phone' | 'blockSmsRetry' | 'onTempBlockFinished' | 'clearCodeOnError' | 'initialScreenHintSlot' | 'errorVisibleDuration' | 'breakpoint' | 'client'> & {
|
|
122
127
|
timeLeft: number;
|
|
123
128
|
};
|
|
124
129
|
export interface ConfirmationTexts {
|
package/esm/types.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.js","sources":["../src/types.ts"],"sourcesContent":["import { type ComponentType, type CSSProperties, type ReactNode } from 'react';\n\nexport interface ConfirmationProps {\n /**\n * Экран компонента\n */\n screen: ConfirmationScreen | string;\n\n /**\n * Состояние компонента\n */\n state: ConfirmationState | string;\n\n /**\n * Мобильная версия компонента для экрана\n */\n mobile?: boolean;\n\n /**\n * Позиционирование контента\n */\n alignContent?: 'left' | 'center';\n\n /**\n * HTML тег для заголовка\n * @default 'h3'\n */\n titleTag?: 'h1' | 'h2' | 'h3' | 'h4' | 'h5' | 'h6';\n\n /**\n * Объект с текстами\n */\n texts?: ConfirmationTexts;\n\n /**\n * Количество символов, которое можно ввести в поле ввода подписания до того, как произойдет автоотправка\n */\n requiredCharAmount?: number;\n\n /**\n * Длительность обратного отсчета на кнопке повторного запроса сообщения, в милисекундах\n */\n countdownDuration?: number;\n\n /**\n * Продолжительность блокировки формы (ms)\n */\n tempBlockDuration?: number;\n\n /**\n * Номер телефона, на который отправлен код\n */\n phone?: string;\n\n /**\n * Не осталось попыток ввода кода\n */\n blockSmsRetry?: boolean;\n\n /**\n * Идентификатор для систем автоматизированного тестирования\n */\n dataTestId?: string;\n\n /**\n * Сss класс для стилизации общей обёртки\n */\n className?: string;\n\n /**\n * Максимальная ширина контейнера компонента.\n * Для mobile по умолчанию используется 288px, если не передано значение.\n */\n maxWidth?: CSSProperties['maxWidth'];\n\n /**\n * Флаг - нужно ли очищать код при возникновении ошибки\n */\n clearCodeOnError?: boolean;\n\n /**\n * Функция обновления состояния компонента\n */\n onChangeState: (state: ConfirmationState | string) => void;\n\n /**\n * Функция обновления состояния компонента\n */\n onChangeScreen: (state: ConfirmationScreen | string) => void;\n\n /**\n * Обработчик события завершения ввода кода подписания\n */\n onInputFinished: (code: string) => void;\n\n /**\n * Обработчик события нажатия на кнопку \"Запросить код\"\n */\n onSmsRetryClick: () => void;\n\n /**\n * Клик по кнопке \"Понятно\" на экране фатальной ошибки\n */\n onFatalErrorOkButtonClick?: () => void;\n\n /**\n * Временная блокировка формы закончилась\n */\n onTempBlockFinished?: () => void;\n\n /**\n * Возвращает объект, где ключ - название экрана (screen), значение - компонент для экрана\n */\n getScreensMap?: (defaultScreensMap: ScreensMap) => ScreensMap;\n\n /**\n * Дочерние элементы\n */\n children?: ReactNode;\n\n /**\n * Скрыть секцию с повторной отправкой кода\n * @default false\n */\n hideCountdownSection?: boolean;\n\n /**\n * Слот для контента с подсказкой на главном экране\n */\n initialScreenHintSlot?: ReactNode;\n\n /**\n * Контрольная точка для кнопки, с нее начинается desktop версия\n * @default 1024\n */\n breakpoint?: number;\n\n /**\n * Версия, которая будет использоваться при серверном рендеринге\n */\n client?: 'desktop' | 'mobile';\n\n /**\n * Продолжительность отображения ошибки\n * @default 1300\n */\n errorVisibleDuration?: number;\n}\n\nexport type TConfirmationContext = Required<\n Pick<\n ConfirmationProps,\n | 'alignContent'\n | 'titleTag'\n | 'texts'\n | 'state'\n | 'screen'\n | 'requiredCharAmount'\n | 'onInputFinished'\n | 'countdownDuration'\n | 'onChangeState'\n | 'onSmsRetryClick'\n | 'onChangeScreen'\n | 'onFatalErrorOkButtonClick'\n | 'tempBlockDuration'\n | 'hideCountdownSection'\n >\n> &\n Pick<\n ConfirmationProps,\n | 'phone'\n | 'blockSmsRetry'\n | 'onTempBlockFinished'\n | 'clearCodeOnError'\n | 'initialScreenHintSlot'\n | 'errorVisibleDuration'\n | 'breakpoint'\n | 'client'\n > & {\n timeLeft: number;\n };\n\nexport interface ConfirmationTexts {\n /**\n * Экран INITIAL\n */\n title?: ReactNode; // заголовок\n codeError?: string; // ошибка проверки кода\n codeErrorExpired?: string; // код устарел, запросите новый\n codeErrorExpiredEnded?: string; // код устарел\n codeChecking?: string; // код проверяется\n codeSending?: string; // код отправляется\n codeSended?: string; // код отправлен\n buttonRetry?: string; // кнопка повторной отправки кода\n linkToHint?: string; // ссылка на экран HINT\n noAttemptsLeft?: string; // не осталось попыток запроса кода\n countdown?: string; // 'запросить повторно можно через'\n\n /**\n * Экран HINT\n */\n hintTitle?: string; // заголовок\n hintDescription?: string; // описание\n hintNotification?: string; // уведомление\n hintButton?: string; // кнопка 'Вернуться'\n domesticPhone?: string; // номер телефона для звонков по России\n internationalPhone?: string; // номер телефона для звонков из-за границы\n\n /**\n * Экран FATAL_ERROR\n */\n fatalErrorTitle?: ReactNode; // заголовок\n fatalErrorDescription?: ReactNode; // описание\n fatalErrorButton?: string; // кнопка\n\n /**\n * Экран TEMP_BLOCK\n */\n tempBlockTitle?: ReactNode; // заголовок\n tempBlockDescription?: ReactNode; // описание\n\n /**\n * Экран TEMP_BLOCK_OVER\n */\n tempBlockOverTitle?: ReactNode; // заголовок\n tempBlockOverDescription?: ReactNode; // описание\n tempBlockOverButton?: string; // кнопка\n}\n\nexport type ConfirmationScreen =\n | 'INITIAL' // начальный экран\n | 'HINT' // экран \"Не приходит смс?\"\n | 'FATAL_ERROR' // экран критической ошибки\n | 'TEMP_BLOCK' // экран временной блокировки\n | 'TEMP_BLOCK_OVER'; // экран todo\n\nexport type ConfirmationState =\n | 'INITIAL' // начальное состояние\n | 'CODE_CHECKING' // проверка кода\n | 'CODE_SENDING' // повторная отправка кода\n | 'CODE_ERROR' // ошибка, когда ввели неверный код\n | 'CODE_EXPIRED' // ошибка, когда код устарел, но можно запросить новый\n | 'CODE_EXPIRED_ENDED'; // ошибка, когда код устарел\n\nexport interface ScreensMap {\n [key: string]: ComponentType;\n}\n\nexport const defaultTexts: ConfirmationTexts = {\n title: 'Введите код из\\xa0уведомления',\n codeError: 'Код не подходит, проверьте его',\n codeErrorExpired: 'Код устарел, запросите новый',\n codeErrorExpiredEnded: 'Код устарел',\n codeChecking: '',\n codeSending: '',\n buttonRetry: 'Запросить код',\n hintTitle: 'Не\\xa0приходит код?',\n hintDescription: 'Если\\xa0сменили номер, позвоните нам или обратитесь в\\xa0любой офис банка.',\n hintNotification:\n 'Если номер не\\xa0меняли, попробуйте запросить код позже — возможно, перегружен сервис отправки уведомлений.',\n linkToHint: 'Не\\xa0приходит код?',\n hintButton: 'Вернуться к\\xa0вводу кода',\n noAttemptsLeft: 'Не\\xa0осталось попыток запроса кода',\n fatalErrorTitle: 'Ввести код больше нельзя',\n fatalErrorDescription:\n 'Мы ограничили следующие попытки ввода, потому\\xa0что код был введён неверно больше 5 раз.',\n fatalErrorButton: 'Понятно',\n tempBlockTitle: 'Ввести код пока нельзя',\n tempBlockDescription: 'Слишком много неверных попыток. Запросите новый позже',\n tempBlockOverTitle: 'Ввод разблокирован',\n tempBlockOverDescription: 'Теперь можно запросить новый код',\n tempBlockOverButton: 'Запросить новый код',\n codeSended: 'Код отправлен',\n countdown: 'Запросить новый можно через',\n domesticPhone: '8 800 200 00 00',\n internationalPhone: '+7 495 78 888 78',\n};\n"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"types.js","sources":["../src/types.ts"],"sourcesContent":["import { type ComponentType, type CSSProperties, type ReactNode } from 'react';\n\nexport interface ConfirmationProps {\n /**\n * Экран компонента\n */\n screen: ConfirmationScreen | string;\n\n /**\n * Состояние компонента\n */\n state: ConfirmationState | string;\n\n /**\n * Мобильная версия компонента для экрана\n */\n mobile?: boolean;\n\n /**\n * Позиционирование контента\n */\n alignContent?: 'left' | 'center';\n\n /**\n * HTML тег для заголовка\n * @default 'h3'\n */\n titleTag?: 'h1' | 'h2' | 'h3' | 'h4' | 'h5' | 'h6';\n\n /**\n * Объект с текстами\n */\n texts?: ConfirmationTexts;\n\n /**\n * Количество символов, которое можно ввести в поле ввода подписания до того, как произойдет автоотправка\n */\n requiredCharAmount?: number;\n\n /**\n * Длительность обратного отсчета на кнопке повторного запроса сообщения, в милисекундах\n */\n countdownDuration?: number;\n\n /**\n * Продолжительность блокировки формы (ms)\n */\n tempBlockDuration?: number;\n\n /**\n * Номер телефона, на который отправлен код\n */\n phone?: string;\n\n /**\n * Не осталось попыток ввода кода\n */\n blockSmsRetry?: boolean;\n\n /**\n * Идентификатор для систем автоматизированного тестирования\n */\n dataTestId?: string;\n\n /**\n * Сss класс для стилизации общей обёртки\n */\n className?: string;\n\n /**\n * Максимальная ширина контейнера компонента.\n * Для mobile по умолчанию используется 288px, если не передано значение.\n */\n maxWidth?: CSSProperties['maxWidth'];\n\n /**\n * Флаг - нужно ли очищать код при возникновении ошибки\n */\n clearCodeOnError?: boolean;\n\n /**\n * Функция обновления состояния компонента\n */\n onChangeState: (state: ConfirmationState | string) => void;\n\n /**\n * Функция обновления состояния компонента\n */\n onChangeScreen: (state: ConfirmationScreen | string) => void;\n\n /**\n * Обработчик события завершения ввода кода подписания\n */\n onInputFinished: (code: string) => void;\n\n /**\n * Обработчик события нажатия на кнопку \"Запросить код\"\n */\n onSmsRetryClick: () => void;\n\n /**\n * Клик по кнопке \"Понятно\" на экране фатальной ошибки\n */\n onFatalErrorOkButtonClick?: () => void;\n\n /**\n * Временная блокировка формы закончилась\n */\n onTempBlockFinished?: () => void;\n\n /**\n * Возвращает объект, где ключ - название экрана (screen), значение - компонент для экрана\n */\n getScreensMap?: (defaultScreensMap: ScreensMap) => ScreensMap;\n\n /**\n * Дочерние элементы\n */\n children?: ReactNode;\n\n /**\n * Скрыть секцию с повторной отправкой кода\n * @default false\n */\n hideCountdownSection?: boolean;\n\n /**\n * Слот для контента с подсказкой на главном экране\n */\n initialScreenHintSlot?: ReactNode;\n\n /**\n * Контрольная точка для кнопки, с нее начинается desktop версия\n * @default 1024\n */\n breakpoint?: number;\n\n /**\n * Версия, которая будет использоваться при серверном рендеринге\n */\n client?: 'desktop' | 'mobile';\n\n /**\n * Продолжительность отображения ошибки\n * @default 1300\n */\n errorVisibleDuration?: number;\n\n /**\n * Ограничение навигации фокусом между ячейками\n * @default false\n */\n strictFocus?: boolean;\n}\n\nexport type TConfirmationContext = Required<\n Pick<\n ConfirmationProps,\n | 'alignContent'\n | 'titleTag'\n | 'texts'\n | 'state'\n | 'screen'\n | 'requiredCharAmount'\n | 'onInputFinished'\n | 'countdownDuration'\n | 'onChangeState'\n | 'onSmsRetryClick'\n | 'onChangeScreen'\n | 'onFatalErrorOkButtonClick'\n | 'tempBlockDuration'\n | 'hideCountdownSection'\n | 'strictFocus'\n >\n> &\n Pick<\n ConfirmationProps,\n | 'phone'\n | 'blockSmsRetry'\n | 'onTempBlockFinished'\n | 'clearCodeOnError'\n | 'initialScreenHintSlot'\n | 'errorVisibleDuration'\n | 'breakpoint'\n | 'client'\n > & {\n timeLeft: number;\n };\n\nexport interface ConfirmationTexts {\n /**\n * Экран INITIAL\n */\n title?: ReactNode; // заголовок\n codeError?: string; // ошибка проверки кода\n codeErrorExpired?: string; // код устарел, запросите новый\n codeErrorExpiredEnded?: string; // код устарел\n codeChecking?: string; // код проверяется\n codeSending?: string; // код отправляется\n codeSended?: string; // код отправлен\n buttonRetry?: string; // кнопка повторной отправки кода\n linkToHint?: string; // ссылка на экран HINT\n noAttemptsLeft?: string; // не осталось попыток запроса кода\n countdown?: string; // 'запросить повторно можно через'\n\n /**\n * Экран HINT\n */\n hintTitle?: string; // заголовок\n hintDescription?: string; // описание\n hintNotification?: string; // уведомление\n hintButton?: string; // кнопка 'Вернуться'\n domesticPhone?: string; // номер телефона для звонков по России\n internationalPhone?: string; // номер телефона для звонков из-за границы\n\n /**\n * Экран FATAL_ERROR\n */\n fatalErrorTitle?: ReactNode; // заголовок\n fatalErrorDescription?: ReactNode; // описание\n fatalErrorButton?: string; // кнопка\n\n /**\n * Экран TEMP_BLOCK\n */\n tempBlockTitle?: ReactNode; // заголовок\n tempBlockDescription?: ReactNode; // описание\n\n /**\n * Экран TEMP_BLOCK_OVER\n */\n tempBlockOverTitle?: ReactNode; // заголовок\n tempBlockOverDescription?: ReactNode; // описание\n tempBlockOverButton?: string; // кнопка\n}\n\nexport type ConfirmationScreen =\n | 'INITIAL' // начальный экран\n | 'HINT' // экран \"Не приходит смс?\"\n | 'FATAL_ERROR' // экран критической ошибки\n | 'TEMP_BLOCK' // экран временной блокировки\n | 'TEMP_BLOCK_OVER'; // экран todo\n\nexport type ConfirmationState =\n | 'INITIAL' // начальное состояние\n | 'CODE_CHECKING' // проверка кода\n | 'CODE_SENDING' // повторная отправка кода\n | 'CODE_ERROR' // ошибка, когда ввели неверный код\n | 'CODE_EXPIRED' // ошибка, когда код устарел, но можно запросить новый\n | 'CODE_EXPIRED_ENDED'; // ошибка, когда код устарел\n\nexport interface ScreensMap {\n [key: string]: ComponentType;\n}\n\nexport const defaultTexts: ConfirmationTexts = {\n title: 'Введите код из\\xa0уведомления',\n codeError: 'Код не подходит, проверьте его',\n codeErrorExpired: 'Код устарел, запросите новый',\n codeErrorExpiredEnded: 'Код устарел',\n codeChecking: '',\n codeSending: '',\n buttonRetry: 'Запросить код',\n hintTitle: 'Не\\xa0приходит код?',\n hintDescription: 'Если\\xa0сменили номер, позвоните нам или обратитесь в\\xa0любой офис банка.',\n hintNotification:\n 'Если номер не\\xa0меняли, попробуйте запросить код позже — возможно, перегружен сервис отправки уведомлений.',\n linkToHint: 'Не\\xa0приходит код?',\n hintButton: 'Вернуться к\\xa0вводу кода',\n noAttemptsLeft: 'Не\\xa0осталось попыток запроса кода',\n fatalErrorTitle: 'Ввести код больше нельзя',\n fatalErrorDescription:\n 'Мы ограничили следующие попытки ввода, потому\\xa0что код был введён неверно больше 5 раз.',\n fatalErrorButton: 'Понятно',\n tempBlockTitle: 'Ввести код пока нельзя',\n tempBlockDescription: 'Слишком много неверных попыток. Запросите новый позже',\n tempBlockOverTitle: 'Ввод разблокирован',\n tempBlockOverDescription: 'Теперь можно запросить новый код',\n tempBlockOverButton: 'Запросить новый код',\n codeSended: 'Код отправлен',\n countdown: 'Запросить новый можно через',\n domesticPhone: '8 800 200 00 00',\n internationalPhone: '+7 495 78 888 78',\n};\n"],"names":[],"mappings":"AA+Pa,IAAA,YAAY,GAAsB;AAC3C,IAAA,KAAK,EAAE,+BAA+B;AACtC,IAAA,SAAS,EAAE,gCAAgC;AAC3C,IAAA,gBAAgB,EAAE,8BAA8B;AAChD,IAAA,qBAAqB,EAAE,aAAa;AACpC,IAAA,YAAY,EAAE,EAAE;AAChB,IAAA,WAAW,EAAE,EAAE;AACf,IAAA,WAAW,EAAE,eAAe;AAC5B,IAAA,SAAS,EAAE,qBAAqB;AAChC,IAAA,eAAe,EAAE,4EAA4E;AAC7F,IAAA,gBAAgB,EACZ,6GAA6G;AACjH,IAAA,UAAU,EAAE,qBAAqB;AACjC,IAAA,UAAU,EAAE,2BAA2B;AACvC,IAAA,cAAc,EAAE,qCAAqC;AACrD,IAAA,eAAe,EAAE,0BAA0B;AAC3C,IAAA,qBAAqB,EACjB,2FAA2F;AAC/F,IAAA,gBAAgB,EAAE,SAAS;AAC3B,IAAA,cAAc,EAAE,wBAAwB;AACxC,IAAA,oBAAoB,EAAE,uDAAuD;AAC7E,IAAA,kBAAkB,EAAE,oBAAoB;AACxC,IAAA,wBAAwB,EAAE,kCAAkC;AAC5D,IAAA,mBAAmB,EAAE,qBAAqB;AAC1C,IAAA,UAAU,EAAE,eAAe;AAC3B,IAAA,SAAS,EAAE,6BAA6B;AACxC,IAAA,aAAa,EAAE,iBAAiB;AAChC,IAAA,kBAAkB,EAAE,kBAAkB;;;;;"}
|
|
@@ -18,7 +18,7 @@ const confirmationScreens = {
|
|
|
18
18
|
TEMP_BLOCK: TempBlock,
|
|
19
19
|
TEMP_BLOCK_OVER: TempBlockOver,
|
|
20
20
|
};
|
|
21
|
-
const BaseConfirmation = ({ state, screen, titleTag = 'h3', alignContent = 'left', children, requiredCharAmount = 5, countdownDuration = ONE_MINUTE, tempBlockDuration = ONE_DAY, phone, blockSmsRetry, dataTestId, className, maxWidth, getScreensMap, onInputFinished, onChangeState, onSmsRetryClick, onChangeScreen, onFatalErrorOkButtonClick, onTempBlockFinished, mobile, clearCodeOnError = true, hideCountdownSection = false, breakpoint, client, initialScreenHintSlot, errorVisibleDuration, ...restProps }) => {
|
|
21
|
+
const BaseConfirmation = ({ state, screen, titleTag = 'h3', alignContent = 'left', children, requiredCharAmount = 5, countdownDuration = ONE_MINUTE, tempBlockDuration = ONE_DAY, phone, blockSmsRetry, dataTestId, className, maxWidth, getScreensMap, onInputFinished, onChangeState, onSmsRetryClick, onChangeScreen, onFatalErrorOkButtonClick, onTempBlockFinished, mobile, clearCodeOnError = true, hideCountdownSection = false, breakpoint, client, initialScreenHintSlot, errorVisibleDuration, strictFocus = false, ...restProps }) => {
|
|
22
22
|
const [timeLeft, startTimer, stopTimer] = useCountdown(countdownDuration);
|
|
23
23
|
const prevState = usePrevious(state);
|
|
24
24
|
useEffect(() => {
|
|
@@ -70,6 +70,7 @@ const BaseConfirmation = ({ state, screen, titleTag = 'h3', alignContent = 'left
|
|
|
70
70
|
blockSmsRetry,
|
|
71
71
|
breakpoint,
|
|
72
72
|
client,
|
|
73
|
+
strictFocus,
|
|
73
74
|
onTempBlockFinished,
|
|
74
75
|
onChangeState,
|
|
75
76
|
onChangeScreen,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"component.js","sources":["../../../src/components/base-confirmation/component.tsx"],"sourcesContent":["import React, { type ComponentType, type FC, useEffect, useMemo } from 'react';\nimport cn from 'classnames';\n\nimport { usePrevious } from '@alfalab/hooks';\n\nimport { ConfirmationContext } from '../../context';\nimport { type ConfirmationProps, defaultTexts, type TConfirmationContext } from '../../types';\nimport { ONE_DAY, ONE_MINUTE, useCountdown } from '../../utils';\nimport { FatalError, Hint, Initial, TempBlock, TempBlockOver } from '../screens';\n\nimport styles from './index.module.css';\n\nconst confirmationScreens: { [key: string]: ComponentType<{ mobile?: boolean }> } = {\n INITIAL: Initial,\n HINT: Hint,\n FATAL_ERROR: FatalError,\n TEMP_BLOCK: TempBlock,\n TEMP_BLOCK_OVER: TempBlockOver,\n};\n\nexport const BaseConfirmation: FC<ConfirmationProps> = ({\n state,\n screen,\n titleTag = 'h3',\n alignContent = 'left',\n children,\n requiredCharAmount = 5,\n countdownDuration = ONE_MINUTE,\n tempBlockDuration = ONE_DAY,\n phone,\n blockSmsRetry,\n dataTestId,\n className,\n maxWidth,\n getScreensMap,\n onInputFinished,\n onChangeState,\n onSmsRetryClick,\n onChangeScreen,\n onFatalErrorOkButtonClick,\n onTempBlockFinished,\n mobile,\n clearCodeOnError = true,\n hideCountdownSection = false,\n breakpoint,\n client,\n initialScreenHintSlot,\n errorVisibleDuration,\n ...restProps\n}) => {\n const [timeLeft, startTimer, stopTimer] = useCountdown(countdownDuration);\n\n const prevState = usePrevious(state);\n\n useEffect(() => {\n startTimer();\n }, [startTimer]);\n\n useEffect(() => {\n /**\n * Перезапускаем таймер после повторного запроса кода\n */\n if (state === 'INITIAL' && prevState === 'CODE_SENDING') {\n startTimer();\n }\n }, [state, prevState, startTimer]);\n\n useEffect(() => {\n /**\n * Останавливаем таймер, если новый экран/состояние не содержит таймер\n */\n if (\n !['INITIAL', 'HINT', 'TEMP_BLOCK', 'TEMP_BLOCK_OVER'].includes(screen) ||\n blockSmsRetry\n ) {\n stopTimer();\n }\n }, [state, screen, blockSmsRetry, stopTimer]);\n\n const handleSmsRetry = () => {\n onChangeState('CODE_SENDING');\n\n onSmsRetryClick();\n };\n\n const handleInputFinished = (code: string) => {\n onChangeState('CODE_CHECKING');\n\n onInputFinished(code);\n };\n\n const handleFatalErrorOkButtonClick = () => {\n if (onFatalErrorOkButtonClick) {\n onFatalErrorOkButtonClick();\n }\n };\n\n // eslint-disable-next-line react/jsx-no-constructed-context-values\n const contextValue: TConfirmationContext = {\n hideCountdownSection,\n alignContent,\n titleTag,\n texts: { ...defaultTexts, ...restProps.texts },\n state,\n screen,\n requiredCharAmount,\n countdownDuration,\n timeLeft,\n tempBlockDuration,\n phone,\n blockSmsRetry,\n breakpoint,\n client,\n onTempBlockFinished,\n onChangeState,\n onChangeScreen,\n clearCodeOnError,\n errorVisibleDuration,\n initialScreenHintSlot,\n onInputFinished: handleInputFinished,\n onSmsRetryClick: handleSmsRetry,\n onFatalErrorOkButtonClick: handleFatalErrorOkButtonClick,\n };\n\n const customScreen = useMemo(() => getScreensMap?.(confirmationScreens), [getScreensMap]);\n\n const screensMap = customScreen || confirmationScreens;\n\n const CurrentScreen = screensMap[screen];\n\n return (\n <ConfirmationContext.Provider value={contextValue}>\n <div\n className={cn(styles.component, className, {\n [styles.center]: alignContent === 'center',\n })}\n style={{ maxWidth }}\n data-test-id={dataTestId}\n >\n {CurrentScreen && <CurrentScreen mobile={mobile} />}\n </div>\n </ConfirmationContext.Provider>\n );\n};\n"],"names":[],"mappings":";;;;;;;;;;;;;AAYA,MAAM,mBAAmB,GAA2D;AAChF,IAAA,OAAO,EAAE,OAAO;AAChB,IAAA,IAAI,EAAE,IAAI;AACV,IAAA,WAAW,EAAE,UAAU;AACvB,IAAA,UAAU,EAAE,SAAS;AACrB,IAAA,eAAe,EAAE,aAAa;CACjC;AAEY,MAAA,gBAAgB,GAA0B,CAAC,EACpD,KAAK,EACL,MAAM,EACN,QAAQ,GAAG,IAAI,EACf,YAAY,GAAG,MAAM,EACrB,QAAQ,EACR,kBAAkB,GAAG,CAAC,EACtB,iBAAiB,GAAG,UAAU,EAC9B,iBAAiB,GAAG,OAAO,EAC3B,KAAK,EACL,aAAa,EACb,UAAU,EACV,SAAS,EACT,QAAQ,EACR,aAAa,EACb,eAAe,EACf,aAAa,EACb,eAAe,EACf,cAAc,EACd,yBAAyB,EACzB,mBAAmB,EACnB,MAAM,EACN,gBAAgB,GAAG,IAAI,EACvB,oBAAoB,GAAG,KAAK,EAC5B,UAAU,EACV,MAAM,EACN,qBAAqB,EACrB,oBAAoB,EACpB,GAAG,SAAS,EACf,KAAI;AACD,IAAA,MAAM,CAAC,QAAQ,EAAE,UAAU,EAAE,SAAS,CAAC,GAAG,YAAY,CAAC,iBAAiB,CAAC;AAEzE,IAAA,MAAM,SAAS,GAAG,WAAW,CAAC,KAAK,CAAC;IAEpC,SAAS,CAAC,MAAK;AACX,QAAA,UAAU,EAAE;AAChB,KAAC,EAAE,CAAC,UAAU,CAAC,CAAC;IAEhB,SAAS,CAAC,MAAK;AACX;;AAEG;QACH,IAAI,KAAK,KAAK,SAAS,IAAI,SAAS,KAAK,cAAc,EAAE;AACrD,YAAA,UAAU,EAAE;;KAEnB,EAAE,CAAC,KAAK,EAAE,SAAS,EAAE,UAAU,CAAC,CAAC;IAElC,SAAS,CAAC,MAAK;AACX;;AAEG;AACH,QAAA,IACI,CAAC,CAAC,SAAS,EAAE,MAAM,EAAE,YAAY,EAAE,iBAAiB,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC;AACtE,YAAA,aAAa,EACf;AACE,YAAA,SAAS,EAAE;;KAElB,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,aAAa,EAAE,SAAS,CAAC,CAAC;IAE7C,MAAM,cAAc,GAAG,MAAK;QACxB,aAAa,CAAC,cAAc,CAAC;AAE7B,QAAA,eAAe,EAAE;AACrB,KAAC;AAED,IAAA,MAAM,mBAAmB,GAAG,CAAC,IAAY,KAAI;QACzC,aAAa,CAAC,eAAe,CAAC;QAE9B,eAAe,CAAC,IAAI,CAAC;AACzB,KAAC;IAED,MAAM,6BAA6B,GAAG,MAAK;QACvC,IAAI,yBAAyB,EAAE;AAC3B,YAAA,yBAAyB,EAAE;;AAEnC,KAAC;;AAGD,IAAA,MAAM,YAAY,GAAyB;QACvC,oBAAoB;QACpB,YAAY;QACZ,QAAQ;QACR,KAAK,EAAE,EAAE,GAAG,YAAY,EAAE,GAAG,SAAS,CAAC,KAAK,EAAE;QAC9C,KAAK;QACL,MAAM;QACN,kBAAkB;QAClB,iBAAiB;QACjB,QAAQ;QACR,iBAAiB;QACjB,KAAK;QACL,aAAa;QACb,UAAU;QACV,MAAM;QACN,mBAAmB;QACnB,aAAa;QACb,cAAc;QACd,gBAAgB;QAChB,oBAAoB;QACpB,qBAAqB;AACrB,QAAA,eAAe,EAAE,mBAAmB;AACpC,QAAA,eAAe,EAAE,cAAc;AAC/B,QAAA,yBAAyB,EAAE,6BAA6B;KAC3D;AAED,IAAA,MAAM,YAAY,GAAG,OAAO,CAAC,MAAM,aAAa,GAAG,mBAAmB,CAAC,EAAE,CAAC,aAAa,CAAC,CAAC;AAEzF,IAAA,MAAM,UAAU,GAAG,YAAY,IAAI,mBAAmB;AAEtD,IAAA,MAAM,aAAa,GAAG,UAAU,CAAC,MAAM,CAAC;IAExC,QACI,oBAAC,mBAAmB,CAAC,QAAQ,EAAC,EAAA,KAAK,EAAE,YAAY,EAAA;QAC7C,KACI,CAAA,aAAA,CAAA,KAAA,EAAA,EAAA,SAAS,EAAE,EAAE,CAAC,MAAM,CAAC,SAAS,EAAE,SAAS,EAAE;AACvC,gBAAA,CAAC,MAAM,CAAC,MAAM,GAAG,YAAY,KAAK,QAAQ;aAC7C,CAAC,EACF,KAAK,EAAE,EAAE,QAAQ,EAAE,EAAA,cAAA,EACL,UAAU,EAEvB,EAAA,aAAa,IAAI,KAAC,CAAA,aAAA,CAAA,aAAa,IAAC,MAAM,EAAE,MAAM,EAAI,CAAA,CACjD,CACqB;AAEvC;;;;"}
|
|
1
|
+
{"version":3,"file":"component.js","sources":["../../../src/components/base-confirmation/component.tsx"],"sourcesContent":["import React, { type ComponentType, type FC, useEffect, useMemo } from 'react';\nimport cn from 'classnames';\n\nimport { usePrevious } from '@alfalab/hooks';\n\nimport { ConfirmationContext } from '../../context';\nimport { type ConfirmationProps, defaultTexts, type TConfirmationContext } from '../../types';\nimport { ONE_DAY, ONE_MINUTE, useCountdown } from '../../utils';\nimport { FatalError, Hint, Initial, TempBlock, TempBlockOver } from '../screens';\n\nimport styles from './index.module.css';\n\nconst confirmationScreens: { [key: string]: ComponentType<{ mobile?: boolean }> } = {\n INITIAL: Initial,\n HINT: Hint,\n FATAL_ERROR: FatalError,\n TEMP_BLOCK: TempBlock,\n TEMP_BLOCK_OVER: TempBlockOver,\n};\n\nexport const BaseConfirmation: FC<ConfirmationProps> = ({\n state,\n screen,\n titleTag = 'h3',\n alignContent = 'left',\n children,\n requiredCharAmount = 5,\n countdownDuration = ONE_MINUTE,\n tempBlockDuration = ONE_DAY,\n phone,\n blockSmsRetry,\n dataTestId,\n className,\n maxWidth,\n getScreensMap,\n onInputFinished,\n onChangeState,\n onSmsRetryClick,\n onChangeScreen,\n onFatalErrorOkButtonClick,\n onTempBlockFinished,\n mobile,\n clearCodeOnError = true,\n hideCountdownSection = false,\n breakpoint,\n client,\n initialScreenHintSlot,\n errorVisibleDuration,\n strictFocus = false,\n ...restProps\n}) => {\n const [timeLeft, startTimer, stopTimer] = useCountdown(countdownDuration);\n\n const prevState = usePrevious(state);\n\n useEffect(() => {\n startTimer();\n }, [startTimer]);\n\n useEffect(() => {\n /**\n * Перезапускаем таймер после повторного запроса кода\n */\n if (state === 'INITIAL' && prevState === 'CODE_SENDING') {\n startTimer();\n }\n }, [state, prevState, startTimer]);\n\n useEffect(() => {\n /**\n * Останавливаем таймер, если новый экран/состояние не содержит таймер\n */\n if (\n !['INITIAL', 'HINT', 'TEMP_BLOCK', 'TEMP_BLOCK_OVER'].includes(screen) ||\n blockSmsRetry\n ) {\n stopTimer();\n }\n }, [state, screen, blockSmsRetry, stopTimer]);\n\n const handleSmsRetry = () => {\n onChangeState('CODE_SENDING');\n\n onSmsRetryClick();\n };\n\n const handleInputFinished = (code: string) => {\n onChangeState('CODE_CHECKING');\n\n onInputFinished(code);\n };\n\n const handleFatalErrorOkButtonClick = () => {\n if (onFatalErrorOkButtonClick) {\n onFatalErrorOkButtonClick();\n }\n };\n\n // eslint-disable-next-line react/jsx-no-constructed-context-values\n const contextValue: TConfirmationContext = {\n hideCountdownSection,\n alignContent,\n titleTag,\n texts: { ...defaultTexts, ...restProps.texts },\n state,\n screen,\n requiredCharAmount,\n countdownDuration,\n timeLeft,\n tempBlockDuration,\n phone,\n blockSmsRetry,\n breakpoint,\n client,\n strictFocus,\n onTempBlockFinished,\n onChangeState,\n onChangeScreen,\n clearCodeOnError,\n errorVisibleDuration,\n initialScreenHintSlot,\n onInputFinished: handleInputFinished,\n onSmsRetryClick: handleSmsRetry,\n onFatalErrorOkButtonClick: handleFatalErrorOkButtonClick,\n };\n\n const customScreen = useMemo(() => getScreensMap?.(confirmationScreens), [getScreensMap]);\n\n const screensMap = customScreen || confirmationScreens;\n\n const CurrentScreen = screensMap[screen];\n\n return (\n <ConfirmationContext.Provider value={contextValue}>\n <div\n className={cn(styles.component, className, {\n [styles.center]: alignContent === 'center',\n })}\n style={{ maxWidth }}\n data-test-id={dataTestId}\n >\n {CurrentScreen && <CurrentScreen mobile={mobile} />}\n </div>\n </ConfirmationContext.Provider>\n );\n};\n"],"names":[],"mappings":";;;;;;;;;;;;;AAYA,MAAM,mBAAmB,GAA2D;AAChF,IAAA,OAAO,EAAE,OAAO;AAChB,IAAA,IAAI,EAAE,IAAI;AACV,IAAA,WAAW,EAAE,UAAU;AACvB,IAAA,UAAU,EAAE,SAAS;AACrB,IAAA,eAAe,EAAE,aAAa;CACjC;AAEY,MAAA,gBAAgB,GAA0B,CAAC,EACpD,KAAK,EACL,MAAM,EACN,QAAQ,GAAG,IAAI,EACf,YAAY,GAAG,MAAM,EACrB,QAAQ,EACR,kBAAkB,GAAG,CAAC,EACtB,iBAAiB,GAAG,UAAU,EAC9B,iBAAiB,GAAG,OAAO,EAC3B,KAAK,EACL,aAAa,EACb,UAAU,EACV,SAAS,EACT,QAAQ,EACR,aAAa,EACb,eAAe,EACf,aAAa,EACb,eAAe,EACf,cAAc,EACd,yBAAyB,EACzB,mBAAmB,EACnB,MAAM,EACN,gBAAgB,GAAG,IAAI,EACvB,oBAAoB,GAAG,KAAK,EAC5B,UAAU,EACV,MAAM,EACN,qBAAqB,EACrB,oBAAoB,EACpB,WAAW,GAAG,KAAK,EACnB,GAAG,SAAS,EACf,KAAI;AACD,IAAA,MAAM,CAAC,QAAQ,EAAE,UAAU,EAAE,SAAS,CAAC,GAAG,YAAY,CAAC,iBAAiB,CAAC;AAEzE,IAAA,MAAM,SAAS,GAAG,WAAW,CAAC,KAAK,CAAC;IAEpC,SAAS,CAAC,MAAK;AACX,QAAA,UAAU,EAAE;AAChB,KAAC,EAAE,CAAC,UAAU,CAAC,CAAC;IAEhB,SAAS,CAAC,MAAK;AACX;;AAEG;QACH,IAAI,KAAK,KAAK,SAAS,IAAI,SAAS,KAAK,cAAc,EAAE;AACrD,YAAA,UAAU,EAAE;;KAEnB,EAAE,CAAC,KAAK,EAAE,SAAS,EAAE,UAAU,CAAC,CAAC;IAElC,SAAS,CAAC,MAAK;AACX;;AAEG;AACH,QAAA,IACI,CAAC,CAAC,SAAS,EAAE,MAAM,EAAE,YAAY,EAAE,iBAAiB,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC;AACtE,YAAA,aAAa,EACf;AACE,YAAA,SAAS,EAAE;;KAElB,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,aAAa,EAAE,SAAS,CAAC,CAAC;IAE7C,MAAM,cAAc,GAAG,MAAK;QACxB,aAAa,CAAC,cAAc,CAAC;AAE7B,QAAA,eAAe,EAAE;AACrB,KAAC;AAED,IAAA,MAAM,mBAAmB,GAAG,CAAC,IAAY,KAAI;QACzC,aAAa,CAAC,eAAe,CAAC;QAE9B,eAAe,CAAC,IAAI,CAAC;AACzB,KAAC;IAED,MAAM,6BAA6B,GAAG,MAAK;QACvC,IAAI,yBAAyB,EAAE;AAC3B,YAAA,yBAAyB,EAAE;;AAEnC,KAAC;;AAGD,IAAA,MAAM,YAAY,GAAyB;QACvC,oBAAoB;QACpB,YAAY;QACZ,QAAQ;QACR,KAAK,EAAE,EAAE,GAAG,YAAY,EAAE,GAAG,SAAS,CAAC,KAAK,EAAE;QAC9C,KAAK;QACL,MAAM;QACN,kBAAkB;QAClB,iBAAiB;QACjB,QAAQ;QACR,iBAAiB;QACjB,KAAK;QACL,aAAa;QACb,UAAU;QACV,MAAM;QACN,WAAW;QACX,mBAAmB;QACnB,aAAa;QACb,cAAc;QACd,gBAAgB;QAChB,oBAAoB;QACpB,qBAAqB;AACrB,QAAA,eAAe,EAAE,mBAAmB;AACpC,QAAA,eAAe,EAAE,cAAc;AAC/B,QAAA,yBAAyB,EAAE,6BAA6B;KAC3D;AAED,IAAA,MAAM,YAAY,GAAG,OAAO,CAAC,MAAM,aAAa,GAAG,mBAAmB,CAAC,EAAE,CAAC,aAAa,CAAC,CAAC;AAEzF,IAAA,MAAM,UAAU,GAAG,YAAY,IAAI,mBAAmB;AAEtD,IAAA,MAAM,aAAa,GAAG,UAAU,CAAC,MAAM,CAAC;IAExC,QACI,oBAAC,mBAAmB,CAAC,QAAQ,EAAC,EAAA,KAAK,EAAE,YAAY,EAAA;QAC7C,KACI,CAAA,aAAA,CAAA,KAAA,EAAA,EAAA,SAAS,EAAE,EAAE,CAAC,MAAM,CAAC,SAAS,EAAE,SAAS,EAAE;AACvC,gBAAA,CAAC,MAAM,CAAC,MAAM,GAAG,YAAY,KAAK,QAAQ;aAC7C,CAAC,EACF,KAAK,EAAE,EAAE,QAAQ,EAAE,EAAA,cAAA,EACL,UAAU,EAEvB,EAAA,aAAa,IAAI,KAAC,CAAA,aAAA,CAAA,aAAa,IAAC,MAAM,EAAE,MAAM,EAAI,CAAA,CACjD,CACqB;AAEvC;;;;"}
|
|
@@ -4,11 +4,11 @@
|
|
|
4
4
|
:root {
|
|
5
5
|
--gap-0: 0px;
|
|
6
6
|
}
|
|
7
|
-
.
|
|
7
|
+
.confirmation__component_uxe4n {
|
|
8
8
|
width: 100%;
|
|
9
9
|
max-width: 388px;
|
|
10
10
|
color: var(--color-light-text-secondary);
|
|
11
11
|
}
|
|
12
|
-
.
|
|
12
|
+
.confirmation__component_uxe4n.confirmation__center_uxe4n {
|
|
13
13
|
margin: var(--gap-0) auto;
|
|
14
14
|
}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import './index.css';
|
|
2
2
|
|
|
3
|
-
const styles = {"component":"
|
|
3
|
+
const styles = {"component":"confirmation__component_uxe4n","center":"confirmation__center_uxe4n"};
|
|
4
4
|
|
|
5
5
|
export { styles as default };
|
|
6
6
|
//# sourceMappingURL=index.module.css.js.map
|
|
@@ -13,27 +13,27 @@
|
|
|
13
13
|
:root {
|
|
14
14
|
--confirmation-text-color: var(--color-light-text-primary)
|
|
15
15
|
}
|
|
16
|
-
.
|
|
16
|
+
.confirmation__component_142if {
|
|
17
17
|
display: flex;
|
|
18
18
|
flex-direction: column;
|
|
19
19
|
}
|
|
20
|
-
.
|
|
20
|
+
.confirmation__typographyTheme_142if.confirmation__typographyTheme_142if {
|
|
21
21
|
font-size: 16px;
|
|
22
22
|
line-height: 24px;
|
|
23
23
|
font-weight: 400;
|
|
24
24
|
font-family: var(--font-family-system);
|
|
25
25
|
color: var(--confirmation-text-color);
|
|
26
26
|
}
|
|
27
|
-
.
|
|
27
|
+
.confirmation__typographyThemeMobile_142if.confirmation__typographyThemeMobile_142if {
|
|
28
28
|
color: var(--color-light-text-secondary);
|
|
29
29
|
}
|
|
30
|
-
.
|
|
30
|
+
.confirmation__left_142if {
|
|
31
31
|
align-items: flex-start;
|
|
32
32
|
}
|
|
33
|
-
.
|
|
33
|
+
.confirmation__center_142if {
|
|
34
34
|
align-items: center;
|
|
35
35
|
text-align: center;
|
|
36
36
|
}
|
|
37
|
-
.
|
|
37
|
+
.confirmation__button_142if.confirmation__button_142if {
|
|
38
38
|
margin-top: var(--gap-32);
|
|
39
39
|
}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import './index.css';
|
|
2
2
|
|
|
3
|
-
const styles = {"component":"
|
|
3
|
+
const styles = {"component":"confirmation__component_142if","typographyTheme":"confirmation__typographyTheme_142if","typographyThemeMobile":"confirmation__typographyThemeMobile_142if","left":"confirmation__left_142if","center":"confirmation__center_142if","button":"confirmation__button_142if"};
|
|
4
4
|
|
|
5
5
|
export { styles as default };
|
|
6
6
|
//# sourceMappingURL=index.module.css.js.map
|
|
@@ -18,52 +18,52 @@
|
|
|
18
18
|
:root {
|
|
19
19
|
--confirmation-text-color: var(--color-light-text-primary)
|
|
20
20
|
}
|
|
21
|
-
.
|
|
21
|
+
.confirmation__component_k0ehe {
|
|
22
22
|
display: flex;
|
|
23
23
|
flex-direction: column;
|
|
24
24
|
align-items: flex-start;
|
|
25
25
|
}
|
|
26
|
-
.
|
|
26
|
+
.confirmation__component_k0ehe span:last-of-type {
|
|
27
27
|
margin-bottom: var(--gap-0);
|
|
28
28
|
}
|
|
29
|
-
.
|
|
29
|
+
.confirmation__center_k0ehe {
|
|
30
30
|
align-items: center;
|
|
31
31
|
text-align: center;
|
|
32
32
|
}
|
|
33
|
-
.
|
|
33
|
+
.confirmation__text_k0ehe.confirmation__text_k0ehe {
|
|
34
34
|
margin-bottom: var(--gap-24);
|
|
35
35
|
}
|
|
36
|
-
.
|
|
36
|
+
.confirmation__typographyTheme_k0ehe.confirmation__typographyTheme_k0ehe {
|
|
37
37
|
font-size: 16px;
|
|
38
38
|
line-height: 24px;
|
|
39
39
|
font-weight: 400;
|
|
40
40
|
font-family: var(--font-family-system);
|
|
41
41
|
color: var(--confirmation-text-color);
|
|
42
42
|
}
|
|
43
|
-
.
|
|
43
|
+
.confirmation__typographyThemeMobile_k0ehe.confirmation__typographyThemeMobile_k0ehe {
|
|
44
44
|
color: var(--color-light-text-secondary);
|
|
45
45
|
}
|
|
46
|
-
.
|
|
46
|
+
.confirmation__phonesWrap_k0ehe {
|
|
47
47
|
display: flex;
|
|
48
48
|
flex-direction: column;
|
|
49
49
|
margin-bottom: var(--gap-24);
|
|
50
50
|
}
|
|
51
|
-
.
|
|
51
|
+
.confirmation__phoneWrap_k0ehe {
|
|
52
52
|
margin-bottom: var(--gap-8);
|
|
53
53
|
}
|
|
54
|
-
.
|
|
54
|
+
.confirmation__phoneWrap_k0ehe:last-child {
|
|
55
55
|
margin-bottom: var(--gap-0);
|
|
56
56
|
}
|
|
57
|
-
.
|
|
57
|
+
.confirmation__phoneLink_k0ehe.confirmation__phoneLink_k0ehe {
|
|
58
58
|
font-size: 16px;
|
|
59
59
|
line-height: 24px;
|
|
60
60
|
font-weight: 500;
|
|
61
61
|
font-family: var(--font-family-system);
|
|
62
62
|
}
|
|
63
|
-
.
|
|
63
|
+
.confirmation__hintButton_k0ehe {
|
|
64
64
|
margin-top: var(--gap-32);
|
|
65
65
|
}
|
|
66
|
-
.
|
|
66
|
+
.confirmation__phoneContentMobile_k0ehe {
|
|
67
67
|
display: flex;
|
|
68
68
|
flex-direction: column;
|
|
69
69
|
}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import './index.css';
|
|
2
2
|
|
|
3
|
-
const styles = {"component":"
|
|
3
|
+
const styles = {"component":"confirmation__component_k0ehe","center":"confirmation__center_k0ehe","text":"confirmation__text_k0ehe","typographyTheme":"confirmation__typographyTheme_k0ehe","typographyThemeMobile":"confirmation__typographyThemeMobile_k0ehe","phonesWrap":"confirmation__phonesWrap_k0ehe","phoneWrap":"confirmation__phoneWrap_k0ehe","phoneLink":"confirmation__phoneLink_k0ehe","hintButton":"confirmation__hintButton_k0ehe","phoneContentMobile":"confirmation__phoneContentMobile_k0ehe"};
|
|
4
4
|
|
|
5
5
|
export { styles as default };
|
|
6
6
|
//# sourceMappingURL=index.module.css.js.map
|
|
@@ -13,7 +13,7 @@ import styles from './index.module.css.js';
|
|
|
13
13
|
|
|
14
14
|
const CODE_SEND_HINT_VISIBLE_DURATION = 2000;
|
|
15
15
|
const Initial = ({ mobile }) => {
|
|
16
|
-
const { state, alignContent, titleTag, texts, requiredCharAmount, timeLeft, phone, clearCodeOnError, hideCountdownSection, initialScreenHintSlot, errorVisibleDuration, onChangeState, onInputFinished, onChangeScreen, onSmsRetryClick, } = useContext(ConfirmationContext);
|
|
16
|
+
const { state, alignContent, titleTag, texts, requiredCharAmount, timeLeft, phone, clearCodeOnError, hideCountdownSection, initialScreenHintSlot, errorVisibleDuration, strictFocus, onChangeState, onInputFinished, onChangeScreen, onSmsRetryClick, } = useContext(ConfirmationContext);
|
|
17
17
|
const prevState = usePrevious(state);
|
|
18
18
|
const inputRef = useRef(null);
|
|
19
19
|
const [codeSendHintVisible, setCodeSendHintVisible] = useState(false);
|
|
@@ -100,7 +100,7 @@ const Initial = ({ mobile }) => {
|
|
|
100
100
|
}) },
|
|
101
101
|
"\u041E\u0442\u043F\u0440\u0430\u0432\u0438\u043B\u0438 \u043D\u0430 ",
|
|
102
102
|
phone)) : null,
|
|
103
|
-
React.createElement(ComponentCodeInput, { disabled: processing, error: getCodeInputError(), ref: inputRef, fields: requiredCharAmount, className: cn(styles.containerInput, styles.codeInput), onComplete: handleInputComplete, onChange: handleInputChange, clearCodeOnError: clearCodeOnError, errorVisibleDuration: errorVisibleDuration, onErrorAnimationEnd: handleErrorAnimationEnd }),
|
|
103
|
+
React.createElement(ComponentCodeInput, { disabled: processing, error: getCodeInputError(), ref: inputRef, fields: requiredCharAmount, strictFocus: strictFocus, className: cn(styles.containerInput, styles.codeInput), onComplete: handleInputComplete, onChange: handleInputChange, clearCodeOnError: clearCodeOnError, errorVisibleDuration: errorVisibleDuration, onErrorAnimationEnd: handleErrorAnimationEnd }),
|
|
104
104
|
!hideCountdownSection && (React.createElement(CountdownSection, { processing: processing, timePassed: timePassed, codeSendHintVisible: codeSendHintVisible, handleSmsRetryClick: handleSmsRetryClick, mobile: mobile })),
|
|
105
105
|
renderHintButton()));
|
|
106
106
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"component.js","sources":["../../../../src/components/screens/initial/component.tsx"],"sourcesContent":["import React, { type FC, useCallback, useContext, useEffect, useRef, useState } from 'react';\nimport cn from 'classnames';\n\nimport { ButtonMobile } from '@alfalab/core-components-button/mobile';\nimport { CodeInputDesktop } from '@alfalab/core-components-code-input/desktop';\nimport { CodeInputMobile } from '@alfalab/core-components-code-input/mobile';\nimport {\n type BaseCodeInputProps,\n type CustomInputRef,\n} from '@alfalab/core-components-code-input/shared';\nimport { Link } from '@alfalab/core-components-link';\nimport { TypographyText } from '@alfalab/core-components-typography';\nimport { useLayoutEffect_SAFE_FOR_SSR, usePrevious } from '@alfalab/hooks';\n\nimport { ConfirmationContext } from '../../../context';\nimport { Header } from '../../header';\n\nimport { CountdownSection } from './countdown-section';\n\nimport styles from './index.module.css';\n\nexport type InitialProps = {\n /**\n * Отображать в мобильной версии экран компонента\n */\n mobile?: boolean;\n};\n\nconst CODE_SEND_HINT_VISIBLE_DURATION = 2000;\n\nexport const Initial: FC<InitialProps> = ({ mobile }) => {\n const {\n state,\n alignContent,\n titleTag,\n texts,\n requiredCharAmount,\n timeLeft,\n phone,\n clearCodeOnError,\n hideCountdownSection,\n initialScreenHintSlot,\n errorVisibleDuration,\n onChangeState,\n onInputFinished,\n onChangeScreen,\n onSmsRetryClick,\n } = useContext(ConfirmationContext);\n\n const prevState = usePrevious(state);\n\n const inputRef = useRef<CustomInputRef>(null);\n\n const [codeSendHintVisible, setCodeSendHintVisible] = useState(false);\n\n const timerId = useRef(0);\n\n const handleInputComplete: BaseCodeInputProps['onComplete'] = (code) => {\n onInputFinished(code);\n };\n\n const handleSmsHintLinkClick = () => {\n onChangeScreen('HINT');\n };\n\n const handleInputChange = () => {\n if (state === 'CODE_ERROR') {\n onChangeState('INITIAL');\n }\n };\n\n const handleSmsRetryClick = () => {\n if (inputRef.current) {\n inputRef.current.reset();\n }\n\n onSmsRetryClick();\n };\n\n const handleErrorAnimationEnd = () => {\n if (clearCodeOnError && state !== 'INITIAL') {\n onChangeState('INITIAL');\n }\n };\n\n const clearTimer = useCallback(() => {\n window.clearTimeout(timerId.current);\n }, []);\n\n useEffect(() => {\n if (inputRef.current) {\n inputRef.current.focus();\n }\n\n return () => {\n clearTimer();\n };\n }, [clearTimer]);\n\n useEffect(() => {\n if (!inputRef.current) {\n return;\n }\n\n if (prevState === 'CODE_SENDING' && state !== 'CODE_SENDING') {\n inputRef.current.focus();\n }\n }, [prevState, state, requiredCharAmount]);\n\n useLayoutEffect_SAFE_FOR_SSR(() => {\n if (prevState === 'CODE_SENDING' && state !== 'CODE_SENDING') {\n setCodeSendHintVisible(true);\n\n clearTimer();\n\n timerId.current = window.setTimeout(() => {\n setCodeSendHintVisible(false);\n }, CODE_SEND_HINT_VISIBLE_DURATION);\n }\n }, [prevState, state, clearTimer]);\n\n const getCodeInputError = (): string | boolean => {\n if (state === 'CODE_EXPIRED') {\n return texts.codeErrorExpired || true;\n }\n\n if (state === 'CODE_EXPIRED_ENDED') {\n return texts.codeErrorExpiredEnded || true;\n }\n\n if (state === 'CODE_ERROR') {\n return texts.codeError || true;\n }\n\n return false;\n };\n\n const renderHintButton = () => {\n if (initialScreenHintSlot) {\n return initialScreenHintSlot;\n }\n\n if (mobile) {\n return (\n <ButtonMobile\n onClick={handleSmsHintLinkClick}\n className={styles.smsBtn}\n view='text'\n size={40}\n >\n {texts.linkToHint}\n </ButtonMobile>\n );\n }\n\n return (\n <Link\n onClick={handleSmsHintLinkClick}\n className={styles.smsComeLink}\n view={mobile ? 'primary' : 'secondary'}\n pseudo={true}\n >\n {texts.linkToHint}\n </Link>\n );\n };\n\n const processing = ['CODE_CHECKING', 'CODE_SENDING'].includes(state);\n\n const timePassed = timeLeft === 0;\n\n const ComponentCodeInput = mobile ? CodeInputMobile : CodeInputDesktop;\n\n return (\n <div className={cn(styles.component, styles[alignContent])}>\n <Header mobile={mobile} titleTag={titleTag}>\n {texts.title}\n </Header>\n\n {phone ? (\n <TypographyText\n view='primary-medium'\n color='primary'\n className={cn(styles.phone, {\n [styles.typographyTheme]: !mobile,\n [styles.typographyThemeMobile]: mobile,\n })}\n >\n Отправили на {phone}\n </TypographyText>\n ) : null}\n <ComponentCodeInput\n disabled={processing}\n error={getCodeInputError()}\n ref={inputRef}\n fields={requiredCharAmount}\n className={cn(styles.containerInput, styles.codeInput)}\n onComplete={handleInputComplete}\n onChange={handleInputChange}\n clearCodeOnError={clearCodeOnError}\n errorVisibleDuration={errorVisibleDuration}\n onErrorAnimationEnd={handleErrorAnimationEnd}\n />\n {!hideCountdownSection && (\n <CountdownSection\n processing={processing}\n timePassed={timePassed}\n codeSendHintVisible={codeSendHintVisible}\n handleSmsRetryClick={handleSmsRetryClick}\n mobile={mobile}\n />\n )}\n\n {renderHintButton()}\n </div>\n );\n};\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"component.js","sources":["../../../../src/components/screens/initial/component.tsx"],"sourcesContent":["import React, { type FC, useCallback, useContext, useEffect, useRef, useState } from 'react';\nimport cn from 'classnames';\n\nimport { ButtonMobile } from '@alfalab/core-components-button/mobile';\nimport { CodeInputDesktop } from '@alfalab/core-components-code-input/desktop';\nimport { CodeInputMobile } from '@alfalab/core-components-code-input/mobile';\nimport {\n type BaseCodeInputProps,\n type CustomInputRef,\n} from '@alfalab/core-components-code-input/shared';\nimport { Link } from '@alfalab/core-components-link';\nimport { TypographyText } from '@alfalab/core-components-typography';\nimport { useLayoutEffect_SAFE_FOR_SSR, usePrevious } from '@alfalab/hooks';\n\nimport { ConfirmationContext } from '../../../context';\nimport { Header } from '../../header';\n\nimport { CountdownSection } from './countdown-section';\n\nimport styles from './index.module.css';\n\nexport type InitialProps = {\n /**\n * Отображать в мобильной версии экран компонента\n */\n mobile?: boolean;\n};\n\nconst CODE_SEND_HINT_VISIBLE_DURATION = 2000;\n\nexport const Initial: FC<InitialProps> = ({ mobile }) => {\n const {\n state,\n alignContent,\n titleTag,\n texts,\n requiredCharAmount,\n timeLeft,\n phone,\n clearCodeOnError,\n hideCountdownSection,\n initialScreenHintSlot,\n errorVisibleDuration,\n strictFocus,\n onChangeState,\n onInputFinished,\n onChangeScreen,\n onSmsRetryClick,\n } = useContext(ConfirmationContext);\n\n const prevState = usePrevious(state);\n\n const inputRef = useRef<CustomInputRef>(null);\n\n const [codeSendHintVisible, setCodeSendHintVisible] = useState(false);\n\n const timerId = useRef(0);\n\n const handleInputComplete: BaseCodeInputProps['onComplete'] = (code) => {\n onInputFinished(code);\n };\n\n const handleSmsHintLinkClick = () => {\n onChangeScreen('HINT');\n };\n\n const handleInputChange = () => {\n if (state === 'CODE_ERROR') {\n onChangeState('INITIAL');\n }\n };\n\n const handleSmsRetryClick = () => {\n if (inputRef.current) {\n inputRef.current.reset();\n }\n\n onSmsRetryClick();\n };\n\n const handleErrorAnimationEnd = () => {\n if (clearCodeOnError && state !== 'INITIAL') {\n onChangeState('INITIAL');\n }\n };\n\n const clearTimer = useCallback(() => {\n window.clearTimeout(timerId.current);\n }, []);\n\n useEffect(() => {\n if (inputRef.current) {\n inputRef.current.focus();\n }\n\n return () => {\n clearTimer();\n };\n }, [clearTimer]);\n\n useEffect(() => {\n if (!inputRef.current) {\n return;\n }\n\n if (prevState === 'CODE_SENDING' && state !== 'CODE_SENDING') {\n inputRef.current.focus();\n }\n }, [prevState, state, requiredCharAmount]);\n\n useLayoutEffect_SAFE_FOR_SSR(() => {\n if (prevState === 'CODE_SENDING' && state !== 'CODE_SENDING') {\n setCodeSendHintVisible(true);\n\n clearTimer();\n\n timerId.current = window.setTimeout(() => {\n setCodeSendHintVisible(false);\n }, CODE_SEND_HINT_VISIBLE_DURATION);\n }\n }, [prevState, state, clearTimer]);\n\n const getCodeInputError = (): string | boolean => {\n if (state === 'CODE_EXPIRED') {\n return texts.codeErrorExpired || true;\n }\n\n if (state === 'CODE_EXPIRED_ENDED') {\n return texts.codeErrorExpiredEnded || true;\n }\n\n if (state === 'CODE_ERROR') {\n return texts.codeError || true;\n }\n\n return false;\n };\n\n const renderHintButton = () => {\n if (initialScreenHintSlot) {\n return initialScreenHintSlot;\n }\n\n if (mobile) {\n return (\n <ButtonMobile\n onClick={handleSmsHintLinkClick}\n className={styles.smsBtn}\n view='text'\n size={40}\n >\n {texts.linkToHint}\n </ButtonMobile>\n );\n }\n\n return (\n <Link\n onClick={handleSmsHintLinkClick}\n className={styles.smsComeLink}\n view={mobile ? 'primary' : 'secondary'}\n pseudo={true}\n >\n {texts.linkToHint}\n </Link>\n );\n };\n\n const processing = ['CODE_CHECKING', 'CODE_SENDING'].includes(state);\n\n const timePassed = timeLeft === 0;\n\n const ComponentCodeInput = mobile ? CodeInputMobile : CodeInputDesktop;\n\n return (\n <div className={cn(styles.component, styles[alignContent])}>\n <Header mobile={mobile} titleTag={titleTag}>\n {texts.title}\n </Header>\n\n {phone ? (\n <TypographyText\n view='primary-medium'\n color='primary'\n className={cn(styles.phone, {\n [styles.typographyTheme]: !mobile,\n [styles.typographyThemeMobile]: mobile,\n })}\n >\n Отправили на {phone}\n </TypographyText>\n ) : null}\n <ComponentCodeInput\n disabled={processing}\n error={getCodeInputError()}\n ref={inputRef}\n fields={requiredCharAmount}\n strictFocus={strictFocus}\n className={cn(styles.containerInput, styles.codeInput)}\n onComplete={handleInputComplete}\n onChange={handleInputChange}\n clearCodeOnError={clearCodeOnError}\n errorVisibleDuration={errorVisibleDuration}\n onErrorAnimationEnd={handleErrorAnimationEnd}\n />\n {!hideCountdownSection && (\n <CountdownSection\n processing={processing}\n timePassed={timePassed}\n codeSendHintVisible={codeSendHintVisible}\n handleSmsRetryClick={handleSmsRetryClick}\n mobile={mobile}\n />\n )}\n\n {renderHintButton()}\n </div>\n );\n};\n"],"names":[],"mappings":";;;;;;;;;;;;;AA4BA,MAAM,+BAA+B,GAAG,IAAI;MAE/B,OAAO,GAAqB,CAAC,EAAE,MAAM,EAAE,KAAI;AACpD,IAAA,MAAM,EACF,KAAK,EACL,YAAY,EACZ,QAAQ,EACR,KAAK,EACL,kBAAkB,EAClB,QAAQ,EACR,KAAK,EACL,gBAAgB,EAChB,oBAAoB,EACpB,qBAAqB,EACrB,oBAAoB,EACpB,WAAW,EACX,aAAa,EACb,eAAe,EACf,cAAc,EACd,eAAe,GAClB,GAAG,UAAU,CAAC,mBAAmB,CAAC;AAEnC,IAAA,MAAM,SAAS,GAAG,WAAW,CAAC,KAAK,CAAC;AAEpC,IAAA,MAAM,QAAQ,GAAG,MAAM,CAAiB,IAAI,CAAC;IAE7C,MAAM,CAAC,mBAAmB,EAAE,sBAAsB,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC;AAErE,IAAA,MAAM,OAAO,GAAG,MAAM,CAAC,CAAC,CAAC;AAEzB,IAAA,MAAM,mBAAmB,GAAqC,CAAC,IAAI,KAAI;QACnE,eAAe,CAAC,IAAI,CAAC;AACzB,KAAC;IAED,MAAM,sBAAsB,GAAG,MAAK;QAChC,cAAc,CAAC,MAAM,CAAC;AAC1B,KAAC;IAED,MAAM,iBAAiB,GAAG,MAAK;AAC3B,QAAA,IAAI,KAAK,KAAK,YAAY,EAAE;YACxB,aAAa,CAAC,SAAS,CAAC;;AAEhC,KAAC;IAED,MAAM,mBAAmB,GAAG,MAAK;AAC7B,QAAA,IAAI,QAAQ,CAAC,OAAO,EAAE;AAClB,YAAA,QAAQ,CAAC,OAAO,CAAC,KAAK,EAAE;;AAG5B,QAAA,eAAe,EAAE;AACrB,KAAC;IAED,MAAM,uBAAuB,GAAG,MAAK;AACjC,QAAA,IAAI,gBAAgB,IAAI,KAAK,KAAK,SAAS,EAAE;YACzC,aAAa,CAAC,SAAS,CAAC;;AAEhC,KAAC;AAED,IAAA,MAAM,UAAU,GAAG,WAAW,CAAC,MAAK;AAChC,QAAA,MAAM,CAAC,YAAY,CAAC,OAAO,CAAC,OAAO,CAAC;KACvC,EAAE,EAAE,CAAC;IAEN,SAAS,CAAC,MAAK;AACX,QAAA,IAAI,QAAQ,CAAC,OAAO,EAAE;AAClB,YAAA,QAAQ,CAAC,OAAO,CAAC,KAAK,EAAE;;AAG5B,QAAA,OAAO,MAAK;AACR,YAAA,UAAU,EAAE;AAChB,SAAC;AACL,KAAC,EAAE,CAAC,UAAU,CAAC,CAAC;IAEhB,SAAS,CAAC,MAAK;AACX,QAAA,IAAI,CAAC,QAAQ,CAAC,OAAO,EAAE;YACnB;;QAGJ,IAAI,SAAS,KAAK,cAAc,IAAI,KAAK,KAAK,cAAc,EAAE;AAC1D,YAAA,QAAQ,CAAC,OAAO,CAAC,KAAK,EAAE;;KAE/B,EAAE,CAAC,SAAS,EAAE,KAAK,EAAE,kBAAkB,CAAC,CAAC;IAE1C,4BAA4B,CAAC,MAAK;QAC9B,IAAI,SAAS,KAAK,cAAc,IAAI,KAAK,KAAK,cAAc,EAAE;YAC1D,sBAAsB,CAAC,IAAI,CAAC;AAE5B,YAAA,UAAU,EAAE;YAEZ,OAAO,CAAC,OAAO,GAAG,MAAM,CAAC,UAAU,CAAC,MAAK;gBACrC,sBAAsB,CAAC,KAAK,CAAC;aAChC,EAAE,+BAA+B,CAAC;;KAE1C,EAAE,CAAC,SAAS,EAAE,KAAK,EAAE,UAAU,CAAC,CAAC;IAElC,MAAM,iBAAiB,GAAG,MAAuB;AAC7C,QAAA,IAAI,KAAK,KAAK,cAAc,EAAE;AAC1B,YAAA,OAAO,KAAK,CAAC,gBAAgB,IAAI,IAAI;;AAGzC,QAAA,IAAI,KAAK,KAAK,oBAAoB,EAAE;AAChC,YAAA,OAAO,KAAK,CAAC,qBAAqB,IAAI,IAAI;;AAG9C,QAAA,IAAI,KAAK,KAAK,YAAY,EAAE;AACxB,YAAA,OAAO,KAAK,CAAC,SAAS,IAAI,IAAI;;AAGlC,QAAA,OAAO,KAAK;AAChB,KAAC;IAED,MAAM,gBAAgB,GAAG,MAAK;QAC1B,IAAI,qBAAqB,EAAE;AACvB,YAAA,OAAO,qBAAqB;;QAGhC,IAAI,MAAM,EAAE;YACR,QACI,KAAC,CAAA,aAAA,CAAA,YAAY,EACT,EAAA,OAAO,EAAE,sBAAsB,EAC/B,SAAS,EAAE,MAAM,CAAC,MAAM,EACxB,IAAI,EAAC,MAAM,EACX,IAAI,EAAE,EAAE,EAEP,EAAA,KAAK,CAAC,UAAU,CACN;;AAIvB,QAAA,QACI,KAAA,CAAA,aAAA,CAAC,IAAI,EAAA,EACD,OAAO,EAAE,sBAAsB,EAC/B,SAAS,EAAE,MAAM,CAAC,WAAW,EAC7B,IAAI,EAAE,MAAM,GAAG,SAAS,GAAG,WAAW,EACtC,MAAM,EAAE,IAAI,IAEX,KAAK,CAAC,UAAU,CACd;AAEf,KAAC;AAED,IAAA,MAAM,UAAU,GAAG,CAAC,eAAe,EAAE,cAAc,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC;AAEpE,IAAA,MAAM,UAAU,GAAG,QAAQ,KAAK,CAAC;IAEjC,MAAM,kBAAkB,GAAG,MAAM,GAAG,eAAe,GAAG,gBAAgB;AAEtE,IAAA,QACI,KAAA,CAAA,aAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAE,EAAE,CAAC,MAAM,CAAC,SAAS,EAAE,MAAM,CAAC,YAAY,CAAC,CAAC,EAAA;AACtD,QAAA,KAAA,CAAA,aAAA,CAAC,MAAM,EAAA,EAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAA,EACrC,KAAK,CAAC,KAAK,CACP;QAER,KAAK,IACF,oBAAC,cAAc,EAAA,EACX,IAAI,EAAC,gBAAgB,EACrB,KAAK,EAAC,SAAS,EACf,SAAS,EAAE,EAAE,CAAC,MAAM,CAAC,KAAK,EAAE;AACxB,gBAAA,CAAC,MAAM,CAAC,eAAe,GAAG,CAAC,MAAM;AACjC,gBAAA,CAAC,MAAM,CAAC,qBAAqB,GAAG,MAAM;aACzC,CAAC,EAAA;;AAEY,YAAA,KAAK,CACN,IACjB,IAAI;QACR,KAAC,CAAA,aAAA,CAAA,kBAAkB,EACf,EAAA,QAAQ,EAAE,UAAU,EACpB,KAAK,EAAE,iBAAiB,EAAE,EAC1B,GAAG,EAAE,QAAQ,EACb,MAAM,EAAE,kBAAkB,EAC1B,WAAW,EAAE,WAAW,EACxB,SAAS,EAAE,EAAE,CAAC,MAAM,CAAC,cAAc,EAAE,MAAM,CAAC,SAAS,CAAC,EACtD,UAAU,EAAE,mBAAmB,EAC/B,QAAQ,EAAE,iBAAiB,EAC3B,gBAAgB,EAAE,gBAAgB,EAClC,oBAAoB,EAAE,oBAAoB,EAC1C,mBAAmB,EAAE,uBAAuB,EAC9C,CAAA;QACD,CAAC,oBAAoB,KAClB,KAAC,CAAA,aAAA,CAAA,gBAAgB,EACb,EAAA,UAAU,EAAE,UAAU,EACtB,UAAU,EAAE,UAAU,EACtB,mBAAmB,EAAE,mBAAmB,EACxC,mBAAmB,EAAE,mBAAmB,EACxC,MAAM,EAAE,MAAM,EAAA,CAChB,CACL;QAEA,gBAAgB,EAAE,CACjB;AAEd;;;;"}
|