@redneckz/wildless-cms-uni-blocks 0.14.1014 → 0.14.1015

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 (193) hide show
  1. package/bundle/api/LeadServiceAPI.d.ts +7 -0
  2. package/bundle/api/sendUserSurvey.d.ts +8 -0
  3. package/bundle/bundle.umd.js +135 -11
  4. package/bundle/bundle.umd.min.js +1 -1
  5. package/bundle/ui-kit/DialogManager/Dialog.d.ts +1 -1
  6. package/bundle/ui-kit/RadioButtonGroup/RadioButtonGroup.d.ts +1 -1
  7. package/bundle/ui-kit/UserSurveyDialog/FinalStep.d.ts +2 -0
  8. package/bundle/ui-kit/UserSurveyDialog/FirstStep.d.ts +2 -0
  9. package/bundle/ui-kit/UserSurveyDialog/SecondStep.d.ts +2 -0
  10. package/bundle/ui-kit/UserSurveyDialog/Star.d.ts +11 -0
  11. package/bundle/ui-kit/UserSurveyDialog/UserSurveyDialog.d.ts +3 -0
  12. package/bundle/ui-kit/UserSurveyDialog/UserSurveyDialogContent.d.ts +29 -0
  13. package/bundle/ui-kit/UserSurveyDialog/useUserSurveyDialog.d.ts +1 -0
  14. package/dist/api/LeadServiceAPI.d.ts +7 -0
  15. package/dist/api/LeadServiceAPI.js +6 -5
  16. package/dist/api/LeadServiceAPI.js.map +1 -1
  17. package/dist/api/sendUserSurvey.d.ts +8 -0
  18. package/dist/api/sendUserSurvey.js +15 -0
  19. package/dist/api/sendUserSurvey.js.map +1 -0
  20. package/dist/components/ContentPage/ContentPage.js +2 -0
  21. package/dist/components/ContentPage/ContentPage.js.map +1 -1
  22. package/dist/ui-kit/DialogManager/Dialog.d.ts +1 -1
  23. package/dist/ui-kit/DialogManager/Dialog.js +1 -0
  24. package/dist/ui-kit/DialogManager/Dialog.js.map +1 -1
  25. package/dist/ui-kit/RadioButtonGroup/RadioButtonGroup.d.ts +1 -1
  26. package/dist/ui-kit/RadioButtonGroup/RadioButtonGroup.js +1 -1
  27. package/dist/ui-kit/RadioButtonGroup/RadioButtonGroup.js.map +1 -1
  28. package/dist/ui-kit/UserSurveyDialog/FinalStep.d.ts +2 -0
  29. package/dist/ui-kit/UserSurveyDialog/FinalStep.js +10 -0
  30. package/dist/ui-kit/UserSurveyDialog/FinalStep.js.map +1 -0
  31. package/dist/ui-kit/UserSurveyDialog/FirstStep.d.ts +2 -0
  32. package/dist/ui-kit/UserSurveyDialog/FirstStep.js +24 -0
  33. package/dist/ui-kit/UserSurveyDialog/FirstStep.js.map +1 -0
  34. package/dist/ui-kit/UserSurveyDialog/SecondStep.d.ts +2 -0
  35. package/dist/ui-kit/UserSurveyDialog/SecondStep.js +23 -0
  36. package/dist/ui-kit/UserSurveyDialog/SecondStep.js.map +1 -0
  37. package/dist/ui-kit/UserSurveyDialog/Star.d.ts +11 -0
  38. package/dist/ui-kit/UserSurveyDialog/Star.js +9 -0
  39. package/dist/ui-kit/UserSurveyDialog/Star.js.map +1 -0
  40. package/dist/ui-kit/UserSurveyDialog/UserSurveyDialog.d.ts +3 -0
  41. package/dist/ui-kit/UserSurveyDialog/UserSurveyDialog.js +48 -0
  42. package/dist/ui-kit/UserSurveyDialog/UserSurveyDialog.js.map +1 -0
  43. package/dist/ui-kit/UserSurveyDialog/UserSurveyDialogContent.d.ts +29 -0
  44. package/dist/ui-kit/UserSurveyDialog/UserSurveyDialogContent.js +2 -0
  45. package/dist/ui-kit/UserSurveyDialog/UserSurveyDialogContent.js.map +1 -0
  46. package/dist/ui-kit/UserSurveyDialog/useUserSurveyDialog.d.ts +1 -0
  47. package/dist/ui-kit/UserSurveyDialog/useUserSurveyDialog.js +48 -0
  48. package/dist/ui-kit/UserSurveyDialog/useUserSurveyDialog.js.map +1 -0
  49. package/lib/api/LeadServiceAPI.d.ts +7 -0
  50. package/lib/api/LeadServiceAPI.js +1 -1
  51. package/lib/api/LeadServiceAPI.js.map +1 -1
  52. package/lib/api/sendUserSurvey.d.ts +8 -0
  53. package/lib/api/sendUserSurvey.js +12 -0
  54. package/lib/api/sendUserSurvey.js.map +1 -0
  55. package/lib/common.css +1 -1
  56. package/lib/components/ContentPage/ContentPage.js +2 -0
  57. package/lib/components/ContentPage/ContentPage.js.map +1 -1
  58. package/lib/ui-kit/DialogManager/Dialog.d.ts +1 -1
  59. package/lib/ui-kit/DialogManager/Dialog.js +1 -0
  60. package/lib/ui-kit/DialogManager/Dialog.js.map +1 -1
  61. package/lib/ui-kit/RadioButtonGroup/RadioButtonGroup.d.ts +1 -1
  62. package/lib/ui-kit/RadioButtonGroup/RadioButtonGroup.js +1 -1
  63. package/lib/ui-kit/RadioButtonGroup/RadioButtonGroup.js.map +1 -1
  64. package/lib/ui-kit/UserSurveyDialog/FinalStep.d.ts +2 -0
  65. package/lib/ui-kit/UserSurveyDialog/FinalStep.js +8 -0
  66. package/lib/ui-kit/UserSurveyDialog/FinalStep.js.map +1 -0
  67. package/lib/ui-kit/UserSurveyDialog/FirstStep.d.ts +2 -0
  68. package/lib/ui-kit/UserSurveyDialog/FirstStep.js +22 -0
  69. package/lib/ui-kit/UserSurveyDialog/FirstStep.js.map +1 -0
  70. package/lib/ui-kit/UserSurveyDialog/SecondStep.d.ts +2 -0
  71. package/lib/ui-kit/UserSurveyDialog/SecondStep.js +21 -0
  72. package/lib/ui-kit/UserSurveyDialog/SecondStep.js.map +1 -0
  73. package/lib/ui-kit/UserSurveyDialog/Star.d.ts +11 -0
  74. package/lib/ui-kit/UserSurveyDialog/Star.js +7 -0
  75. package/lib/ui-kit/UserSurveyDialog/Star.js.map +1 -0
  76. package/lib/ui-kit/UserSurveyDialog/UserSurveyDialog.d.ts +3 -0
  77. package/lib/ui-kit/UserSurveyDialog/UserSurveyDialog.js +46 -0
  78. package/lib/ui-kit/UserSurveyDialog/UserSurveyDialog.js.map +1 -0
  79. package/lib/ui-kit/UserSurveyDialog/UserSurveyDialogContent.d.ts +29 -0
  80. package/lib/ui-kit/UserSurveyDialog/UserSurveyDialogContent.js +2 -0
  81. package/lib/ui-kit/UserSurveyDialog/UserSurveyDialogContent.js.map +1 -0
  82. package/lib/ui-kit/UserSurveyDialog/useUserSurveyDialog.d.ts +1 -0
  83. package/lib/ui-kit/UserSurveyDialog/useUserSurveyDialog.js +45 -0
  84. package/lib/ui-kit/UserSurveyDialog/useUserSurveyDialog.js.map +1 -0
  85. package/mobile/bundle/api/LeadServiceAPI.d.ts +7 -0
  86. package/mobile/bundle/api/sendUserSurvey.d.ts +8 -0
  87. package/mobile/bundle/bundle.umd.js +135 -11
  88. package/mobile/bundle/bundle.umd.min.js +1 -1
  89. package/mobile/bundle/ui-kit/DialogManager/Dialog.d.ts +1 -1
  90. package/mobile/bundle/ui-kit/RadioButtonGroup/RadioButtonGroup.d.ts +1 -1
  91. package/mobile/bundle/ui-kit/UserSurveyDialog/FinalStep.d.ts +2 -0
  92. package/mobile/bundle/ui-kit/UserSurveyDialog/FirstStep.d.ts +2 -0
  93. package/mobile/bundle/ui-kit/UserSurveyDialog/SecondStep.d.ts +2 -0
  94. package/mobile/bundle/ui-kit/UserSurveyDialog/Star.d.ts +11 -0
  95. package/mobile/bundle/ui-kit/UserSurveyDialog/UserSurveyDialog.d.ts +3 -0
  96. package/mobile/bundle/ui-kit/UserSurveyDialog/UserSurveyDialogContent.d.ts +29 -0
  97. package/mobile/bundle/ui-kit/UserSurveyDialog/useUserSurveyDialog.d.ts +1 -0
  98. package/mobile/dist/api/LeadServiceAPI.d.ts +7 -0
  99. package/mobile/dist/api/LeadServiceAPI.js +6 -5
  100. package/mobile/dist/api/LeadServiceAPI.js.map +1 -1
  101. package/mobile/dist/api/sendUserSurvey.d.ts +8 -0
  102. package/mobile/dist/api/sendUserSurvey.js +15 -0
  103. package/mobile/dist/api/sendUserSurvey.js.map +1 -0
  104. package/mobile/dist/components/ContentPage/ContentPage.js +2 -0
  105. package/mobile/dist/components/ContentPage/ContentPage.js.map +1 -1
  106. package/mobile/dist/ui-kit/DialogManager/Dialog.d.ts +1 -1
  107. package/mobile/dist/ui-kit/DialogManager/Dialog.js +1 -0
  108. package/mobile/dist/ui-kit/DialogManager/Dialog.js.map +1 -1
  109. package/mobile/dist/ui-kit/RadioButtonGroup/RadioButtonGroup.d.ts +1 -1
  110. package/mobile/dist/ui-kit/RadioButtonGroup/RadioButtonGroup.js +1 -1
  111. package/mobile/dist/ui-kit/RadioButtonGroup/RadioButtonGroup.js.map +1 -1
  112. package/mobile/dist/ui-kit/UserSurveyDialog/FinalStep.d.ts +2 -0
  113. package/mobile/dist/ui-kit/UserSurveyDialog/FinalStep.js +10 -0
  114. package/mobile/dist/ui-kit/UserSurveyDialog/FinalStep.js.map +1 -0
  115. package/mobile/dist/ui-kit/UserSurveyDialog/FirstStep.d.ts +2 -0
  116. package/mobile/dist/ui-kit/UserSurveyDialog/FirstStep.js +24 -0
  117. package/mobile/dist/ui-kit/UserSurveyDialog/FirstStep.js.map +1 -0
  118. package/mobile/dist/ui-kit/UserSurveyDialog/SecondStep.d.ts +2 -0
  119. package/mobile/dist/ui-kit/UserSurveyDialog/SecondStep.js +23 -0
  120. package/mobile/dist/ui-kit/UserSurveyDialog/SecondStep.js.map +1 -0
  121. package/mobile/dist/ui-kit/UserSurveyDialog/Star.d.ts +11 -0
  122. package/mobile/dist/ui-kit/UserSurveyDialog/Star.js +9 -0
  123. package/mobile/dist/ui-kit/UserSurveyDialog/Star.js.map +1 -0
  124. package/mobile/dist/ui-kit/UserSurveyDialog/UserSurveyDialog.d.ts +3 -0
  125. package/mobile/dist/ui-kit/UserSurveyDialog/UserSurveyDialog.js +48 -0
  126. package/mobile/dist/ui-kit/UserSurveyDialog/UserSurveyDialog.js.map +1 -0
  127. package/mobile/dist/ui-kit/UserSurveyDialog/UserSurveyDialogContent.d.ts +29 -0
  128. package/mobile/dist/ui-kit/UserSurveyDialog/UserSurveyDialogContent.js +2 -0
  129. package/mobile/dist/ui-kit/UserSurveyDialog/UserSurveyDialogContent.js.map +1 -0
  130. package/mobile/dist/ui-kit/UserSurveyDialog/useUserSurveyDialog.d.ts +1 -0
  131. package/mobile/dist/ui-kit/UserSurveyDialog/useUserSurveyDialog.js +48 -0
  132. package/mobile/dist/ui-kit/UserSurveyDialog/useUserSurveyDialog.js.map +1 -0
  133. package/mobile/lib/api/LeadServiceAPI.d.ts +7 -0
  134. package/mobile/lib/api/LeadServiceAPI.js +1 -1
  135. package/mobile/lib/api/LeadServiceAPI.js.map +1 -1
  136. package/mobile/lib/api/sendUserSurvey.d.ts +8 -0
  137. package/mobile/lib/api/sendUserSurvey.js +12 -0
  138. package/mobile/lib/api/sendUserSurvey.js.map +1 -0
  139. package/mobile/lib/common.css +1 -1
  140. package/mobile/lib/components/ContentPage/ContentPage.js +2 -0
  141. package/mobile/lib/components/ContentPage/ContentPage.js.map +1 -1
  142. package/mobile/lib/ui-kit/DialogManager/Dialog.d.ts +1 -1
  143. package/mobile/lib/ui-kit/DialogManager/Dialog.js +1 -0
  144. package/mobile/lib/ui-kit/DialogManager/Dialog.js.map +1 -1
  145. package/mobile/lib/ui-kit/RadioButtonGroup/RadioButtonGroup.d.ts +1 -1
  146. package/mobile/lib/ui-kit/RadioButtonGroup/RadioButtonGroup.js +1 -1
  147. package/mobile/lib/ui-kit/RadioButtonGroup/RadioButtonGroup.js.map +1 -1
  148. package/mobile/lib/ui-kit/UserSurveyDialog/FinalStep.d.ts +2 -0
  149. package/mobile/lib/ui-kit/UserSurveyDialog/FinalStep.js +8 -0
  150. package/mobile/lib/ui-kit/UserSurveyDialog/FinalStep.js.map +1 -0
  151. package/mobile/lib/ui-kit/UserSurveyDialog/FirstStep.d.ts +2 -0
  152. package/mobile/lib/ui-kit/UserSurveyDialog/FirstStep.js +22 -0
  153. package/mobile/lib/ui-kit/UserSurveyDialog/FirstStep.js.map +1 -0
  154. package/mobile/lib/ui-kit/UserSurveyDialog/SecondStep.d.ts +2 -0
  155. package/mobile/lib/ui-kit/UserSurveyDialog/SecondStep.js +21 -0
  156. package/mobile/lib/ui-kit/UserSurveyDialog/SecondStep.js.map +1 -0
  157. package/mobile/lib/ui-kit/UserSurveyDialog/Star.d.ts +11 -0
  158. package/mobile/lib/ui-kit/UserSurveyDialog/Star.js +7 -0
  159. package/mobile/lib/ui-kit/UserSurveyDialog/Star.js.map +1 -0
  160. package/mobile/lib/ui-kit/UserSurveyDialog/UserSurveyDialog.d.ts +3 -0
  161. package/mobile/lib/ui-kit/UserSurveyDialog/UserSurveyDialog.js +46 -0
  162. package/mobile/lib/ui-kit/UserSurveyDialog/UserSurveyDialog.js.map +1 -0
  163. package/mobile/lib/ui-kit/UserSurveyDialog/UserSurveyDialogContent.d.ts +29 -0
  164. package/mobile/lib/ui-kit/UserSurveyDialog/UserSurveyDialogContent.js +2 -0
  165. package/mobile/lib/ui-kit/UserSurveyDialog/UserSurveyDialogContent.js.map +1 -0
  166. package/mobile/lib/ui-kit/UserSurveyDialog/useUserSurveyDialog.d.ts +1 -0
  167. package/mobile/lib/ui-kit/UserSurveyDialog/useUserSurveyDialog.js +45 -0
  168. package/mobile/lib/ui-kit/UserSurveyDialog/useUserSurveyDialog.js.map +1 -0
  169. package/mobile/src/api/LeadServiceAPI.ts +1 -1
  170. package/mobile/src/api/sendUserSurvey.ts +20 -0
  171. package/mobile/src/components/ContentPage/ContentPage.tsx +2 -0
  172. package/mobile/src/ui-kit/DialogManager/Dialog.tsx +2 -1
  173. package/mobile/src/ui-kit/RadioButtonGroup/RadioButtonGroup.tsx +2 -2
  174. package/mobile/src/ui-kit/UserSurveyDialog/FinalStep.tsx +14 -0
  175. package/mobile/src/ui-kit/UserSurveyDialog/FirstStep.tsx +50 -0
  176. package/mobile/src/ui-kit/UserSurveyDialog/SecondStep.tsx +57 -0
  177. package/mobile/src/ui-kit/UserSurveyDialog/Star.tsx +28 -0
  178. package/mobile/src/ui-kit/UserSurveyDialog/UserSurveyDialog.tsx +80 -0
  179. package/mobile/src/ui-kit/UserSurveyDialog/UserSurveyDialogContent.ts +31 -0
  180. package/mobile/src/ui-kit/UserSurveyDialog/useUserSurveyDialog.ts +56 -0
  181. package/package.json +1 -1
  182. package/src/api/LeadServiceAPI.ts +1 -1
  183. package/src/api/sendUserSurvey.ts +20 -0
  184. package/src/components/ContentPage/ContentPage.tsx +2 -0
  185. package/src/ui-kit/DialogManager/Dialog.tsx +2 -1
  186. package/src/ui-kit/RadioButtonGroup/RadioButtonGroup.tsx +2 -2
  187. package/src/ui-kit/UserSurveyDialog/FinalStep.tsx +14 -0
  188. package/src/ui-kit/UserSurveyDialog/FirstStep.tsx +50 -0
  189. package/src/ui-kit/UserSurveyDialog/SecondStep.tsx +57 -0
  190. package/src/ui-kit/UserSurveyDialog/Star.tsx +28 -0
  191. package/src/ui-kit/UserSurveyDialog/UserSurveyDialog.tsx +80 -0
  192. package/src/ui-kit/UserSurveyDialog/UserSurveyDialogContent.ts +31 -0
  193. package/src/ui-kit/UserSurveyDialog/useUserSurveyDialog.ts +56 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"UserSurveyDialogContent.js","sourceRoot":"","sources":["../../../src/ui-kit/UserSurveyDialog/UserSurveyDialogContent.ts"],"names":[],"mappings":""}
