@redneckz/wildless-cms-uni-blocks 0.14.588 → 0.14.590

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (230) hide show
  1. package/bundle/api/RetailApi/RetailApi.d.ts +3 -1
  2. package/bundle/api/RetailApi/RetailApiTypes.d.ts +3 -0
  3. package/bundle/blocks.schema.json +1 -1
  4. package/bundle/bundle.umd.js +187 -59
  5. package/bundle/bundle.umd.min.js +1 -1
  6. package/bundle/hooks/useElementSpace.d.ts +2 -0
  7. package/bundle/icons/IconName.d.ts +4 -2
  8. package/bundle/ui-kit/CaptchaDialog/CaptchaDialog.d.ts +7 -0
  9. package/bundle/ui-kit/CaptchaDialog/checkCaptcha.d.ts +8 -0
  10. package/bundle/ui-kit/CaptchaDialog/createCaptcha.d.ts +1 -0
  11. package/bundle/ui-kit/CaptchaDialog/useCaptchaDialog.d.ts +6 -0
  12. package/bundle/ui-kit/VerifyPhoneDialog/InputCode.d.ts +1 -0
  13. package/bundle/ui-kit/VerifyPhoneDialog/VerifyPhoneDialog.d.ts +3 -3
  14. package/bundle/ui-kit/VerifyPhoneDialog/handleSendCode.d.ts +15 -0
  15. package/bundle/ui-kit/VerifyPhoneDialog/useVerifyPhoneDialogSubmit.d.ts +16 -0
  16. package/cosmos-static/icons/RefreshIcon.svg +1 -0
  17. package/cosmos-static/icons/sprites.svg +1 -0
  18. package/dist/api/RetailApi/RetailApi.d.ts +3 -1
  19. package/dist/api/RetailApi/RetailApi.js +15 -1
  20. package/dist/api/RetailApi/RetailApi.js.map +1 -1
  21. package/dist/api/RetailApi/RetailApiTypes.d.ts +3 -0
  22. package/dist/components/ApplicationLeadForm/useApplicationLeadApi.js +3 -4
  23. package/dist/components/ApplicationLeadForm/useApplicationLeadApi.js.map +1 -1
  24. package/dist/hooks/useElementSpace.d.ts +2 -0
  25. package/dist/hooks/useElementSpace.js +21 -0
  26. package/dist/hooks/useElementSpace.js.map +1 -0
  27. package/dist/icons/IconName.d.ts +4 -2
  28. package/dist/icons/IconName.js +3 -1
  29. package/dist/icons/IconName.js.map +1 -1
  30. package/dist/ui-kit/CaptchaDialog/CaptchaDialog.d.ts +7 -0
  31. package/dist/ui-kit/CaptchaDialog/CaptchaDialog.js +22 -0
  32. package/dist/ui-kit/CaptchaDialog/CaptchaDialog.js.map +1 -0
  33. package/dist/ui-kit/CaptchaDialog/checkCaptcha.d.ts +8 -0
  34. package/dist/ui-kit/CaptchaDialog/checkCaptcha.js +16 -0
  35. package/dist/ui-kit/CaptchaDialog/checkCaptcha.js.map +1 -0
  36. package/dist/ui-kit/CaptchaDialog/createCaptcha.d.ts +1 -0
  37. package/dist/ui-kit/CaptchaDialog/createCaptcha.js +9 -0
  38. package/dist/ui-kit/CaptchaDialog/createCaptcha.js.map +1 -0
  39. package/dist/ui-kit/CaptchaDialog/useCaptchaDialog.d.ts +6 -0
  40. package/dist/ui-kit/CaptchaDialog/useCaptchaDialog.js +15 -0
  41. package/dist/ui-kit/CaptchaDialog/useCaptchaDialog.js.map +1 -0
  42. package/dist/ui-kit/DatePicker/DatePicker.js +5 -1
  43. package/dist/ui-kit/DatePicker/DatePicker.js.map +1 -1
  44. package/dist/ui-kit/VerifyPhoneDialog/InputCode.d.ts +1 -0
  45. package/dist/ui-kit/VerifyPhoneDialog/InputCode.js +2 -2
  46. package/dist/ui-kit/VerifyPhoneDialog/InputCode.js.map +1 -1
  47. package/dist/ui-kit/VerifyPhoneDialog/VerifyPhoneDialog.d.ts +3 -3
  48. package/dist/ui-kit/VerifyPhoneDialog/VerifyPhoneDialog.js +20 -29
  49. package/dist/ui-kit/VerifyPhoneDialog/VerifyPhoneDialog.js.map +1 -1
  50. package/dist/ui-kit/VerifyPhoneDialog/handleSendCode.d.ts +15 -0
  51. package/dist/ui-kit/VerifyPhoneDialog/handleSendCode.js +21 -0
  52. package/dist/ui-kit/VerifyPhoneDialog/handleSendCode.js.map +1 -0
  53. package/dist/ui-kit/VerifyPhoneDialog/useVerifyPhoneDialog.js +1 -1
  54. package/dist/ui-kit/VerifyPhoneDialog/useVerifyPhoneDialog.js.map +1 -1
  55. package/dist/ui-kit/VerifyPhoneDialog/useVerifyPhoneDialogSubmit.d.ts +16 -0
  56. package/dist/ui-kit/VerifyPhoneDialog/useVerifyPhoneDialogSubmit.js +59 -0
  57. package/dist/ui-kit/VerifyPhoneDialog/useVerifyPhoneDialogSubmit.js.map +1 -0
  58. package/lib/api/RetailApi/RetailApi.d.ts +3 -1
  59. package/lib/api/RetailApi/RetailApi.js +15 -1
  60. package/lib/api/RetailApi/RetailApi.js.map +1 -1
  61. package/lib/api/RetailApi/RetailApiTypes.d.ts +3 -0
  62. package/lib/common.css +1 -1
  63. package/lib/components/ApplicationLeadForm/useApplicationLeadApi.js +3 -4
  64. package/lib/components/ApplicationLeadForm/useApplicationLeadApi.js.map +1 -1
  65. package/lib/components/OfficesAtmsMap/OfficesAtmsMapLayout.d.ts +1 -1
  66. package/lib/hooks/useElementSpace.d.ts +2 -0
  67. package/lib/hooks/useElementSpace.js +18 -0
  68. package/lib/hooks/useElementSpace.js.map +1 -0
  69. package/lib/icons/IconName.d.ts +4 -2
  70. package/lib/icons/IconName.js +3 -1
  71. package/lib/icons/IconName.js.map +1 -1
  72. package/lib/ui-kit/CaptchaDialog/CaptchaDialog.d.ts +7 -0
  73. package/lib/ui-kit/CaptchaDialog/CaptchaDialog.fixture.d.ts +6 -0
  74. package/lib/ui-kit/CaptchaDialog/CaptchaDialog.js +20 -0
  75. package/lib/ui-kit/CaptchaDialog/CaptchaDialog.js.map +1 -0
  76. package/lib/ui-kit/CaptchaDialog/checkCaptcha.d.ts +8 -0
  77. package/lib/ui-kit/CaptchaDialog/checkCaptcha.js +13 -0
  78. package/lib/ui-kit/CaptchaDialog/checkCaptcha.js.map +1 -0
  79. package/lib/ui-kit/CaptchaDialog/createCaptcha.d.ts +1 -0
  80. package/lib/ui-kit/CaptchaDialog/createCaptcha.js +6 -0
  81. package/lib/ui-kit/CaptchaDialog/createCaptcha.js.map +1 -0
  82. package/lib/ui-kit/CaptchaDialog/useCaptchaDialog.d.ts +6 -0
  83. package/lib/ui-kit/CaptchaDialog/useCaptchaDialog.js +12 -0
  84. package/lib/ui-kit/CaptchaDialog/useCaptchaDialog.js.map +1 -0
  85. package/lib/ui-kit/DatePicker/DatePicker.js +5 -1
  86. package/lib/ui-kit/DatePicker/DatePicker.js.map +1 -1
  87. package/lib/ui-kit/VerifyPhoneDialog/InputCode.d.ts +1 -0
  88. package/lib/ui-kit/VerifyPhoneDialog/InputCode.js +2 -2
  89. package/lib/ui-kit/VerifyPhoneDialog/InputCode.js.map +1 -1
  90. package/lib/ui-kit/VerifyPhoneDialog/VerifyPhoneDialog.d.ts +3 -3
  91. package/lib/ui-kit/VerifyPhoneDialog/VerifyPhoneDialog.js +21 -30
  92. package/lib/ui-kit/VerifyPhoneDialog/VerifyPhoneDialog.js.map +1 -1
  93. package/lib/ui-kit/VerifyPhoneDialog/handleSendCode.d.ts +15 -0
  94. package/lib/ui-kit/VerifyPhoneDialog/handleSendCode.js +18 -0
  95. package/lib/ui-kit/VerifyPhoneDialog/handleSendCode.js.map +1 -0
  96. package/lib/ui-kit/VerifyPhoneDialog/useVerifyPhoneDialog.js +1 -1
  97. package/lib/ui-kit/VerifyPhoneDialog/useVerifyPhoneDialog.js.map +1 -1
  98. package/lib/ui-kit/VerifyPhoneDialog/useVerifyPhoneDialogSubmit.d.ts +16 -0
  99. package/lib/ui-kit/VerifyPhoneDialog/useVerifyPhoneDialogSubmit.js +56 -0
  100. package/lib/ui-kit/VerifyPhoneDialog/useVerifyPhoneDialogSubmit.js.map +1 -0
  101. package/mobile/bundle/api/RetailApi/RetailApi.d.ts +3 -1
  102. package/mobile/bundle/api/RetailApi/RetailApiTypes.d.ts +3 -0
  103. package/mobile/bundle/bundle.umd.js +187 -59
  104. package/mobile/bundle/bundle.umd.min.js +1 -1
  105. package/mobile/bundle/hooks/useElementSpace.d.ts +2 -0
  106. package/mobile/bundle/icons/IconName.d.ts +4 -2
  107. package/mobile/bundle/ui-kit/CaptchaDialog/CaptchaDialog.d.ts +7 -0
  108. package/mobile/bundle/ui-kit/CaptchaDialog/checkCaptcha.d.ts +8 -0
  109. package/mobile/bundle/ui-kit/CaptchaDialog/createCaptcha.d.ts +1 -0
  110. package/mobile/bundle/ui-kit/CaptchaDialog/useCaptchaDialog.d.ts +6 -0
  111. package/mobile/bundle/ui-kit/VerifyPhoneDialog/InputCode.d.ts +1 -0
  112. package/mobile/bundle/ui-kit/VerifyPhoneDialog/VerifyPhoneDialog.d.ts +3 -3
  113. package/mobile/bundle/ui-kit/VerifyPhoneDialog/handleSendCode.d.ts +15 -0
  114. package/mobile/bundle/ui-kit/VerifyPhoneDialog/useVerifyPhoneDialogSubmit.d.ts +16 -0
  115. package/mobile/dist/api/RetailApi/RetailApi.d.ts +3 -1
  116. package/mobile/dist/api/RetailApi/RetailApi.js +15 -1
  117. package/mobile/dist/api/RetailApi/RetailApi.js.map +1 -1
  118. package/mobile/dist/api/RetailApi/RetailApiTypes.d.ts +3 -0
  119. package/mobile/dist/components/ApplicationLeadForm/useApplicationLeadApi.js +3 -4
  120. package/mobile/dist/components/ApplicationLeadForm/useApplicationLeadApi.js.map +1 -1
  121. package/mobile/dist/hooks/useElementSpace.d.ts +2 -0
  122. package/mobile/dist/hooks/useElementSpace.js +21 -0
  123. package/mobile/dist/hooks/useElementSpace.js.map +1 -0
  124. package/mobile/dist/icons/IconName.d.ts +4 -2
  125. package/mobile/dist/icons/IconName.js +3 -1
  126. package/mobile/dist/icons/IconName.js.map +1 -1
  127. package/mobile/dist/ui-kit/CaptchaDialog/CaptchaDialog.d.ts +7 -0
  128. package/mobile/dist/ui-kit/CaptchaDialog/CaptchaDialog.js +22 -0
  129. package/mobile/dist/ui-kit/CaptchaDialog/CaptchaDialog.js.map +1 -0
  130. package/mobile/dist/ui-kit/CaptchaDialog/checkCaptcha.d.ts +8 -0
  131. package/mobile/dist/ui-kit/CaptchaDialog/checkCaptcha.js +16 -0
  132. package/mobile/dist/ui-kit/CaptchaDialog/checkCaptcha.js.map +1 -0
  133. package/mobile/dist/ui-kit/CaptchaDialog/createCaptcha.d.ts +1 -0
  134. package/mobile/dist/ui-kit/CaptchaDialog/createCaptcha.js +9 -0
  135. package/mobile/dist/ui-kit/CaptchaDialog/createCaptcha.js.map +1 -0
  136. package/mobile/dist/ui-kit/CaptchaDialog/useCaptchaDialog.d.ts +6 -0
  137. package/mobile/dist/ui-kit/CaptchaDialog/useCaptchaDialog.js +15 -0
  138. package/mobile/dist/ui-kit/CaptchaDialog/useCaptchaDialog.js.map +1 -0
  139. package/mobile/dist/ui-kit/DatePicker/DatePicker.js +5 -1
  140. package/mobile/dist/ui-kit/DatePicker/DatePicker.js.map +1 -1
  141. package/mobile/dist/ui-kit/VerifyPhoneDialog/InputCode.d.ts +1 -0
  142. package/mobile/dist/ui-kit/VerifyPhoneDialog/InputCode.js +2 -2
  143. package/mobile/dist/ui-kit/VerifyPhoneDialog/InputCode.js.map +1 -1
  144. package/mobile/dist/ui-kit/VerifyPhoneDialog/VerifyPhoneDialog.d.ts +3 -3
  145. package/mobile/dist/ui-kit/VerifyPhoneDialog/VerifyPhoneDialog.js +20 -29
  146. package/mobile/dist/ui-kit/VerifyPhoneDialog/VerifyPhoneDialog.js.map +1 -1
  147. package/mobile/dist/ui-kit/VerifyPhoneDialog/handleSendCode.d.ts +15 -0
  148. package/mobile/dist/ui-kit/VerifyPhoneDialog/handleSendCode.js +21 -0
  149. package/mobile/dist/ui-kit/VerifyPhoneDialog/handleSendCode.js.map +1 -0
  150. package/mobile/dist/ui-kit/VerifyPhoneDialog/useVerifyPhoneDialog.js +1 -1
  151. package/mobile/dist/ui-kit/VerifyPhoneDialog/useVerifyPhoneDialog.js.map +1 -1
  152. package/mobile/dist/ui-kit/VerifyPhoneDialog/useVerifyPhoneDialogSubmit.d.ts +16 -0
  153. package/mobile/dist/ui-kit/VerifyPhoneDialog/useVerifyPhoneDialogSubmit.js +59 -0
  154. package/mobile/dist/ui-kit/VerifyPhoneDialog/useVerifyPhoneDialogSubmit.js.map +1 -0
  155. package/mobile/lib/api/RetailApi/RetailApi.d.ts +3 -1
  156. package/mobile/lib/api/RetailApi/RetailApi.js +15 -1
  157. package/mobile/lib/api/RetailApi/RetailApi.js.map +1 -1
  158. package/mobile/lib/api/RetailApi/RetailApiTypes.d.ts +3 -0
  159. package/mobile/lib/common.css +1 -1
  160. package/mobile/lib/components/ApplicationLeadForm/useApplicationLeadApi.js +3 -4
  161. package/mobile/lib/components/ApplicationLeadForm/useApplicationLeadApi.js.map +1 -1
  162. package/mobile/lib/hooks/useElementSpace.d.ts +2 -0
  163. package/mobile/lib/hooks/useElementSpace.js +18 -0
  164. package/mobile/lib/hooks/useElementSpace.js.map +1 -0
  165. package/mobile/lib/icons/IconName.d.ts +4 -2
  166. package/mobile/lib/icons/IconName.js +3 -1
  167. package/mobile/lib/icons/IconName.js.map +1 -1
  168. package/mobile/lib/ui-kit/CaptchaDialog/CaptchaDialog.d.ts +7 -0
  169. package/mobile/lib/ui-kit/CaptchaDialog/CaptchaDialog.js +20 -0
  170. package/mobile/lib/ui-kit/CaptchaDialog/CaptchaDialog.js.map +1 -0
  171. package/mobile/lib/ui-kit/CaptchaDialog/checkCaptcha.d.ts +8 -0
  172. package/mobile/lib/ui-kit/CaptchaDialog/checkCaptcha.js +13 -0
  173. package/mobile/lib/ui-kit/CaptchaDialog/checkCaptcha.js.map +1 -0
  174. package/mobile/lib/ui-kit/CaptchaDialog/createCaptcha.d.ts +1 -0
  175. package/mobile/lib/ui-kit/CaptchaDialog/createCaptcha.js +6 -0
  176. package/mobile/lib/ui-kit/CaptchaDialog/createCaptcha.js.map +1 -0
  177. package/mobile/lib/ui-kit/CaptchaDialog/useCaptchaDialog.d.ts +6 -0
  178. package/mobile/lib/ui-kit/CaptchaDialog/useCaptchaDialog.js +12 -0
  179. package/mobile/lib/ui-kit/CaptchaDialog/useCaptchaDialog.js.map +1 -0
  180. package/mobile/lib/ui-kit/DatePicker/DatePicker.js +5 -1
  181. package/mobile/lib/ui-kit/DatePicker/DatePicker.js.map +1 -1
  182. package/mobile/lib/ui-kit/VerifyPhoneDialog/InputCode.d.ts +1 -0
  183. package/mobile/lib/ui-kit/VerifyPhoneDialog/InputCode.js +2 -2
  184. package/mobile/lib/ui-kit/VerifyPhoneDialog/InputCode.js.map +1 -1
  185. package/mobile/lib/ui-kit/VerifyPhoneDialog/VerifyPhoneDialog.d.ts +3 -3
  186. package/mobile/lib/ui-kit/VerifyPhoneDialog/VerifyPhoneDialog.js +21 -30
  187. package/mobile/lib/ui-kit/VerifyPhoneDialog/VerifyPhoneDialog.js.map +1 -1
  188. package/mobile/lib/ui-kit/VerifyPhoneDialog/handleSendCode.d.ts +15 -0
  189. package/mobile/lib/ui-kit/VerifyPhoneDialog/handleSendCode.js +18 -0
  190. package/mobile/lib/ui-kit/VerifyPhoneDialog/handleSendCode.js.map +1 -0
  191. package/mobile/lib/ui-kit/VerifyPhoneDialog/useVerifyPhoneDialog.js +1 -1
  192. package/mobile/lib/ui-kit/VerifyPhoneDialog/useVerifyPhoneDialog.js.map +1 -1
  193. package/mobile/lib/ui-kit/VerifyPhoneDialog/useVerifyPhoneDialogSubmit.d.ts +16 -0
  194. package/mobile/lib/ui-kit/VerifyPhoneDialog/useVerifyPhoneDialogSubmit.js +56 -0
  195. package/mobile/lib/ui-kit/VerifyPhoneDialog/useVerifyPhoneDialogSubmit.js.map +1 -0
  196. package/mobile/src/api/RetailApi/RetailApi.ts +18 -1
  197. package/mobile/src/api/RetailApi/RetailApiTypes.ts +4 -0
  198. package/mobile/src/components/ApplicationLeadForm/useApplicationLeadApi.ts +3 -4
  199. package/mobile/src/hooks/useElementSpace.ts +25 -0
  200. package/mobile/src/icons/IconName.ts +5 -5
  201. package/mobile/src/icons/RefreshIcon.svg +3 -0
  202. package/mobile/src/ui-kit/CaptchaDialog/CaptchaDialog.tsx +68 -0
  203. package/mobile/src/ui-kit/CaptchaDialog/checkCaptcha.ts +25 -0
  204. package/mobile/src/ui-kit/CaptchaDialog/createCaptcha.ts +6 -0
  205. package/mobile/src/ui-kit/CaptchaDialog/useCaptchaDialog.tsx +12 -0
  206. package/mobile/src/ui-kit/DatePicker/DatePicker.tsx +9 -1
  207. package/mobile/src/ui-kit/VerifyPhoneDialog/InputCode.tsx +3 -2
  208. package/mobile/src/ui-kit/VerifyPhoneDialog/VerifyPhoneDialog.tsx +66 -51
  209. package/mobile/src/ui-kit/VerifyPhoneDialog/handleSendCode.ts +37 -0
  210. package/mobile/src/ui-kit/VerifyPhoneDialog/useVerifyPhoneDialog.tsx +2 -1
  211. package/mobile/src/ui-kit/VerifyPhoneDialog/useVerifyPhoneDialogSubmit.tsx +71 -0
  212. package/package.json +2 -2
  213. package/src/api/RetailApi/RetailApi.ts +18 -1
  214. package/src/api/RetailApi/RetailApiTypes.ts +4 -0
  215. package/src/components/ApplicationLeadForm/useApplicationLeadApi.ts +3 -4
  216. package/src/hooks/useElementSpace.ts +25 -0
  217. package/src/icons/IconName.ts +353 -6
  218. package/src/icons/RefreshIcon.svg +3 -0
  219. package/src/ui-kit/CaptchaDialog/CaptchaDialog.fixture.tsx +11 -0
  220. package/src/ui-kit/CaptchaDialog/CaptchaDialog.tsx +68 -0
  221. package/src/ui-kit/CaptchaDialog/checkCaptcha.ts +25 -0
  222. package/src/ui-kit/CaptchaDialog/createCaptcha.ts +6 -0
  223. package/src/ui-kit/CaptchaDialog/useCaptchaDialog.tsx +12 -0
  224. package/src/ui-kit/DatePicker/DatePicker.tsx +9 -1
  225. package/src/ui-kit/VerifyPhoneDialog/InputCode.tsx +3 -2
  226. package/src/ui-kit/VerifyPhoneDialog/VerifyPhoneDialog.fixture.tsx +11 -8
  227. package/src/ui-kit/VerifyPhoneDialog/VerifyPhoneDialog.tsx +66 -51
  228. package/src/ui-kit/VerifyPhoneDialog/handleSendCode.ts +37 -0
  229. package/src/ui-kit/VerifyPhoneDialog/useVerifyPhoneDialog.tsx +2 -1
  230. package/src/ui-kit/VerifyPhoneDialog/useVerifyPhoneDialogSubmit.tsx +71 -0
@@ -0,0 +1,56 @@
1
+ import { useCallback, useEffect, useMemo, useState } from '@redneckz/uni-jsx/lib/hooks';
2
+ import { RETAIL_API } from '../../api/RetailApi/RetailApi.js';
3
+ export const useVerifyPhoneDialogSubmit = ({ close, values }) => {
4
+ const [hasError, setHasError] = useState(false);
5
+ const [errorText, setErrorText] = useState('');
6
+ const [isLoading, setIsLoading] = useState(false);
7
+ const [timeNextReq, setTimeNextReq] = useState(0);
8
+ const [isTimerStarted, setIsTimerStarted] = useState(false);
9
+ const [attemps, setAttemps] = useState(0);
10
+ const resetError = useCallback(() => {
11
+ setHasError(false);
12
+ setErrorText('');
13
+ }, []);
14
+ const isTimeExpired = useMemo(() => timeNextReq === 0 && isTimerStarted, [timeNextReq, isTimerStarted]);
15
+ const isSubmitButtonDisabled = useMemo(() => attemps > 2 || !values.every(Boolean) || isTimeExpired, [values]);
16
+ const handleSubmit = useCallback(async () => {
17
+ try {
18
+ setIsTimerStarted(false);
19
+ setTimeNextReq(0);
20
+ setAttemps(attemps + 1);
21
+ setIsLoading(true);
22
+ await RETAIL_API.CheckCode({
23
+ smsText: values.join(''),
24
+ smsCodesSetName: { key: 'AUTHENTICATION' },
25
+ });
26
+ resetError();
27
+ close && close();
28
+ }
29
+ catch {
30
+ setIsLoading(false);
31
+ attemps > 1 ? setErrorText('Исчерпан лимит ввода смс-кода') : setErrorText('Неверный код');
32
+ setHasError(true);
33
+ }
34
+ }, [values, attemps]);
35
+ useEffect(() => {
36
+ if (isTimeExpired) {
37
+ setHasError(true);
38
+ setErrorText('Код просрочен');
39
+ }
40
+ else {
41
+ setHasError(false);
42
+ }
43
+ }, [isTimeExpired]);
44
+ return {
45
+ handleSubmit,
46
+ hasError,
47
+ errorText,
48
+ isLoading,
49
+ timeNextReq,
50
+ isSubmitButtonDisabled,
51
+ setTimeNextReq,
52
+ setIsTimerStarted,
53
+ setAttemps,
54
+ };
55
+ };
56
+ //# sourceMappingURL=useVerifyPhoneDialogSubmit.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useVerifyPhoneDialogSubmit.js","sourceRoot":"","sources":["../../../src/ui-kit/VerifyPhoneDialog/useVerifyPhoneDialogSubmit.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,6BAA6B,CAAC;AACxF,OAAO,EAAE,UAAU,EAAE,MAAM,+BAA+B,CAAC;AAO3D,MAAM,CAAC,MAAM,0BAA0B,GAAG,CAAC,EAAE,KAAK,EAAE,MAAM,EAAmC,EAAE,EAAE;IAC/F,MAAM,CAAC,QAAQ,EAAE,WAAW,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IAChD,MAAM,CAAC,SAAS,EAAE,YAAY,CAAC,GAAG,QAAQ,CAAC,EAAE,CAAC,CAAC;IAC/C,MAAM,CAAC,SAAS,EAAE,YAAY,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IAClD,MAAM,CAAC,WAAW,EAAE,cAAc,CAAC,GAAG,QAAQ,CAAS,CAAC,CAAC,CAAC;IAC1D,MAAM,CAAC,cAAc,EAAE,iBAAiB,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IAC5D,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC;IAE1C,MAAM,UAAU,GAAG,WAAW,CAAC,GAAG,EAAE;QAClC,WAAW,CAAC,KAAK,CAAC,CAAC;QACnB,YAAY,CAAC,EAAE,CAAC,CAAC;IACnB,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,MAAM,aAAa,GAAG,OAAO,CAC3B,GAAG,EAAE,CAAC,WAAW,KAAK,CAAC,IAAI,cAAc,EACzC,CAAC,WAAW,EAAE,cAAc,CAAC,CAC9B,CAAC;IAEF,MAAM,sBAAsB,GAAG,OAAO,CACpC,GAAG,EAAE,CAAC,OAAO,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,aAAa,EAC5D,CAAC,MAAM,CAAC,CACT,CAAC;IAEF,MAAM,YAAY,GAAG,WAAW,CAAC,KAAK,IAAI,EAAE;QAC1C,IAAI;YACF,iBAAiB,CAAC,KAAK,CAAC,CAAC;YACzB,cAAc,CAAC,CAAC,CAAC,CAAC;YAClB,UAAU,CAAC,OAAO,GAAG,CAAC,CAAC,CAAC;YACxB,YAAY,CAAC,IAAI,CAAC,CAAC;YACnB,MAAM,UAAU,CAAC,SAAS,CAAC;gBACzB,OAAO,EAAE,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC;gBACxB,eAAe,EAAE,EAAE,GAAG,EAAE,gBAAgB,EAAE;aAC3C,CAAC,CAAC;YACH,UAAU,EAAE,CAAC;YACb,KAAK,IAAI,KAAK,EAAE,CAAC;SAClB;QAAC,MAAM;YACN,YAAY,CAAC,KAAK,CAAC,CAAC;YACpB,OAAO,GAAG,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,+BAA+B,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,cAAc,CAAC,CAAC;YAC3F,WAAW,CAAC,IAAI,CAAC,CAAC;SACnB;IACH,CAAC,EAAE,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;IAEtB,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,aAAa,EAAE;YACjB,WAAW,CAAC,IAAI,CAAC,CAAC;YAClB,YAAY,CAAC,eAAe,CAAC,CAAC;SAC/B;aAAM;YACL,WAAW,CAAC,KAAK,CAAC,CAAC;SACpB;IACH,CAAC,EAAE,CAAC,aAAa,CAAC,CAAC,CAAC;IAEpB,OAAO;QACL,YAAY;QACZ,QAAQ;QACR,SAAS;QACT,SAAS;QACT,WAAW;QACX,sBAAsB;QACtB,cAAc;QACd,iBAAiB;QACjB,UAAU;KACX,CAAC;AACJ,CAAC,CAAC"}
@@ -1,4 +1,4 @@
1
- import { type CheckCodeBody, type CreateDraftTaskBody, type CreateDraftTaskResponse, type CreateUserProfileBody, type CreateUserProfileResponse, type SendCodeBody, type UpdateUserProfileBody, type UpdateUserTaskBody } from './RetailApiTypes';
1
+ import { type CapchaTextType, type CheckCodeBody, type CreateDraftTaskBody, type CreateDraftTaskResponse, type CreateUserProfileBody, type CreateUserProfileResponse, type SendCodeBody, type UpdateUserProfileBody, type UpdateUserTaskBody } from './RetailApiTypes';
2
2
  export declare const RETAIL_API: {
3
3
  CreateUserProfile: (body: CreateUserProfileBody) => Promise<CreateUserProfileResponse>;
4
4
  UpdateUserProfile: (body: UpdateUserProfileBody) => Promise<unknown>;
@@ -6,4 +6,6 @@ export declare const RETAIL_API: {
6
6
  UpdateUserTask: (body: UpdateUserTaskBody) => Promise<unknown>;
7
7
  SendCode: (body: SendCodeBody) => Promise<unknown>;
8
8
  CheckCode: (body: CheckCodeBody) => Promise<void>;
9
+ CreateCaptcha: (phoneNumber: string) => Promise<Response>;
10
+ CheckCaptcha: (body: CapchaTextType) => Promise<Response>;
9
11
  };
@@ -81,3 +81,6 @@ export declare type CheckCodeResponse = {
81
81
  expires_in: number;
82
82
  refresh_token: string;
83
83
  };
84
+ export declare type CapchaTextType = {
85
+ captchaText: string;
86
+ };
@@ -1130,9 +1130,9 @@
1130
1130
  onChange && onChange(!value);
1131
1131
  }, [onChange, disabled, value]);