@@ -0,0 +1 @@
1
+ export declare const useUserSurveyDialog: () => void;
@@ -0,0 +1,45 @@
1
+ import { useEffect } from '@redneckz/uni-jsx/lib/hooks';
2
+ import { useLocalStore } from '@redneckz/uni-jsx/lib/Store/useLocalStore';
3
+ import { useSessionStore } from '@redneckz/uni-jsx/lib/Store/useSessionStore';
4
+ import { noop } from '../../utils/noop.js';
5
+ import { useDialog } from '../DialogManager/useDialog.js';
6
+ import { UserSurveyDialog } from './UserSurveyDialog.js';
7
+ const DELAY = 5 * 60 * 1000;
8
+ // Хук отвечает за показ пользователю опроса
9
+ export const useUserSurveyDialog = () => {
10
+ const userSurveyDialog = useDialog(UserSurveyDialog);
11
+ const userSurveyStore = useLocalStore();
12
+ const sessionStore = useSessionStore();
13
+ const elapsedTime = sessionStore.surveyTimerStart
14
+ ? Date.now() - Number.parseInt(sessionStore.surveyTimerStart)
15
+ : 0;
16
+ const openUserSurveyDialog = () => {
17
+ userSurveyStore.userSurvey = {
18
+ lastShownType: userSurveyStore.userSurvey?.lastShownType === 'NPS' ? 'CSI' : 'NPS',
19
+ nextDueAt: getTimeAfter30days(),
20
+ };
21
+ userSurveyDialog.open({
22
+ reasonsSource: {
23
+ $ref: '/wcms-resources/user-survey-reasons.json',
24
+ },
25
+ });
26
+ };
27
+ useEffect(() => {
28
+ // Опрос показывается только если ранее пользоваютелю не показывался опрос или с того момента прошел месяц
29
+ if (!userSurveyStore.userSurvey || userSurveyStore.userSurvey?.nextDueAt <= Date.now()) {
30
+ // начинаем отсчитывать время от первого захода на сайт
31
+ if (!sessionStore.surveyTimerStart) {
32
+ sessionStore.surveyTimerStart = Date.now().toString();
33
+ }
34
+ // Опрос показывается спустя 5 минут нахождения на сайте
35
+ const timeout = setTimeout(openUserSurveyDialog, DELAY - elapsedTime);
36
+ return () => {
37
+ clearTimeout(timeout);
38
+ };
39
+ }
40
+ return noop;
41
+ }, []);
42
+ };
43
+ // Отсчитываем месяц с текущей даты
44
+ const getTimeAfter30days = () => Date.now() + 30 * 24 * 60 * 60 * 1000;
45
+ //# sourceMappingURL=useUserSurveyDialog.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useUserSurveyDialog.js","sourceRoot":"","sources":["../../../src/ui-kit/UserSurveyDialog/useUserSurveyDialog.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,6BAA6B,CAAC;AACxD,OAAO,EAAE,aAAa,EAAE,MAAM,2CAA2C,CAAC;AAC1E,OAAO,EAAE,eAAe,EAAE,MAAM,6CAA6C,CAAC;AAC9E,OAAO,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AACxC,OAAO,EAAE,SAAS,EAAE,MAAM,4BAA4B,CAAC;AACvD,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAGtD,MAAM,KAAK,GAAG,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC;AAM5B,4CAA4C;AAC5C,MAAM,CAAC,MAAM,mBAAmB,GAAG,GAAG,EAAE;IACtC,MAAM,gBAAgB,GAAG,SAAS,CAAC,gBAAgB,CAAC,CAAC;IACrD,MAAM,eAAe,GAAG,aAAa,EAAwB,CAAC;IAC9D,MAAM,YAAY,GAAG,eAAe,EAAoB,CAAC;IACzD,MAAM,WAAW,GAAG,YAAY,CAAC,gBAAgB;QAC/C,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,MAAM,CAAC,QAAQ,CAAC,YAAY,CAAC,gBAAgB,CAAC;QAC7D,CAAC,CAAC,CAAC,CAAC;IAEN,MAAM,oBAAoB,GAAG,GAAG,EAAE;QAChC,eAAe,CAAC,UAAU,GAAG;YAC3B,aAAa,EAAE,eAAe,CAAC,UAAU,EAAE,aAAa,KAAK,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK;YAClF,SAAS,EAAE,kBAAkB,EAAE;SAChC,CAAC;QACF,gBAAgB,CAAC,IAAI,CAAC;YACpB,aAAa,EAAE;gBACb,IAAI,EAAE,0CAA0C;aACjD;SACF,CAAC,CAAC;IACL,CAAC,CAAC;IAEF,SAAS,CAAC,GAAG,EAAE;QACb,0GAA0G;QAC1G,IAAI,CAAC,eAAe,CAAC,UAAU,IAAI,eAAe,CAAC,UAAU,EAAE,SAAS,IAAI,IAAI,CAAC,GAAG,EAAE,EAAE;YACtF,uDAAuD;YACvD,IAAI,CAAC,YAAY,CAAC,gBAAgB,EAAE;gBAClC,YAAY,CAAC,gBAAgB,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE,CAAC;aACvD;YACD,wDAAwD;YACxD,MAAM,OAAO,GAAG,UAAU,CAAC,oBAAoB,EAAE,KAAK,GAAG,WAAW,CAAC,CAAC;YAEtE,OAAO,GAAG,EAAE;gBACV,YAAY,CAAC,OAAO,CAAC,CAAC;YACxB,CAAC,CAAC;SACH;QAED,OAAO,IAAI,CAAC;IACd,CAAC,EAAE,EAAE,CAAC,CAAC;AACT,CAAC,CAAC;AAEF,mCAAmC;AACnC,MAAM,kBAAkB,GAAG,GAAG,EAAE,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC"}
@@ -28,6 +28,11 @@ declare type CheckCodeResponse = {
28
28
  reqId?: string;
29
29
  status?: string;
30
30
  } | null;
31
+ declare type VerifiedLeadRequest = {
32
+ requestId: string;
33
+ confirmationCode: string;
34
+ leadRequest: LeadRequest;
35
+ };
31
36
  declare type PhoneOnly = {
32
37
  phone?: string;
33
38
  };
@@ -36,10 +41,12 @@ export declare type sendProps = {
36
41
  router: Router;
37
42
  endpoint?: EndpointType;
38
43
  };
44
+ declare type SubmitBody = PhoneOnly | LeadRequest | CheckCodeProps | VerifiedLeadRequest;
39
45
  export declare function LeadServiceAPI(): {
40
46
  send: ({ body, router, endpoint }: sendProps) => Promise<any>;
41
47
  sendCode: ({ phone }: PhoneOnly) => Promise<string | null>;
42
48
  checkCode: ({ reqId, code, body, router, endpoint, }: CheckCodeProps) => Promise<CheckCodeResponse>;
43
49
  sendPhoneCallRequest: (body: LeadRequest, endpoint?: EndpointType) => Promise<any>;
44
50
  };
51
+ export declare const LeadServiceFetch: (url: string, submitBody: SubmitBody) => Promise<Response>;
45
52
  export {};
@@ -0,0 +1,8 @@
1
+ export declare type UserSurveyRequest = {
2
+ rate: number;
3
+ reason?: string;
4
+ message?: string;
5
+ url: string;
6
+ type: string;
7
+ };
8
+ export declare const sendUserSurvey: (body: UserSurveyRequest) => Promise<Response | null>;
@@ -1353,6 +1353,7 @@
1353
1353
  const DIALOG_STYLE = {
1354
1354
  sm: 'max-w-sm top-1/3',
1355
1355
  lg: 'max-w-lg',
1356
+ xl: 'max-w-xl',
1356
1357
  '4xl': 'max-w-4xl',
1357
1358
  none: 'mt-0',
1358
1359
  };