1132
1132
  const icon = isRadio ? (jsx("div", { className: "absolute left-1 w-3 h-3 rounded-full bg-primary-main" })) : (jsx(SVG, { paths: CHECK_PATHS, className: "absolute left-1 ml-px block", width: "11", height: "9", fill: "white", viewBox: "0 0 11 9" }));
1133
- return (jsx("div", { className: className, children: jsxs("label", { className: style('flex items-center relative group/box', getCursorStyle(disabled)), onClick: handleChange, children: [jsx("div", { className: style(defaultCheckStyle, 'm-0', isRadio ? 'rounded-full border-2' : checkboxStyle(value), !disabled && value ? 'border-primary-main' : 'border-gray', disabled ? 'bg-main-disabled' : 'group-hover/box:border-primary-hover'), role: role(isRadio), "aria-checked": Boolean(value), "aria-disabled": Boolean(disabled), "aria-label": text }), value ? icon : null, renderText$2(text)] }) }));
1133
+ return (jsx("div", { className: className, children: jsxs("label", { className: style('flex items-center relative group/box', getCursorStyle(disabled)), onClick: handleChange, children: [jsx("div", { className: style(defaultCheckStyle, 'm-0', isRadio ? 'rounded-full border-2' : checkboxStyle(value), !disabled && value ? 'border-primary-main' : 'border-gray', disabled ? 'bg-main-disabled' : 'group-hover/box:border-primary-hover'), role: role(isRadio), "aria-checked": Boolean(value), "aria-disabled": Boolean(disabled), "aria-label": text }), value ? icon : null, renderText$3(text)] }) }));
1134
1134
  });