@@ -3330,7 +3331,7 @@
3330
3331
  horizontal: '@lg:flex-row',
3331
3332
  vertical: '',
3332
3333
  };
3333
- const RadioButtonGroup = JSX(({ label, items, value, className, disabled = false, orientation = 'horizontal', onChange: onChangeCheckedItem, }) => (jsxs("div", { className: "grid gap-xs whitespace-nowrap", children: [label ? (jsx("div", { role: "radiogroup", "aria-label": label, children: jsx(Text, { color: "text-secondary-text", font: "font-light", children: label }) })) : null, jsx("div", { className: style('flex flex-col gap-s', orientationStyleMap[orientation], className), role: "radiogroup", "aria-label": "\u0413\u0440\u0443\u043F\u043F\u0430 \u043A\u043D\u043E\u043F\u043E\u043A", children: items?.map(({ id, text }) => (jsx(Checkbox, { isRadio: true, text: text, value: value === id, onChange: () => onChangeCheckedItem?.(id), disabled: disabled, name: id }, String(id)))) })] })));
3334
+ const RadioButtonGroup = JSX(({ label, items, value, className, disabled = false, orientation = 'horizontal', onChange: onChangeCheckedItem, }) => (jsxs("div", { className: "grid gap-xs whitespace-nowrap", children: [label ? (jsx("div", { role: "radiogroup", "aria-label": label, children: jsx(Text, { color: "text-secondary-text", font: "font-light", children: label }) })) : null, jsx("div", { className: style('flex flex-col gap-s', orientationStyleMap[orientation], className), role: "radiogroup", "aria-label": "\u0413\u0440\u0443\u043F\u043F\u0430 \u043A\u043D\u043E\u043F\u043E\u043A", children: items?.map(({ id, text }) => (jsx(Checkbox, { isRadio: true, text: text, value: value === id, onChange: () => onChangeCheckedItem?.(id, text), disabled: disabled, name: id }, String(id)))) })] })));
3334
3335
 