1135
- const renderText$2 = (text) => text ? (jsx("div", { className: "ml-s", children: jsx(Text, { size: "text-l", font: "font-light", children: text }) })) : null;
1135
+ const renderText$3 = (text) => text ? (jsx("div", { className: "ml-s", children: jsx(Text, { size: "text-l", font: "font-light", children: text }) })) : null;
1136
1136
  const getCursorStyle = (disabled = false) => (disabled ? 'cursor-not-allowed' : 'cursor-pointer');
1137
1137
  const role = (isRadio = false) => (isRadio ? 'radio' : 'checkbox');
1138
1138
  const checkboxStyle = (value = false) => style('rounded border', { 'bg-primary-main': value });
@@ -1750,6 +1750,23 @@
1750
1750
 
1751
1751
  const BankEmpoleeField = JSX(({ field }) => (jsx(InputControl, { label: "\u0424\u0418\u041E \u0438\u043B\u0438 \u0434\u043E\u043B\u0436\u043D\u043E\u0441\u0442\u044C \u043E\u0431\u0441\u043B\u0443\u0436\u0438\u0432\u0430\u0432\u0448\u0435\u0433\u043E \u0412\u0430\u0441 \u0441\u043E\u0442\u0440\u0443\u0434\u043D\u0438\u043A\u0430 \u0411\u0430\u043D\u043A\u0430", ...field('bankEmpolee') })));
1752
1752
 
1753
+ const useElementSpace = (ref, heightEl) => {
1754
+ const [spaceAbove, setSpaceAbove] = useState(false);
1755
+ useEffect(() => {
1756
+ const handleResize = () => {
1757
+ if (ref?.current) {
1758
+ const { top } = ref.current.getBoundingClientRect();
1759
+ const hasSpaceAbove = top > heightEl;
1760
+ setSpaceAbove(hasSpaceAbove);
1761
+ }
1762
+ };
1763
+ handleResize();
1764
+ window.addEventListener('resize', handleResize);
1765
+ return () => window.removeEventListener('resize', handleResize);
1766
+ }, [ref]);
1767
+ return spaceAbove;
1768
+ };
1769
+
1753
1770
  const DAY_COUNT = 6;
1754
1771
  const WEEK_COUNT = 7;
1755
1772
  const renderCalendarCells = ({ today, firstDayOfWeek, totalDays, currentMonth, currentYear, min, max, onDateClick, }) => {
@@ -1888,7 +1905,10 @@
1888
1905
  selectedMonth,
1889
1906
  showCalendar,
1890
1907
  });
1891
- return (jsxs("div", { className: style('space-y-xs', className), ref: ref, children: [renderLabel(label), jsxs("div", { className: "relative", children: [renderDatePickerForm(handleChangeVisibleCalendar, value, valid), showCalendar ? (jsxs("div", { className: "absolute bg-white z-20 select-none bottom-full", children: [jsxs("div", { className: "flex gap-s", children: [jsx("div", { className: "my-auto", onClick: handlePrevMonth, children: jsx(Icon, { ...ICON_PROPS, className: "-rotate-90 cursor-pointer" }) }), jsx(Select, { onChange: handleSelectMonth, value: { key: months[selectedMonth] }, options: monthsOptions, ...SELECT_PROPS }), jsx(Select, { onChange: handleSelectYear, value: { key: String(selectedYear) }, options: yearsOptions, ...SELECT_PROPS }), jsx("div", { className: "my-auto", onClick: handleNextMonth, children: jsx(Icon, { ...ICON_PROPS, className: "rotate-90 cursor-pointer" }) })] }), jsx(Calendar, { today: value, currentMonth: selectedMonth, currentYear: selectedYear, onDateSelect: onChange, min: minDate, max: maxDate })] })) : null] })] }));
1908
+ const spaceAbove = useElementSpace(ref, 370);
1909
+ return (jsxs("div", { className: style('space-y-xs', className), ref: ref, children: [renderLabel(label), jsxs("div", { className: "relative", children: [renderDatePickerForm(handleChangeVisibleCalendar, value, valid), showCalendar ? (jsxs("div", { className: style('absolute bg-white z-20 select-none', {
1910
+ 'bottom-full': spaceAbove,
1911
+ }), children: [jsxs("div", { className: "flex gap-s", children: [jsx("div", { className: "my-auto", onClick: handlePrevMonth, children: jsx(Icon, { ...ICON_PROPS, className: "-rotate-90 cursor-pointer" }) }), jsx(Select, { onChange: handleSelectMonth, value: { key: months[selectedMonth] }, options: monthsOptions, ...SELECT_PROPS }), jsx(Select, { onChange: handleSelectYear, value: { key: String(selectedYear) }, options: yearsOptions, ...SELECT_PROPS }), jsx("div", { className: "my-auto", onClick: handleNextMonth, children: jsx(Icon, { ...ICON_PROPS, className: "rotate-90 cursor-pointer" }) })] }), jsx(Calendar, { today: value, currentMonth: selectedMonth, currentYear: selectedYear, onDateSelect: onChange, min: minDate, max: maxDate, setValue: setValue })] })) : null] })] }));
1892
1912
  });
1893
1913
  const renderDatePickerForm = (handleChangeVisibleCalendar, value, valid) => (jsxs("div", { onClick: handleChangeVisibleCalendar, className: style(formStyle, valid ? 'border-gray' : 'border-error'), children: [jsx(Paragraph, { children: value && formatDate(value) }), jsx(Icon, { ...ICON_PROPS, name: "CalendarIcon" })] }));
1894
1914
 
@@ -2558,6 +2578,7 @@
2558
2578
 
2559
2579
  const renderSubmitButton = (button, className) => (jsx(Button, { className: style('w-full @xl:w-auto', className), type: "submit", children: button?.text ? button.text : 'Отправить заявку' }));
2560
2580
 
2581
+ const getResponse = (response) => (isJSON(response) ? response.json() : response);
2561
2582
  const getAthorizationHeaders = () => {
2562
2583
  const token = sessionStorage.getItem('accessToken');
2563
2584
  return token ? { Authorization: `Bearer ${token}` } : null;
@@ -2571,7 +2592,18 @@
2571
2592
  },
2572
2593
  credentials: 'include',
2573
2594
  body: body ? JSON.stringify(body) : null,
2574
- }).then((response) => (isJSON(response) ? response.json() : response));
2595
+ })
2596
+ .then((response) => {
2597
+ if (response.ok) {
2598
+ return getResponse(response);
2599
+ }
2600
+ else {
2601
+ throw response;
2602
+ }
2603
+ })
2604
+ .catch((error) => {
2605
+ throw error;
2606
+ });
2575
2607
  const saveToken = (data) => {
2576
2608
  sessionStorage.setItem('accessToken', data.access_token);
2577
2609
  sessionStorage.setItem('refreshToken', data.refresh_token);
@@ -2583,6 +2615,8 @@
2583
2615
  UpdateUserTask: async (body) => await request('/user-data/updateUserTask', 'PUT', body),
2584
2616
  SendCode: async (body) => await request('/sms/sendCode', 'POST', body),
2585
2617
  CheckCode: async (body) => await request('/sms/checkCode', 'POST', body).then(saveToken),
2618
+ CreateCaptcha: async (phoneNumber) => await request(`/sms/createCaptcha?phoneNumber=${phoneNumber}`, 'GET'),
2619
+ CheckCaptcha: async (body) => await request('/sms/checkCaptcha', 'POST', body),
2586
2620
  };
2587
2621
 
2588
2622
  const getUpdateUserProfileData = (profileId, formData) => {
@@ -2647,6 +2681,71 @@
2647
2681
  },
2648
2682
  });
2649
2683
 