3335
3336
  const VedField = JSX(({ field, input }) => {
3336
3337
  const handleChange = useCallback((_) => {
@@ -11013,7 +11014,7 @@
11013
11014
  DELIVERY_CREDIT_CARD_CONTENT,
11014
11015
  ];
11015
11016
 
11016
- const STEPS$2 = 6;
11017
+ const STEPS$3 = 6;
11017
11018
  const TITLES = [
11018
11019
  'Параметры карты',
11019
11020
  'Персональные данные',
@@ -11028,7 +11029,7 @@
11028
11029
  const scrollToTop = useCallback(() => formContainerRef?.current?.scrollIntoView({ behavior: 'smooth' }), [formContainerRef]);
11029
11030
  useEffect(updateRefreshToken, []);
11030
11031
  const handleNextStep = useCallback(() => {
11031
- setStep((_) => Math.min(_ + 1, STEPS$2));
11032
+ setStep((_) => Math.min(_ + 1, STEPS$3));
11032
11033
  scrollToTop();
11033
11034
  }, []);
11034
11035
  const handlePrevStep = useCallback(() => {
@@ -11038,7 +11039,7 @@
11038
11039
  }, []);
11039
11040
  const sections = stepsSectionsMap$2[step];
11040
11041
  const [isFormFinished, { setTrue: handleFinish }] = useBool(false);
11041
- return (jsx(BlockWrapper, { className: className, ...rest, children: jsxs("div", { ref: formContainerRef, className: "container grid grid-cols-12", children: [isFormFinished ? null : (jsx(CreditCardFormProgress, { stepsTitles: TITLES, step: step, totalSteps: STEPS$2 })), jsx("div", { className: "py-lg px-5xl mt-2xs bg-white col-span-12", children: isFormFinished ? (jsx(CreditCardFormStatusTracker, {})) : (jsx(CreditCardFormStep, { step: step, sections: sections, onNextStep: handleNextStep, onPrevStep: handlePrevStep, onFinish: handleFinish }, String(step))) })] }) }));
11042
+ return (jsx(BlockWrapper, { className: className, ...rest, children: jsxs("div", { ref: formContainerRef, className: "container grid grid-cols-12", children: [isFormFinished ? null : (jsx(CreditCardFormProgress, { stepsTitles: TITLES, step: step, totalSteps: STEPS$3 })), jsx("div", { className: "py-lg px-5xl mt-2xs bg-white col-span-12", children: isFormFinished ? (jsx(CreditCardFormStatusTracker, {})) : (jsx(CreditCardFormStep, { step: step, sections: sections, onNextStep: handleNextStep, onPrevStep: handlePrevStep, onFinish: handleFinish }, String(step))) })] }) }));
11042
11043
  });
11043
11044
 
11044
11045
  const CreditFormProgress = JSX(({ step = 1, totalSteps = 5, stepsTitles = [] }) => {
@@ -11599,7 +11600,7 @@
11599
11600
  DELIVERY_CREDIT_CONTENT,
11600
11601
  ];
11601
11602
 
11602
- const STEPS$1 = 4;
11603
+ const STEPS$2 = 4;
11603
11604
  const STEP_TITLES$1 = [
11604
11605
  '',
11605
11606
  'Персональные данные',
@@ -11613,7 +11614,7 @@
11613
11614
  const scrollToTop = useCallback(() => formContainerRef?.current?.scrollIntoView({ behavior: 'smooth' }), [formContainerRef]);
11614
11615
  useEffect(updateRefreshToken, []);
11615
11616
  const handleNextStep = useCallback(() => {
11616
- setStep((_) => Math.min(_ + 1, STEPS$1));
11617
+ setStep((_) => Math.min(_ + 1, STEPS$2));
11617
11618
  scrollToTop();
11618
11619
  }, []);
11619
11620
  const handlePrevStep = useCallback(() => {
@@ -11624,7 +11625,7 @@
11624
11625
  const sections = stepsSectionsMap$1[step];
11625
11626
  const isStartStep = step === 0;
11626
11627
  const [isFormFinished, { setTrue: handleFinish }] = useBool(false);
11627
- return (jsx(BlockWrapper, { className: className, ...rest, children: jsxs("div", { ref: formContainerRef, className: "container grid grid-cols-12", children: [isStartStep || isFormFinished ? null : (jsx(CreditFormProgress, { stepsTitles: STEP_TITLES$1, step: step, totalSteps: STEPS$1 })), jsx("div", { className: "py-lg px-5xl mt-2xs bg-white col-span-12", children: isFormFinished ? (jsx(CreditFormStatusTracker, {})) : (jsx(CreditFormStep, { step: step, sections: sections, programsSource: programsSource, onNextStep: handleNextStep, onPrevStep: handlePrevStep, onFinish: handleFinish }, String(step))) })] }) }));
11628
+ return (jsx(BlockWrapper, { className: className, ...rest, children: jsxs("div", { ref: formContainerRef, className: "container grid grid-cols-12", children: [isStartStep || isFormFinished ? null : (jsx(CreditFormProgress, { stepsTitles: STEP_TITLES$1, step: step, totalSteps: STEPS$2 })), jsx("div", { className: "py-lg px-5xl mt-2xs bg-white col-span-12", children: isFormFinished ? (jsx(CreditFormStatusTracker, {})) : (jsx(CreditFormStep, { step: step, sections: sections, programsSource: programsSource, onNextStep: handleNextStep, onPrevStep: handlePrevStep, onFinish: handleFinish }, String(step))) })] }) }));
11628
11629
  });
11629
11630
 
11630
11631
  const DebitFormProgress = JSX(({ step = 1, totalSteps = 2, stepsTitles = [] }) => {
@@ -12167,7 +12168,7 @@
12167
12168
  DEBIT_CARD_CONTENT,
12168
12169
  ];
12169
12170
 
12170
- const STEPS = 2;
12171
+ const STEPS$1 = 2;
12171
12172
  const STEP_TITLES = ['', 'Персональные данные', 'Платежная система'];
12172
12173
  const DebitForm = UniBlock(({ className, ...rest }) => {
12173
12174
  const [step, setStep] = useState(0);
@@ -12175,7 +12176,7 @@
12175
12176
  const scrollToTop = useCallback(() => formContainerRef?.current?.scrollIntoView({ behavior: 'smooth' }), [formContainerRef]);
12176
12177
  useEffect(updateRefreshToken, []);
12177
12178
  const handleNextStep = useCallback(() => {
12178
- setStep((_) => Math.min(_ + 1, STEPS));
12179
+ setStep((_) => Math.min(_ + 1, STEPS$1));
12179
12180
  scrollToTop();
12180
12181
  }, []);
12181
12182
  const handlePrevStep = useCallback(() => {
@@ -12190,7 +12191,7 @@
12190
12191
  setIsFormFinished();
12191
12192
  scrollToTop();
12192
12193
  }, []);
12193
- return (jsx(BlockWrapper, { className: className, ...rest, children: jsxs("div", { ref: formContainerRef, className: "container grid grid-cols-12", children: [isStartStep || isFormFinished ? null : (jsx(DebitFormProgress, { stepsTitles: STEP_TITLES, step: step, totalSteps: STEPS })), jsx("div", { className: "py-lg px-5xl mt-2xs bg-white col-span-12", children: isFormFinished ? (jsx(DebitFormStatusTracker, {})) : (jsx(DebitFormStep, { step: step, sections: sections, onNextStep: handleNextStep, onPrevStep: handlePrevStep, onFinish: handleFinish }, String(step))) })] }) }));
12194
+ return (jsx(BlockWrapper, { className: className, ...rest, children: jsxs("div", { ref: formContainerRef, className: "container grid grid-cols-12", children: [isStartStep || isFormFinished ? null : (jsx(DebitFormProgress, { stepsTitles: STEP_TITLES, step: step, totalSteps: STEPS$1 })), jsx("div", { className: "py-lg px-5xl mt-2xs bg-white col-span-12", children: isFormFinished ? (jsx(DebitFormStatusTracker, {})) : (jsx(DebitFormStep, { step: step, sections: sections, onNextStep: handleNextStep, onPrevStep: handlePrevStep, onFinish: handleFinish }, String(step))) })] }) }));
12194
12195
  });
12195
12196
 
12196
12197
  const isRateRow = (rateRow) => typeof rateRow?.minMonths === 'number' && typeof rateRow?.maxMonths === 'number';
@@ -13913,6 +13914,128 @@
13913
13914
  }, role: "dialog", title: "\u0412\u0441\u043F\u043B\u044B\u0432\u0430\u044E\u0449\u0435\u0435 \u043E\u043A\u043D\u043E", children: popup.popup })) : null;
13914
13915
  });