2684
+ const ICON_SIZE$1 = { width: '103', height: '21' };
2685
+
2686
+ const logoTitleSizeStyle = 'text-s';
2687
+
2688
+ const ICON_VERSION_MAP = {
2689
+ 'bg-white': 'color',
2690
+ transparent: 'white',
2691
+ };
2692
+ const SVG_COLOR = {
2693
+ 'bg-white': 'text-primary-main',
2694
+ transparent: 'text-white',
2695
+ };
2696
+ const renderImage = (bgColor, image, size) => {
2697
+ const img = image?.src
2698
+ ? image
2699
+ : {
2700
+ icon: image?.icon || 'LogoIcon',
2701
+ iconVersion: ICON_VERSION_MAP[bgColor],
2702
+ };
2703
+ return (jsx(Img, { image: img, className: SVG_COLOR[bgColor], width: size?.width, height: size?.height }));
2704
+ };
2705
+
2706
+ const TEXT_COLOR = {
2707
+ 'bg-white': 'text-primary-text',
2708
+ transparent: 'text-white',
2709
+ };
2710
+ const Logo = JSX(({ className, href = '/', logo, children, targetBlank, bgColor = 'bg-white', showTitle = true, data, }) => (jsxs("a", { className: style('inline-flex items-center font-sans no-underline', className), href: logo?.href ?? href, target: targetBlank ? '_blank' : '_self', "aria-label": logo?.title ?? 'Россельхозбанк', ...getAspectsAttributes(data), children: [renderImage(bgColor, logo?.image, ICON_SIZE$1), showTitle
2711
+ ? children ?? (jsx("div", { className: "ml-s", children: jsx(Text, { font: "font-medium", color: TEXT_COLOR[bgColor], size: logoTitleSizeStyle, children: logo?.title ?? 'Россельхозбанк' }) }))
2712
+ : null] })));
2713
+
2714
+ const checkCaptcha = async ({ code, setHasError, close, sendCode = noop, }) => {
2715
+ const response = await RETAIL_API.CheckCaptcha({ captchaText: code });
2716
+ if ((await response.text()) === 'ERROR') {
2717
+ setHasError(true);
2718
+ }
2719
+ else {
2720
+ sendCode();
2721
+ close?.();
2722
+ }
2723
+ };
2724
+
2725
+ const createCaptcha = async (setCaptcha, phoneNumber) => {
2726
+ const response = await RETAIL_API.CreateCaptcha(phoneNumber);
2727
+ setCaptcha(URL.createObjectURL(await response.blob()));
2728
+ };
2729
+
2730
+ const CaptchaDialog = JSX(({ phoneNumber, close, sendCode, onClose }) => {
2731
+ const [captcha, setCaptcha] = useState('');
2732
+ const [code, setCode] = useState('');
2733
+ const [hasError, setHasError] = useState(false);
2734
+ useEffect(() => {
2735
+ createCaptcha(setCaptcha, phoneNumber);
2736
+ }, []);
2737
+ return (jsx(Dialog, { head: jsx(Logo, {}), onClose: onClose, className: "my-6xl max-w-lg w-full min-h-fit mx-auto rounded-lg", children: jsxs("div", { className: "flex flex-col gap-lg items-center rounded-md", children: [jsxs("div", { className: "flex h-[140px] w-[300px]", children: [jsx("img", { className: "grow", src: captcha }), jsx("div", { onClick: () => createCaptcha(setCaptcha, phoneNumber), className: "flex w-8 items-center justify-center cursor-pointer", children: jsx(Icon, { iconVersion: "normal", name: "RefreshIcon" }) })] }), jsx(Input, { className: "w-[300px]", onChange: setCode, value: code, placeholder: "\u0412\u0432\u0435\u0434\u0438\u0442\u0435 \u043A\u043E\u0434 \u0441 \u043A\u0430\u0440\u0442\u0438\u043D\u043A\u0438" }), hasError ? jsx("div", { className: "text-error", children: "\u041D\u0435\u0432\u0435\u0440\u043D\u044B\u0439 \u043A\u043E\u0434" }) : null, jsxs("div", { className: "flex w-[310px] justify-between", children: [jsx(Button, { onClick: close, version: "secondary", children: "\u0412\u0435\u0440\u043D\u0443\u0442\u044C\u0441\u044F" }), jsx(Button, { type: "submit", disabled: !code, onClick: () => checkCaptcha({ code, setHasError, close, sendCode }), version: "secondary", children: "\u041E\u0442\u043F\u0440\u0430\u0432\u0438\u0442\u044C" })] })] }) }));
2738
+ });
2739
+
2740
+ const useCaptchaDialog = (initialProps, onClose) => {
2741
+ const { open, close, closeAll } = useDialogManager();
2742
+ return {
2743
+ open: () => open(jsx(CaptchaDialog, { close: close, onClose: onClose, ...initialProps })),
2744
+ close,
2745
+ closeAll,
2746
+ };
2747
+ };
2748
+
2650
2749
  const Loader = JSX(({ color = 'text-primary-main', position = 'absolute', blur = true }) => (jsx("div", { className: style('flex justify-center items-center h-full w-full z-50', position, {
2651
2750
  'backdrop-blur': blur,
2652
2751
  }), children: jsx("div", { className: style('inline-block h-28 w-28', 'animate-spin rounded-full', 'border-8 border-solid border-current', 'border-r-transparent', color), role: "status" }) })));
@@ -2671,7 +2770,24 @@
2671
2770
  return `${minutes}:${seconds}`;
2672
2771
  };
2673
2772
 
2674
- const InputCode = JSX(({ values, setValues, hasError }) => {
2773
+ const handleSendCode = async ({ phoneNumber, captchaDialog, setTimeNextReq, setIsTimerStarted, setAttemps, }) => {
2774
+ try {
2775
+ await RETAIL_API.SendCode({
2776
+ phoneNumber: phoneNumber,
2777
+ smsCodesSetName: { key: 'AUTHENTICATION' },
2778
+ });
2779
+ setAttemps(0);
2780
+ setTimeNextReq(180);
2781
+ setIsTimerStarted(true);
2782
+ }
2783
+ catch (e) {
2784
+ if (e?.status === 429) {
2785
+ captchaDialog.open();
2786
+ }
2787
+ }
2788
+ };
2789
+
2790
+ const InputCode = JSX(({ values, setValues, hasError, errorText }) => {
2675
2791
  const [activeIndex, setActiveIndex] = useState(0);
2676
2792
  const inputRefs = useRef([]);
2677
2793
  useEffect(() => {
@@ -2708,7 +2824,7 @@
2708
2824
  inputRefs.current = [];
2709
2825
  }
2710
2826
  inputRefs.current[index] = ref;
2711
- }, onFocus: (event) => event.target.select(), onKeyDown: handleKeyDown(index), className: getInputStyle(index, values, hasError) }, index))) }), hasError ? jsx("div", { className: "text-error", children: "\u041D\u0435\u0432\u0435\u0440\u043D\u044B\u0439 \u043A\u043E\u0434" }) : null] }));
2827
+ }, onFocus: (event) => event.target.select(), onKeyDown: handleKeyDown(index), className: getInputStyle(index, values, hasError) }, index))) }), hasError ? jsx("div", { className: "text-error", children: errorText }) : null] }));
2712
2828
  });
2713
2829
  const getInputStyle = (index, values, hasError = false) => {
2714
2830
  const isInputEmpty = !values[index];
@@ -2719,42 +2835,85 @@
2719
2835
  return (jsx(Button, { type: "button", onClick: onClick, disabled: isDisabled, children: jsx(Text, { font: "font-medium", children: text }) }));
2720
2836
  });
2721
2837
 
2722
- const VerifyPhoneDialog = JSX(({ title, phone, description, __html, code = true, codeLength = 4, textButton = '', onClose, href = '', }) => {
2723
- const { close } = useDialogManager();
2724
- const [values, setValues] = useState(Array(codeLength).fill(''));
2838
+ const useVerifyPhoneDialogSubmit = ({ close, values }) => {
2725
2839
  const [hasError, setHasError] = useState(false);
2840
+ const [errorText, setErrorText] = useState('');
2726
2841
  const [isLoading, setIsLoading] = useState(false);
2727
- const [timeNextReq, setTimeNextReq] = useState(180);
2728
- const isValidCode = useMemo(() => values.every(Boolean), [values]);
2729
- useEffect(() => {
2730
- RETAIL_API.SendCode({
2731
- phoneNumber: phone,
2732
- smsCodesSetName: { key: 'AUTHENTICATION' },
2733
- });
2842
+ const [timeNextReq, setTimeNextReq] = useState(0);
2843
+ const [isTimerStarted, setIsTimerStarted] = useState(false);
2844
+ const [attemps, setAttemps] = useState(0);
2845
+ const resetError = useCallback(() => {
2846
+ setHasError(false);
2847
+ setErrorText('');
2734
2848
  }, []);
2849
+ const isTimeExpired = useMemo(() => timeNextReq === 0 && isTimerStarted, [timeNextReq, isTimerStarted]);
2850
+ const isSubmitButtonDisabled = useMemo(() => attemps > 2 || !values.every(Boolean) || isTimeExpired, [values]);
2735
2851
  const handleSubmit = useCallback(async () => {
2736
2852
  try {
2853
+ setIsTimerStarted(false);
2854
+ setTimeNextReq(0);
2855
+ setAttemps(attemps + 1);
2737
2856
  setIsLoading(true);
2738
2857
  await RETAIL_API.CheckCode({
2739
2858
  smsText: values.join(''),
2740
2859
  smsCodesSetName: { key: 'AUTHENTICATION' },
2741
2860
  });
2742
- globalThis.location.href = href;
2743
- close();
2744
- onClose && onClose();
2861
+ resetError();
2862
+ close && close();
2745
2863
  }
2746
2864
  catch {
2747
2865
  setIsLoading(false);
2866
+ attemps > 1 ? setErrorText('Исчерпан лимит ввода смс-кода') : setErrorText('Неверный код');
2748
2867
  setHasError(true);
2749
2868
  }
2750
- }, [values]);
2751
- return (jsx(Dialog, { className: "my-6xl max-w-3xl w-full min-h-fit mx-auto rounded-lg", children: jsxs("div", { className: "flex flex-col gap-lg items-center rounded-md", children: [jsx(Headline, { className: "w-full", title: title, description: description, headlineVersion: "S", isEmbedded: true }), code ? jsx(InputCode, { values: values, setValues: setValues, hasError: hasError }) : null, timeNextReq ? (jsxs("div", { className: "flex flex-row text-l font-light text-primary-main", children: ["\u041F\u043E\u043B\u0443\u0447\u0438\u0442\u044C \u043D\u043E\u0432\u044B\u0439 \u043A\u043E\u0434 \u043C\u043E\u0436\u043D\u043E \u0447\u0435\u0440\u0435\u0437", jsx(Timer, { className: "text-primary-main ml-1", time: timeNextReq, setTime: setTimeNextReq })] })) : (jsx(LinkButton, { className: "text-primary-main", children: "\u041F\u043E\u043B\u0443\u0447\u0438\u0442\u044C \u043D\u043E\u0432\u044B\u0439 \u043A\u043E\u0434" })), jsx(RichText, { itemSize: "list-s", __html: __html }), textButton ? (jsx(SubmitButton, { isDisabled: !isValidCode, onClick: handleSubmit, text: textButton })) : null, isLoading ? jsx(Loader, { blur: false }) : null] }) }));
2869
+ }, [values, attemps]);
2870
+ useEffect(() => {
2871
+ if (isTimeExpired) {
2872
+ setHasError(true);
2873
+ setErrorText('Код просрочен');
2874
+ }
2875
+ else {
2876
+ setHasError(false);
2877
+ }
2878
+ }, [isTimeExpired]);
2879
+ return {
2880
+ handleSubmit,
2881
+ hasError,
2882
+ errorText,
2883
+ isLoading,
2884
+ timeNextReq,
2885
+ isSubmitButtonDisabled,
2886
+ setTimeNextReq,
2887
+ setIsTimerStarted,
2888
+ setAttemps,
2889
+ };
2890
+ };
2891
+
2892
+ const VerifyPhoneDialog = JSX(({ close = noop, onClose = noop, title, description, __html, code = true, codeLength = 4, textButton = '', phoneNumber = '+79999999999', }) => {
2893
+ const [values, setValues] = useState(Array(codeLength).fill(''));
2894
+ const { handleSubmit, hasError, errorText, isLoading, timeNextReq, isSubmitButtonDisabled, setTimeNextReq, setIsTimerStarted, setAttemps, } = useVerifyPhoneDialogSubmit({ values, close });
2895
+ const sendCode = useCallback(() => {
2896
+ handleSendCode({
2897
+ phoneNumber,
2898
+ captchaDialog,
2899
+ setTimeNextReq,
2900
+ setIsTimerStarted,
2901
+ setAttemps,
2902
+ });
2903
+ }, []);
2904
+ const captchaDialog = useCaptchaDialog({ phoneNumber, sendCode }, onClose);
2905
+ useEffect(() => {
2906
+ sendCode();
2907
+ }, []);
2908
+ return (jsx(Dialog, { className: "my-6xl max-w-3xl w-full min-h-fit mx-auto rounded-lg", children: jsxs("div", { className: "flex flex-col gap-lg items-center rounded-md", children: [jsx(Headline, { className: "w-full", title: title, description: description, headlineVersion: "S", isEmbedded: true }), code ? (jsx(InputCode, { values: values, setValues: setValues, errorText: errorText, hasError: hasError })) : null, renderText$2(timeNextReq, setTimeNextReq, sendCode), jsx(RichText, { itemSize: "list-s", __html: __html }), renderTextButton(textButton, isSubmitButtonDisabled, handleSubmit), isLoading ? jsx(Loader, { blur: false }) : null] }) }));
2752
2909
  });
2910
+ const renderTextButton = (textButton, isDisabled, handleSubmit) => textButton ? (jsx(SubmitButton, { isDisabled: isDisabled, onClick: handleSubmit, text: textButton })) : null;
2911
+ const renderText$2 = (timeNextReq, setTimeNextReq, sendCode) => timeNextReq ? (jsxs("div", { className: "flex flex-row text-l font-light text-primary-main", children: ["\u041F\u043E\u043B\u0443\u0447\u0438\u0442\u044C \u043D\u043E\u0432\u044B\u0439 \u043A\u043E\u0434 \u043C\u043E\u0436\u043D\u043E \u0447\u0435\u0440\u0435\u0437", jsx(Timer, { className: "text-primary-main ml-1", time: timeNextReq, setTime: setTimeNextReq })] })) : (jsx(LinkButton, { onClick: sendCode, className: "text-primary-main", children: "\u041F\u043E\u043B\u0443\u0447\u0438\u0442\u044C \u043D\u043E\u0432\u044B\u0439 \u043A\u043E\u0434" }));
2753
2912
 
2754
2913
  const useVerifyPhoneDialog = (props) => {
2755
2914
  const { open, close } = useDialogManager();
2756
2915
  return {
2757
- open: (options = {}) => open(jsx(VerifyPhoneDialog, { ...props }), options),
2916
+ open: (options = {}) => open(jsx(VerifyPhoneDialog, { onClose: close, ...props }), options),
2758
2917
  close,
2759
2918
  };
2760
2919
  };
@@ -2781,7 +2940,7 @@
2781
2940
  programId,
2782
2941
  });
2783
2942
  await RETAIL_API.UpdateUserTask(getUpdateUserTaskData(participantId, taskId, profileId, formData));
2784
- setResponseStatus('OK');
2943
+ globalThis.location.href = '/credit-lead';
2785
2944
  }
2786
2945
  catch {
2787
2946
  setResponseStatus('Fail');
@@ -2789,7 +2948,7 @@
2789
2948
  };
2790
2949
  // eslint-disable-next-line react-hooks/rules-of-hooks
2791
2950
  const verifyPhoneDialog = useVerifyPhoneDialog({
2792
- onClose: handleSuccessVerify,
2951
+ close: handleSuccessVerify,
2793
2952
  ...verifyPhoneContent(formData?.phone),
2794
2953
  });