13915
13916
 
13917
+ const sendUserSurvey = async (body) => {
13918
+ try {
13919
+ const response = await LeadServiceFetch(`${API_BASE_URI}/survey`, body);
13920
+ return await response;
13921
+ }
13922
+ catch (e) {
13923
+ return null;
13924
+ }
13925
+ };
13926
+
13927
+ const FinalStep = JSX(() => {
13928
+ return (jsxs("div", { className: "flex flex-col items-center", children: [jsx(Heading, { className: "text-center", headingType: "h5", title: "\u0421\u043F\u0430\u0441\u0438\u0431\u043E \u0437\u0430 \u0443\u0447\u0430\u0441\u0442\u0438\u0435!" }), jsx(Paragraph, { children: "\u0412\u0430\u0448\u0435 \u043C\u043D\u0435\u043D\u0438\u0435 \u043E\u0447\u0435\u043D\u044C \u0432\u0430\u0436\u043D\u043E \u0434\u043B\u044F \u043D\u0430\u0441" })] }));
13929
+ });
13930
+
13931
+ const Star = JSX(({ value, hover, rating, setHover, setRating }) => {
13932
+ const fillColor = value <= (hover || rating) ? '#42AB44' : '#C9CACC';
13933
+ return (jsx("div", { onClick: () => setRating?.(value), onMouseEnter: () => setHover?.(value), onMouseLeave: () => setHover?.(null), children: jsx("svg", { "data-rating": value, fill: fillColor, width: "57", height: "57", viewBox: "0 0 57 57", children: jsx("path", { d: "M47.7803 18.2879L47.7836 18.2884C50.566 18.7521 53.0867 20.1374 53.9176 22.7226C54.7498 25.3116 53.5025 27.9027 51.4977 29.8954L51.4942 29.8989L45.7132 35.6799C45.5729 35.8202 45.3591 36.1532 45.2186 36.6438C45.0796 37.1295 45.0808 37.5314 45.1257 37.7381L45.1268 37.743L46.78 44.8909C47.4787 47.9228 47.3175 51.2217 44.8924 52.9896C42.4714 54.7546 39.2808 53.9093 36.5999 52.3257L29.6214 48.1946C29.4392 48.0866 29.0426 47.96 28.5087 47.96C27.9816 47.96 27.5736 48.0831 27.3687 48.2004L27.3634 48.2035L20.4041 52.3232L20.4019 52.3246C17.7218 53.9145 14.5351 54.7459 12.1155 52.9803C9.69339 51.213 9.51826 47.9236 10.22 44.8909L11.8731 37.743L11.8743 37.7379C11.9191 37.5311 11.9203 37.1293 11.7813 36.6438C11.6409 36.1532 11.4271 35.8202 11.2867 35.6799L5.50006 29.8932C3.50738 27.9006 2.26429 25.3118 3.08972 22.7269C3.91586 20.1398 6.43161 18.7525 9.21638 18.2884L16.6527 17.0529L16.6552 17.0525C16.8169 17.0243 17.1619 16.8935 17.5523 16.604C17.945 16.3128 18.1668 16.022 18.2378 15.877L18.2462 15.8598L22.3508 7.65087L22.352 7.6485C23.629 5.08222 25.7146 3.01416 28.4796 3.01416C31.2412 3.01416 33.3328 5.07832 34.6215 7.64213L34.6236 7.64649L38.7303 15.8598L38.75 15.9001C38.7884 15.9807 38.8225 16.0591 38.8511 16.1283C38.9197 16.1891 39.0148 16.2702 39.1464 16.3781C39.1829 16.394 39.242 16.4185 39.3288 16.4505C39.5779 16.5424 39.9286 16.6512 40.3732 16.7719C41.2573 17.0121 42.3688 17.2611 43.4823 17.4894C44.5886 17.7163 45.6648 17.9163 46.4667 18.0598C46.8669 18.1315 47.1972 18.1888 47.4266 18.2281L47.6909 18.2729L47.7589 18.2843L47.7803 18.2879Z" }) }) }));
13934
+ });
13935
+
13936
+ const stars$1 = new Array(5).fill(Star);
13937
+ const TITLE$1 = {
13938
+ NPS: 'Оцените, пожалуйста, от 1 до 5 насколько вероятно, что вы порекомендуете Россельхозбанк коллегам, друзьям и знакомым?',
13939
+ CSI: 'Оцените, пожалуйста, удовлетворённость пользования сайтом',
13940
+ };
13941
+ const FirstStep = JSX(({ currentRating, surveyType, isSending, setCurrentRating, onNextStep, onSubmit }) => {
13942
+ const [currentHover, setCurrentHover] = useState();
13943
+ const setRatingFn = (value) => {
13944
+ setCurrentRating(value);
13945
+ if (value < 5) {
13946
+ onNextStep();
13947
+ }
13948
+ };
13949
+ return (jsxs("div", { className: "flex flex-col gap-xl items-center", children: [jsx(Heading, { className: "text-center", headingType: "h5", title: TITLE$1[surveyType] }), jsx("div", { className: "flex justify-center", children: stars$1.map((StarItem, index) => (jsx(StarItem, { value: index + 1, rating: currentRating, hover: currentHover, setRating: setRatingFn, setHover: setCurrentHover, className: "modal-feedback__star" }, index))) }), currentRating === 5 ? (jsx(SubmitButton$1, { onClick: () => onSubmit(), isLoading: isSending, children: "\u041E\u0442\u043F\u0440\u0430\u0432\u0438\u0442\u044C" })) : null] }));
13950
+ });
13951
+
13952
+ const stars = new Array(5).fill(Star);
13953
+ const TITLE = 'Что бы мы могли улучшить?';
13954
+ const SecondStep = JSX(({ currentRating, currentReason, reasons = [], isSending, setCurrentReason, onSubmit }) => {
13955
+ const [comment, setComment] = useState();
13956
+ const handleReasonChange = (id, text) => {
13957
+ setCurrentReason?.({
13958
+ id,
13959
+ text,
13960
+ });
13961
+ };
13962
+ return (jsxs("div", { className: "flex flex-col gap-xl items-center", children: [jsx(Heading, { className: "text-center", headingType: "h5", title: TITLE }), jsx("div", { className: "flex justify-center", children: stars.map((StarItem, index) => (jsx(StarItem, { value: index + 1, rating: currentRating }, index))) }), jsx(RadioButtonGroup, { className: "w-full text-wrap", orientation: "vertical", items: reasons, value: currentReason?.id, onChange: handleReasonChange }), currentReason?.text === 'Другое' ? (jsx(Input, { className: "w-full", placeholder: "\u041D\u0430\u043F\u0438\u0448\u0438\u0442\u0435, \u043F\u043E\u0436\u0430\u043B\u0443\u0439\u0441\u0442\u0430, \u0441\u0432\u043E\u0439 \u0432\u0430\u0440\u0438\u0430\u043D\u0442 \u043E\u0442\u0432\u0435\u0442\u0430", isTextarea: true, value: comment, onChange: setComment, maxLength: 255 })) : null, currentReason ? (jsx(SubmitButton$1, { onClick: () => onSubmit(comment), isLoading: isSending, children: "\u041E\u0442\u043F\u0440\u0430\u0432\u0438\u0442\u044C" })) : null] }));
13963
+ });
13964
+
13965
+ const STEPS = [FirstStep, SecondStep, FinalStep];
13966
+ const LAST_STEP_INDEX = 2;
13967
+ const UserSurveyDialog = UniBlock(({ onClose = noop, reasonsSource = {} }) => {
13968
+ const [isSending, { setTrue: startSending, setFalse: endSending }] = useBool(false);
13969
+ const [currentRating, setCurrentRating] = useState(0);
13970
+ const [currentReason, setCurrentReason] = useState();
13971
+ const [step, setStep] = useState(0);
13972
+ const userSurveyStore = useLocalStore();
13973
+ const surveyType = userSurveyStore.userSurvey?.lastShownType ?? 'NPS';
13974
+ const { reasons } = reasonsSource;
13975
+ const ActiveStep = STEPS[step];
13976
+ const handleNextStep = useCallback(() => {
13977
+ setStep((_) => _ + 1);
13978
+ }, []);
13979
+ const handleSubmit = useCallback(async (message) => {
13980
+ startSending();
13981
+ await sendUserSurvey({
13982
+ rate: currentRating,
13983
+ reason: currentReason?.text,
13984
+ message: getMessage(currentReason, message),
13985
+ url: globalThis.location.href,
13986
+ type: surveyType,
13987
+ });
13988
+ endSending();
13989
+ setStep(LAST_STEP_INDEX);
13990
+ }, [currentRating, currentReason]);
13991
+ return (jsx(Dialog, { maxWidth: "xl", onClose: onClose, children: jsx(ActiveStep, { currentRating: currentRating, currentReason: currentReason, reasons: reasons, surveyType: surveyType, isSending: isSending, setCurrentReason: setCurrentReason, setCurrentRating: setCurrentRating, onSubmit: handleSubmit, onNextStep: handleNextStep }) }));
13992
+ });
13993
+ const getMessage = (currentReason, message) => {
13994
+ if (currentReason?.text !== 'Другое') {
13995
+ return undefined;
13996
+ }
13997
+ return message?.length ? message : 'Другое. Клиент не оставил комментариев';
13998
+ };
13999
+
14000
+ const DELAY = 5 * 60 * 1000;
14001
+ // Хук отвечает за показ пользователю опроса
14002
+ const useUserSurveyDialog = () => {
14003
+ const userSurveyDialog = useDialog(UserSurveyDialog);
14004
+ const userSurveyStore = useLocalStore();
14005
+ const sessionStore = useSessionStore();
14006
+ const elapsedTime = sessionStore.surveyTimerStart
14007
+ ? Date.now() - Number.parseInt(sessionStore.surveyTimerStart)
14008
+ : 0;
14009
+ const openUserSurveyDialog = () => {
14010
+ userSurveyStore.userSurvey = {
14011
+ lastShownType: userSurveyStore.userSurvey?.lastShownType === 'NPS' ? 'CSI' : 'NPS',
14012
+ nextDueAt: getTimeAfter30days(),
14013
+ };
14014
+ userSurveyDialog.open({
14015
+ reasonsSource: {
14016
+ $ref: '/wcms-resources/user-survey-reasons.json',
14017
+ },
14018
+ });
14019
+ };
14020
+ useEffect(() => {
14021
+ // Опрос показывается только если ранее пользоваютелю не показывался опрос или с того момента прошел месяц
14022
+ if (!userSurveyStore.userSurvey || userSurveyStore.userSurvey?.nextDueAt <= Date.now()) {
14023
+ // начинаем отсчитывать время от первого захода на сайт
14024
+ if (!sessionStore.surveyTimerStart) {
14025
+ sessionStore.surveyTimerStart = Date.now().toString();
14026
+ }
14027
+ // Опрос показывается спустя 5 минут нахождения на сайте
14028
+ const timeout = setTimeout(openUserSurveyDialog, DELAY - elapsedTime);
14029
+ return () => {
14030
+ clearTimeout(timeout);
14031
+ };
14032
+ }
14033
+ return noop;
14034
+ }, []);
14035
+ };
14036
+ // Отсчитываем месяц с текущей даты
14037
+ const getTimeAfter30days = () => Date.now() + 30 * 24 * 60 * 60 * 1000;
14038
+
13916
14039
  const HEADER_SLOT = 'header';
13917
14040
  const FOOTER_SLOT = 'footer';
13918
14041
  const STICKY_FOOTER_SLOT = 'sticky-footer';
@@ -13923,6 +14046,7 @@
13923
14046
  const isFrame = isIFrame();
13924
14047
  useClickHandler();
13925
14048
  useDefaultLocation();
14049
+ useUserSurveyDialog();
13926
14050
  const options = {
13927
14051
  key: '',
13928
14052
  page: { slots, blocks, fallback, ...resolvedPageContent },
@@ -13945,7 +14069,7 @@
13945
14069
  slots: () => [HEADER_SLOT, FOOTER_SLOT, STICKY_FOOTER_SLOT],
13946
14070
  });
13947
14071
 
13948
- const packageVersion = "0.14.1013";
14072
+ const packageVersion = "0.14.1014";
13949
14073
 
13950
14074
  exports.Blocks = Blocks;
13951
14075
  exports.ContentPage = ContentPage;