2795
2954
  verifyPhoneDialog.open();
@@ -2807,14 +2966,13 @@
2807
2966
  const verifyPhoneContent = (phone) => ({
2808
2967
  title: 'Подтвердите номер телефона',
2809
2968
  description: `Мы отправили код на ${phone}`,
2810
- phone: formatPhone(phone),
2969
+ phoneNumber: formatPhone(phone),
2811
2970
  textButton: 'Оформить',
2812
2971
  __html: `<span>Вводя код, я подтверждаю, что ознакомлен и подписываю:</span>
2813
2972
  <ul><li>соглашение о порядке использования простой электронной подписи,
2814
2973
  </li><li>согласие на обработку персональных данных,
2815
2974
  </li><li>предоставление и подписание прочих согласий Банка,
2816
2975
  </li><li>согласие на запрос в ПФР</li></ul>`,
2817
- href: '/credit-lead',
2818
2976
  });
2819
2977
 
2820
2978
  const useInitApplicationLead = () => {
@@ -4547,7 +4705,7 @@
4547
4705
  return null;
4548
4706
  };
4549
4707
 
4550
- const ICON_SIZE$1 = { width: '24', height: '24' };
4708
+ const ICON_SIZE = { width: '24', height: '24' };
4551
4709
  const PaginationContainer = ({ currentPage, onPageChange, totalPages, }) => {
4552
4710
  const pages = useMemo(() => Array.from({ length: totalPages }).fill({
4553
4711
  currentPage,
@@ -4566,7 +4724,7 @@
4566
4724
  }, [currentPage, totalPages]);
4567
4725
  const handleFirstPage = useCallback(() => onPageChange(1), []);
4568
4726
  const handleLastPage = useCallback(() => onPageChange(totalPages), [totalPages]);
4569
- return (jsxs("div", { className: "flex gap-m items-center", children: [jsx("div", { onClick: handlePrevPage, children: jsx(Icon, { name: "ArrowLeftIcon", iconVersion: "black", imageClassName: getIconStyle(currentPage === 1), ...ICON_SIZE$1 }) }), jsxs("div", { className: "flex @lg:gap-2xs", children: [currentPage > 1 ? (jsx("div", { onClick: handleFirstPage, className: paginationBlockStyle, "aria-label": "\u0421\u0442\u0440\u0430\u043D\u0438\u0446\u0430 1", children: "1" })) : null, currentPage > 3 ? jsx("div", { className: "py-m @lg:px-s", children: "..." }) : null, pages.map(renderPages), currentPage < totalPages - 2 ? jsx("div", { className: "py-m @lg:px-s", children: "..." }) : null, currentPage < totalPages ? (jsx("div", { onClick: handleLastPage, className: paginationBlockStyle, "aria-label": `Страница ${totalPages}`, children: totalPages })) : null] }), jsx("div", { onClick: handleNextPage, children: jsx(Icon, { className: "rotate-180", name: "ArrowLeftIcon", iconVersion: "black", imageClassName: getIconStyle(currentPage === totalPages), ...ICON_SIZE$1 }) })] }));
4727
+ return (jsxs("div", { className: "flex gap-m items-center", children: [jsx("div", { onClick: handlePrevPage, children: jsx(Icon, { name: "ArrowLeftIcon", iconVersion: "black", imageClassName: getIconStyle(currentPage === 1), ...ICON_SIZE }) }), jsxs("div", { className: "flex @lg:gap-2xs", children: [currentPage > 1 ? (jsx("div", { onClick: handleFirstPage, className: paginationBlockStyle, "aria-label": "\u0421\u0442\u0440\u0430\u043D\u0438\u0446\u0430 1", children: "1" })) : null, currentPage > 3 ? jsx("div", { className: "py-m @lg:px-s", children: "..." }) : null, pages.map(renderPages), currentPage < totalPages - 2 ? jsx("div", { className: "py-m @lg:px-s", children: "..." }) : null, currentPage < totalPages ? (jsx("div", { onClick: handleLastPage, className: paginationBlockStyle, "aria-label": `Страница ${totalPages}`, children: totalPages })) : null] }), jsx("div", { onClick: handleNextPage, children: jsx(Icon, { className: "rotate-180", name: "ArrowLeftIcon", iconVersion: "black", imageClassName: getIconStyle(currentPage === totalPages), ...ICON_SIZE }) })] }));
4570
4728
  };
4571
4729
  const getIconStyle = (condition) => condition ? 'opacity-20' : 'cursor-pointer hover:opacity-60';
4572
4730
 
@@ -4942,36 +5100,6 @@
4942
5100
  return (jsx(BlockWrapper, { className: className, defaultPadding: "p-6xl", ...rest, children: jsxs("div", { className: "container max-w-[978px] space-y-m", children: [title ? jsx(Heading, { headingType: "h3", title: title, className: "@xl:text-center" }) : null, regions ? (jsx(SelectControl, { label: "\u0412\u0430\u0448 \u0440\u0435\u0433\u0438\u043E\u043D", placeholder: "\u0412\u044B\u0431\u0435\u0440\u0438\u0442\u0435 \u0440\u0435\u0433\u0438\u043E\u043D", isSearch: true, options: regions.map(({ name = '' }) => ({ key: name, text: name })), value: region, onChange: setRegion })) : null, regionHref ? (jsx("div", { className: "text-center", children: jsx(LinkButton, { href: regionHref, target: "_blank", className: style('p-m w-full @xl:w-auto', buttonStyle), data: getAspectsWithInclude(data, region?.key), children: buttonText }) })) : null] }) }));
4943
5101
  });
4944
5102
 
4945
- const ICON_SIZE = { width: '103', height: '21' };
4946
-
4947
- const logoTitleSizeStyle = 'text-s';
4948
-
4949
- const ICON_VERSION_MAP = {
4950
- 'bg-white': 'color',
4951
- transparent: 'white',
4952
- };
4953
- const SVG_COLOR = {
4954
- 'bg-white': 'text-primary-main',
4955
- transparent: 'text-white',
4956
- };
4957
- const renderImage = (bgColor, image, size) => {
4958
- const img = image?.src
4959
- ? image
4960
- : {
4961
- icon: image?.icon || 'LogoIcon',
4962
- iconVersion: ICON_VERSION_MAP[bgColor],
4963
- };
4964
- return (jsx(Img, { image: img, className: SVG_COLOR[bgColor], width: size?.width, height: size?.height }));
4965
- };
4966
-
4967
- const TEXT_COLOR = {
4968
- 'bg-white': 'text-primary-text',
4969
- transparent: 'text-white',
4970
- };
4971
- const Logo = JSX(({ className, href = '/', logo, children, targetBlank, bgColor = 'bg-white', showTitle = true, data, }) => (jsxs("a", { className: style('inline-flex items-center font-sans no-underline', className), href: logo?.href ?? href, target: targetBlank ? '_blank' : '_self', "aria-label": logo?.title ?? 'Россельхозбанк', ...getAspectsAttributes(data), children: [renderImage(bgColor, logo?.image, ICON_SIZE), showTitle
4972
- ? children ?? (jsx("div", { className: "ml-s", children: jsx(Text, { font: "font-medium", color: TEXT_COLOR[bgColor], size: logoTitleSizeStyle, children: logo?.title ?? 'Россельхозбанк' }) }))
4973
- : null] })));
4974
-
4975
5103
  const BUTTON_STYLE = {
4976
5104
  default: 'bg-main-divider text-primary-main rounded hover:text-primary-main',
4977
5105
  transparent: 'backdrop-opacity-30 bg-white/30 hover:text-primary-hover text-white',
@@ -6930,7 +7058,7 @@
6930
7058
  slots: () => [HEADER_SLOT, FOOTER_SLOT, STICKY_FOOTER_SLOT],
6931
7059
  });
6932
7060
 
6933
- const packageVersion = "0.14.587";
7061
+ const packageVersion = "0.14.589";
6934
7062
 
6935
7063
  exports.Blocks = Blocks;
6936
7064
  exports.ContentPage = ContentPage;