@bikdotai/bik-widgets 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (206) hide show
  1. package/.eslintrc +22 -0
  2. package/.eslintrc.js +19 -0
  3. package/.github/workflows/main.yml +293 -0
  4. package/.prettierignore +13 -0
  5. package/.prettierrc +10 -0
  6. package/README.md +128 -0
  7. package/cypress/apiHelper/endpoints.ts +21 -0
  8. package/cypress/apiHelper/executor.ts +42 -0
  9. package/cypress/e2e/bottomDrawer.cy.ts +49 -0
  10. package/cypress/e2e/directReward.cy.ts +67 -0
  11. package/cypress/e2e/scratchTheCard.cy.ts +68 -0
  12. package/cypress/e2e/stw.cy.ts +82 -0
  13. package/cypress/e2e/waRedirection.cy.ts +46 -0
  14. package/cypress/fixtures/payloads.ts +330 -0
  15. package/cypress/support/commands.ts +37 -0
  16. package/cypress/support/e2e.ts +20 -0
  17. package/cypress.staging.config.ts +23 -0
  18. package/jsconfig.json +6 -0
  19. package/localtest.sh +10 -0
  20. package/log-server.js +86 -0
  21. package/package.json +79 -0
  22. package/postcss.config.js +8 -0
  23. package/src/Globals.d.ts +2 -0
  24. package/src/assets/lottie/santa.json +11722 -0
  25. package/src/assets/svg/CalendarClockIcon.tsx +30 -0
  26. package/src/assets/svg/CalendarIcon.tsx +24 -0
  27. package/src/assets/svg/CheckIcon.tsx +17 -0
  28. package/src/assets/svg/ChevronIcon.tsx +21 -0
  29. package/src/assets/svg/Close.tsx +39 -0
  30. package/src/assets/svg/Confetti.tsx +140 -0
  31. package/src/assets/svg/Copy.tsx +26 -0
  32. package/src/assets/svg/DropdownCheckIcon.tsx +35 -0
  33. package/src/assets/svg/ErrorIcon.tsx +27 -0
  34. package/src/assets/svg/RadioIcon.tsx +25 -0
  35. package/src/assets/svg/UncheckedCheckboxIcon.tsx +28 -0
  36. package/src/assets/svg/UncheckedRadioIcon.tsx +26 -0
  37. package/src/assets/svg/info.tsx +30 -0
  38. package/src/assets/svg/qrcode.svg +14 -0
  39. package/src/bootstrap.tsx +8 -0
  40. package/src/components/CtaCard/index.tsx +37 -0
  41. package/src/components/CtaCard/preview.module.css +32 -0
  42. package/src/components/CtaCard/style.module.css +32 -0
  43. package/src/components/EmailInput/emailInputBox.tsx +95 -0
  44. package/src/components/Fab/index.tsx +224 -0
  45. package/src/components/Fab/preview.module.css +28 -0
  46. package/src/components/Fab/style.module.css +37 -0
  47. package/src/components/Icons/Call.tsx +26 -0
  48. package/src/components/Icons/Cross.tsx +24 -0
  49. package/src/components/Icons/Gmail.tsx +61 -0
  50. package/src/components/Icons/Instagram.tsx +60 -0
  51. package/src/components/Icons/LiveChat.tsx +43 -0
  52. package/src/components/Icons/Messenger.tsx +57 -0
  53. package/src/components/Icons/Send.tsx +22 -0
  54. package/src/components/Icons/Whatsapp.tsx +24 -0
  55. package/src/components/Shimmer/index.tsx +12 -0
  56. package/src/components/Shimmer/style.module.css +37 -0
  57. package/src/components/SmsInput/smsInputBox.tsx +135 -0
  58. package/src/components/UserDetailsV2/userDetailsV2.desktop.module.css +52 -0
  59. package/src/components/UserDetailsV2/userDetailsV2.mobile.module.css +52 -0
  60. package/src/components/UserDetailsV2/userDetailsV2.module.css +81 -0
  61. package/src/components/UserDetailsV2/userDetailsV2.tsx +527 -0
  62. package/src/components/WhatsappInput/Spinner.tsx +26 -0
  63. package/src/components/WhatsappInput/whatsappInput.module.css +106 -0
  64. package/src/components/WhatsappInput/whatsappInputBox.tsx +155 -0
  65. package/src/components/WhatsappInput/whatsappInputPreviewDesktop.module.css +71 -0
  66. package/src/components/WhatsappInput/whatsappInputPreviewMobile.module.css +65 -0
  67. package/src/components/checkbox/checkbox.module.css +19 -0
  68. package/src/components/checkbox/checkbox.tsx +88 -0
  69. package/src/components/countryCodePicker/countriesDropdown.module.css +77 -0
  70. package/src/components/countryCodePicker/countriesDropdown.tsx +81 -0
  71. package/src/components/couponDetails/coupon.module.css +208 -0
  72. package/src/components/couponDetails/coupon.tsx +210 -0
  73. package/src/components/couponDetails/couponPreviewDesktop.module.css +158 -0
  74. package/src/components/couponDetails/couponPreviewMobile.module.css +164 -0
  75. package/src/components/index.ts +3 -0
  76. package/src/components/inputComponents/Checkbox.module.css +197 -0
  77. package/src/components/inputComponents/Checkbox.tsx +85 -0
  78. package/src/components/inputComponents/DatePicker.module.css +565 -0
  79. package/src/components/inputComponents/DatePicker.tsx +278 -0
  80. package/src/components/inputComponents/Dropdown.module.css +796 -0
  81. package/src/components/inputComponents/Dropdown.tsx +630 -0
  82. package/src/components/inputComponents/InputBox.module.css +401 -0
  83. package/src/components/inputComponents/InputBox.tsx +209 -0
  84. package/src/components/selectedCountry/selectedCountry.module.css +76 -0
  85. package/src/components/selectedCountry/selectedCountry.tsx +76 -0
  86. package/src/components/selectedCountry/selectedCountryPreviewDesktop.module.css +56 -0
  87. package/src/components/selectedCountry/selectedCountryPreviewMobile.module.css +57 -0
  88. package/src/components/userDetailsForm/RenderCustomFields.tsx +333 -0
  89. package/src/components/userDetailsForm/userDetailsForm.tsx +675 -0
  90. package/src/hooks/index.ts +4 -0
  91. package/src/hooks/useExitIntent.ts +452 -0
  92. package/src/hooks/useIsMobile.tsx +21 -0
  93. package/src/hooks/useMessageEvent.ts +8 -0
  94. package/src/hooks/useTriggeredIntentDetails.ts +43 -0
  95. package/src/hooks/useUrlListerner.ts +30 -0
  96. package/src/hooks/useWebSocketLogger.ts +59 -0
  97. package/src/hooks/useWindowEvent.ts +8 -0
  98. package/src/icons/copyIcon.tsx +26 -0
  99. package/src/icons/crossIconDesktop.tsx +20 -0
  100. package/src/icons/crossIconMobile.tsx +20 -0
  101. package/src/index.html +30 -0
  102. package/src/index.ts +32 -0
  103. package/src/index.tsx +1 -0
  104. package/src/repo/widgetRepo.ts +21 -0
  105. package/src/types/customFields.ts +73 -0
  106. package/src/utilities/cookie.ts +70 -0
  107. package/src/utilities/customFieldTypeMapping.ts +67 -0
  108. package/src/utilities/customFieldValidation.ts +201 -0
  109. package/src/utilities/encryption.ts +21 -0
  110. package/src/utilities/exitIntentUtils.ts +31 -0
  111. package/src/utilities/global.css +11 -0
  112. package/src/utilities/languageUtilities.ts +235 -0
  113. package/src/utilities/localRunner.js +26 -0
  114. package/src/utilities/localRunner.ts +27 -0
  115. package/src/utilities/localStorage.ts +40 -0
  116. package/src/utilities/script.tsx +15 -0
  117. package/src/utilities/stringUtils.ts +5 -0
  118. package/src/utilities/styleUtils.ts +134 -0
  119. package/src/utilities/variables.ts +11 -0
  120. package/src/utilities/widgetUtils.js +342 -0
  121. package/src/utilities/widgetUtils.ts +313 -0
  122. package/src/widgets/BottomDrawer/config.ts +41 -0
  123. package/src/widgets/BottomDrawer/index.tsx +116 -0
  124. package/src/widgets/BottomDrawer/modal.tsx +286 -0
  125. package/src/widgets/BottomDrawer/preview.module.css +122 -0
  126. package/src/widgets/BottomDrawer/previewMobile.module.css +124 -0
  127. package/src/widgets/BottomDrawer/style.module.css +279 -0
  128. package/src/widgets/CaptivateBanner/captivateBanner.tsx +200 -0
  129. package/src/widgets/CaptivateBanner/config.ts +72 -0
  130. package/src/widgets/CaptivateBanner/index.tsx +204 -0
  131. package/src/widgets/CaptivateBanner/previewDesktop.module.css +51 -0
  132. package/src/widgets/CaptivateBanner/previewMobile.module.css +51 -0
  133. package/src/widgets/CaptivateBanner/style.module.css +77 -0
  134. package/src/widgets/CaptivateBanner/utils.ts +104 -0
  135. package/src/widgets/CentrallyAlignedPopup/config.ts +42 -0
  136. package/src/widgets/CentrallyAlignedPopup/index.tsx +109 -0
  137. package/src/widgets/CentrallyAlignedPopup/modal.tsx +269 -0
  138. package/src/widgets/CentrallyAlignedPopup/preview.module.css +153 -0
  139. package/src/widgets/CentrallyAlignedPopup/previewMobile.module.css +153 -0
  140. package/src/widgets/CentrallyAlignedPopup/style.module.css +283 -0
  141. package/src/widgets/DirectReward/components/couponDetails.tsx +265 -0
  142. package/src/widgets/DirectReward/components/userDetails.tsx +117 -0
  143. package/src/widgets/DirectReward/config.ts +186 -0
  144. package/src/widgets/DirectReward/directReward.tsx +350 -0
  145. package/src/widgets/DirectReward/index.tsx +579 -0
  146. package/src/widgets/DirectReward/previewStyles/thankYouPreviewDesktop.module.css +276 -0
  147. package/src/widgets/DirectReward/previewStyles/thankYouPreviewMobile.module.css +303 -0
  148. package/src/widgets/DirectReward/previewStyles/userDetailsPreviewDesktop.module.css +511 -0
  149. package/src/widgets/DirectReward/previewStyles/userDetailsPreviewMobile.module.css +462 -0
  150. package/src/widgets/DirectReward/style.module.css +836 -0
  151. package/src/widgets/ExitIntentHook.tsx +28 -0
  152. package/src/widgets/STW/api.ts +70 -0
  153. package/src/widgets/STW/components/svgFactory.tsx +44 -0
  154. package/src/widgets/STW/config.ts +193 -0
  155. package/src/widgets/STW/context.ts +7 -0
  156. package/src/widgets/STW/couponDetails.tsx +121 -0
  157. package/src/widgets/STW/index.tsx +733 -0
  158. package/src/widgets/STW/previewStyles/thankyouPreviewDesktop.module.css +215 -0
  159. package/src/widgets/STW/previewStyles/thankyouPreviewMobile.module.css +205 -0
  160. package/src/widgets/STW/previewStyles/userInputsPreviewDesktop.module.css +732 -0
  161. package/src/widgets/STW/previewStyles/userInputsPreviewMobile.module.css +661 -0
  162. package/src/widgets/STW/previewStyles/wheelPreviewDesktop.module.css +498 -0
  163. package/src/widgets/STW/previewStyles/wheelPreviewMobile.module.css +497 -0
  164. package/src/widgets/STW/stw1.tsx +119 -0
  165. package/src/widgets/STW/stw2Components/wheelDesign.tsx +183 -0
  166. package/src/widgets/STW/stw2Pages/couponDetails.tsx +72 -0
  167. package/src/widgets/STW/stw2Pages/stw2.tsx +212 -0
  168. package/src/widgets/STW/stw2Pages/style.module.css +1226 -0
  169. package/src/widgets/STW/stw2Pages/userDetails.tsx +86 -0
  170. package/src/widgets/STW/stw2Pages/wheel.tsx +117 -0
  171. package/src/widgets/STW/stw2PreviewStyles/thankyouPreviewDesktop.module.css +835 -0
  172. package/src/widgets/STW/stw2PreviewStyles/thankyouPreviewMobile.module.css +787 -0
  173. package/src/widgets/STW/stw2PreviewStyles/userInputsPreviewDesktop.module.css +867 -0
  174. package/src/widgets/STW/stw2PreviewStyles/userInputsPreviewMobile.module.css +798 -0
  175. package/src/widgets/STW/stw2PreviewStyles/wheelPreviewDesktop.module.css +572 -0
  176. package/src/widgets/STW/stw2PreviewStyles/wheelPreviewMobile.module.css +559 -0
  177. package/src/widgets/STW/style.module.css +901 -0
  178. package/src/widgets/STW/userDetails.tsx +150 -0
  179. package/src/widgets/STW/utility.ts +664 -0
  180. package/src/widgets/STW/wheel.tsx +304 -0
  181. package/src/widgets/ScratchCard/ScratchOff/scratchOff.tsx +157 -0
  182. package/src/widgets/ScratchCard/config.ts +152 -0
  183. package/src/widgets/ScratchCard/globalStyle.module.css +931 -0
  184. package/src/widgets/ScratchCard/index.tsx +546 -0
  185. package/src/widgets/ScratchCard/modal.tsx +225 -0
  186. package/src/widgets/ScratchCard/preview.module.css +250 -0
  187. package/src/widgets/ScratchCard/previewMobile.module.css +247 -0
  188. package/src/widgets/ScratchCard/previewStyles/userDetailsPreviewDesktop.module.css +537 -0
  189. package/src/widgets/ScratchCard/previewStyles/userDetailsPreviewMobile.module.css +463 -0
  190. package/src/widgets/ScratchCard/style.module.css +220 -0
  191. package/src/widgets/ShopifyForm/config.ts +168 -0
  192. package/src/widgets/ShopifyForm/index.tsx +214 -0
  193. package/src/widgets/ShopifyForm/previewDesktop.module.css +117 -0
  194. package/src/widgets/ShopifyForm/previewMobile.module.css +131 -0
  195. package/src/widgets/ShopifyForm/shopifyForm.tsx +445 -0
  196. package/src/widgets/ShopifyForm/style.module.css +161 -0
  197. package/src/widgets/SingleButtonRedirection/config.ts +47 -0
  198. package/src/widgets/SingleButtonRedirection/index.tsx +121 -0
  199. package/src/widgets/WebStories/config.ts +105 -0
  200. package/src/widgets/WebStories/index.css +3 -0
  201. package/src/widgets/WebStories/index.tsx +282 -0
  202. package/src/widgets/WebStories/style.module.css +26 -0
  203. package/src/widgets/index.tsx +3 -0
  204. package/src/widgets/utility.ts +31 -0
  205. package/tsconfig.json +12 -0
  206. package/webpack.config.js +239 -0
@@ -0,0 +1,28 @@
1
+ import React from 'react';
2
+ import { useExitIntent } from 'hooks/useExitIntent';
3
+ import {
4
+ EXIT_INTENT_LEVEL,
5
+ TRIGGERED_INTENT_TYPE,
6
+ } from '@bikdotai/bik-models/dm/models/analytics';
7
+
8
+ interface ExitIntentHookProps {
9
+ onExitIntent: (exitIntentType: TRIGGERED_INTENT_TYPE) => void;
10
+ config?: {
11
+ exitIntentTimeDelay?: number | null;
12
+ exitIntentViewLimit?: number | null;
13
+ exitIntentFastUpScroll?: boolean | null;
14
+ showExitIntentOn?: EXIT_INTENT_LEVEL | null;
15
+ };
16
+ widgetId?: string;
17
+ }
18
+
19
+ const ExitIntentHook: React.FC<ExitIntentHookProps> = props => {
20
+ useExitIntent({
21
+ onExitIntent: props.onExitIntent,
22
+ config: props.config,
23
+ widgetId: props.widgetId,
24
+ });
25
+ return null;
26
+ };
27
+
28
+ export default ExitIntentHook;
@@ -0,0 +1,70 @@
1
+ import { encryptBikData } from '../../utilities/encryption';
2
+ import { ITriggeredIntentDetails } from '../../hooks/useTriggeredIntentDetails';
3
+
4
+ export interface IChannelInfo {
5
+ channel: 'sms' | 'email' | 'whatsapp' | 'customField';
6
+ value: string;
7
+ customFieldId?: number;
8
+ }
9
+ export interface IPayloadFetchCouponCode {
10
+ storeId: string;
11
+ widgetId: string;
12
+ primaryInfo: IChannelInfo[];
13
+ secondaryInfo: IChannelInfo[];
14
+ templateId: string;
15
+ quadrant?: number;
16
+ session?: string;
17
+ productId?: number;
18
+ productName?: string;
19
+ variantId?: number;
20
+ variantName?: string;
21
+ variantPrice?: number;
22
+ triggeredIntentDetails?: ITriggeredIntentDetails;
23
+ }
24
+ export const fetchCouponCode = async (
25
+ payload: IPayloadFetchCouponCode,
26
+ environment,
27
+ ) => {
28
+ const isStw =
29
+ payload.templateId === 'KHnL25g05yRTFCGyJFit' ||
30
+ payload.templateId === 'KcG3ONb3O8OPE2CSAXWJ';
31
+ const url = `${environment}/publicApiFunctions-${isStw ? 'claimReward' : 'fetchCouponCode'}`;
32
+ const response = await fetch(url, {
33
+ method: 'POST',
34
+ headers: {
35
+ 'Content-Type': 'application/json',
36
+ },
37
+ body: JSON.stringify(payload),
38
+ });
39
+ return response.json();
40
+ };
41
+
42
+ export const addLead = async (
43
+ payload: IPayloadFetchCouponCode,
44
+ environment,
45
+ ) => {
46
+ const response = await fetch(`${environment}/publicApiFunctions-addLead`, {
47
+ method: 'POST',
48
+ headers: {
49
+ 'Content-Type': 'application/json',
50
+ },
51
+ body: JSON.stringify(payload),
52
+ });
53
+ return response.json();
54
+ };
55
+
56
+ export const sendWidgetEvent = (event, widgetId, env) => {
57
+ fetch(`${env}/publicApiFunctions-sendWidgetEvent`, {
58
+ method: 'POST',
59
+ headers: {
60
+ Accept: 'application/json',
61
+ 'Content-Type': 'application/json',
62
+ },
63
+ body: JSON.stringify({
64
+ widgetId: widgetId,
65
+ event,
66
+ }),
67
+ })
68
+ .then(response => response.json())
69
+ .then(() => {});
70
+ };
@@ -0,0 +1,44 @@
1
+ import React from 'react';
2
+
3
+ export enum SVGName {
4
+ BIK = 'BIK',
5
+ }
6
+ interface SVGFactoryProps {
7
+ name: SVGName;
8
+ color?: string;
9
+ }
10
+ const SVGFactory = (props: SVGFactoryProps) => {
11
+ const { name, color } = props;
12
+ return (
13
+ <>
14
+ {name === SVGName.BIK && (
15
+ <svg
16
+ width="28"
17
+ height="10"
18
+ viewBox="0 0 28 10"
19
+ fill="none"
20
+ xmlns="http://www.w3.org/2000/svg"
21
+ >
22
+ <path
23
+ d="M28 8.21913C28 9.20256 27.1629 9.99979 26.1302 9.99979C25.0976 9.99979 24.2605 9.20256 24.2605 8.21913C24.2605 7.2357 25.0976 6.43848 26.1302 6.43848C27.1629 6.43848 28 7.2357 28 8.21913Z"
24
+ fill="#A2A2A2"
25
+ />
26
+ <path
27
+ d="M0.388011 9.9487C0.288521 9.9487 0.19898 9.91553 0.119388 9.84921C0.0397961 9.77341 0 9.6834 0 9.57917V0.369523C0 0.265299 0.0397961 0.180024 0.119388 0.113699C0.19898 0.0378997 0.288521 0 0.388011 0H5.14861C6.05397 0 6.79517 0.113699 7.37222 0.341098C7.94926 0.568497 8.37707 0.895383 8.65564 1.32176C8.93421 1.74813 9.0735 2.27399 9.0735 2.89933C9.0735 3.22148 9.00385 3.51047 8.86457 3.76629C8.73523 4.01264 8.57605 4.22109 8.38701 4.39164C8.19798 4.55271 8.0189 4.67115 7.84977 4.74695C8.23778 4.90802 8.57605 5.1828 8.86457 5.57127C9.15309 5.95027 9.29735 6.38612 9.29735 6.87881C9.29735 7.54206 9.13817 8.10108 8.8198 8.55588C8.51138 9.01068 8.0587 9.35651 7.46176 9.59339C6.87477 9.83026 6.15346 9.9487 5.29785 9.9487H0.388011ZM3.20856 7.80262H4.95461C5.29287 7.80262 5.5416 7.70787 5.70078 7.51837C5.85997 7.3194 5.93956 7.10148 5.93956 6.8646C5.93956 6.61825 5.85499 6.40507 5.68586 6.22504C5.51673 6.03554 5.27297 5.94079 4.95461 5.94079H3.20856V7.80262ZM3.20856 3.85157H4.80537C5.12374 3.85157 5.35754 3.76629 5.50678 3.59574C5.65601 3.42519 5.73063 3.22622 5.73063 2.99882C5.73063 2.77142 5.65601 2.57245 5.50678 2.4019C5.35754 2.23135 5.12374 2.14608 4.80537 2.14608H3.20856V3.85157Z"
28
+ fill={`${color ?? '#A1A1A1'}`}
29
+ />
30
+ <path
31
+ d="M10.5173 9.9487C10.4179 9.9487 10.3283 9.91553 10.2487 9.84921C10.1691 9.77341 10.1293 9.6834 10.1293 9.57917V0.369523C10.1293 0.265299 10.1691 0.180024 10.2487 0.113699C10.3283 0.0378997 10.4179 0 10.5173 0H13.0543C13.1638 0 13.2533 0.0378997 13.323 0.113699C13.4026 0.180024 13.4424 0.265299 13.4424 0.369523V9.57917C13.4424 9.6834 13.4026 9.77341 13.323 9.84921C13.2533 9.91553 13.1638 9.9487 13.0543 9.9487H10.5173Z"
32
+ fill={`${color ?? '#A1A1A1'}`}
33
+ />
34
+ <path
35
+ d="M15.0795 9.9487C14.98 9.9487 14.8905 9.91553 14.8109 9.84921C14.7313 9.77341 14.6915 9.6834 14.6915 9.57917V0.369523C14.6915 0.265299 14.7313 0.180024 14.8109 0.113699C14.8905 0.0378997 14.98 0 15.0795 0H17.4523C17.5618 0 17.6513 0.0378997 17.721 0.113699C17.8006 0.180024 17.8404 0.265299 17.8404 0.369523V3.35413L20.064 0.298461C20.1137 0.232136 20.1834 0.165812 20.2729 0.0994874C20.3624 0.0331624 20.4868 0 20.646 0H23.377C23.4665 0 23.5411 0.0331624 23.6008 0.0994874C23.6705 0.156337 23.7053 0.227399 23.7053 0.312674C23.7053 0.369523 23.6854 0.421635 23.6456 0.46901L20.5117 4.76116L23.9142 9.47969C23.954 9.51759 23.9739 9.5697 23.9739 9.63602C23.9739 9.7213 23.9391 9.7971 23.8695 9.86342C23.8098 9.92027 23.7351 9.9487 23.6456 9.9487H20.8251C20.636 9.9487 20.4918 9.90606 20.3923 9.82079C20.3027 9.73551 20.248 9.67392 20.2281 9.63602L17.8404 6.33874V9.57917C17.8404 9.6834 17.8006 9.77341 17.721 9.84921C17.6513 9.91553 17.5618 9.9487 17.4523 9.9487H15.0795Z"
36
+ fill={`${color ?? '#A1A1A1'}`}
37
+ />
38
+ </svg>
39
+ )}
40
+ </>
41
+ );
42
+ };
43
+
44
+ export default SVGFactory;
@@ -0,0 +1,193 @@
1
+ import {
2
+ BACKGROUND_TYPE,
3
+ ISTWWidgetCustomisation,
4
+ } from '@bikdotai/bik-models/dm';
5
+
6
+ const config = {
7
+ id: 'widget',
8
+ environment: 'staging',
9
+ templateName: 'Spin the wheel popup',
10
+ widgetCustomisation: {
11
+ probability: {
12
+ probability: [0.1, 0.1, 0.2, 0.2, 0.1, 0.3],
13
+ probabilityIndexArray: [
14
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2,
15
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3,
16
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 5, 5,
17
+ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
18
+ 5, 5, 5, 5,
19
+ ],
20
+ },
21
+ widgetName: 'Spin the wheel popup pac4',
22
+ fabPositioner: {
23
+ left: '30px',
24
+ bottom: '30px',
25
+ },
26
+ playScreenHeading:
27
+ '<p><strong>Spin the wheel to win exciting prizes</strong></p>',
28
+ fabBackgroundColor: '#d97559',
29
+ fontFamily: {
30
+ name: 'Inter',
31
+ link: 'https://fonts.googleapis.com/css2?family=Inter:wght@300;400;500;600&display=swap',
32
+ },
33
+ fontColour: '#000000',
34
+ playScreenSubHeading:
35
+ '<p>You have a chance to win a big discount. Are you ready?</p>',
36
+ spinLimit: 0,
37
+ iconcolor: '#f5f5f5',
38
+ wheelDetails: [],
39
+ spikesCount: 6,
40
+ spinnerColor: '#fbbb18',
41
+ segmentColor2: '#d97559',
42
+ segmentAngle: 60,
43
+ segmentColor1: '#a1deed',
44
+ iconColor: '#f5f5f5',
45
+ fabIconLink:
46
+ 'https://storage.googleapis.com/bik-widget-mfe/bap%2Ffab-assets%2Ficons%2Fbik%2Fgift.svg',
47
+ fabPosition: 'BOTTOM_LEFT',
48
+ postSpinScreenCtaColor: '#731dcf',
49
+ fabMobileSize: 50,
50
+ fabWebSize: '50',
51
+ winningScreenCouponTextColour: '#000000',
52
+ winningScreenButtonColour: '#000000',
53
+ winningScreenTitle:
54
+ '<p><strong>Spin the wheel to win exciting prizes</strong></p>',
55
+ winningScreenSubTitle: '<p>You have a chance to win a big discount</p>',
56
+ postPlayScreenButtonColour: '#000000',
57
+ postPlayScreenButtonText: 'Claim prize',
58
+ postPlayScreenTitle: '<p><strong>Special prize only for you!</strong></p>',
59
+ postPlayScreenSubTitle: '<p>To claim prize fill the details below</p>',
60
+ winningScreenButtonText: 'Copy and use discount',
61
+ winningScreenIcon: '',
62
+ winningScreenBackgroundColour: '#ffffff',
63
+ winningScreenButtonTextColour: '#ffffff',
64
+ winningScreenCouponBgColour: '#ffffff',
65
+ postPlayScreenBackgroundColour: '#ffffff',
66
+ fabColor: '#ffffff',
67
+ playScreenBackgroundColour: '#ffffff',
68
+ postPlayScreenButtonTextColour: '#ffffff',
69
+ discountCodeTitle: {
70
+ '1': 'asdf',
71
+ '2': 'asf',
72
+ '3': 'afs',
73
+ '4': 'asf',
74
+ '5': 'asfs',
75
+ '6': 'fsadf',
76
+ },
77
+ backgroundType: 'colour',
78
+ backgroundColour: '#ffffff',
79
+ winningScreenTitleIcon:
80
+ 'https://storage.googleapis.com/bik-widget-mfe/bap%2Fpost-play-screen-assets%2Fimages%2Fbik%2FconfettiOne.png',
81
+ multiLingualConfigurations: {
82
+ ENGLISH: {
83
+ playScreenHeading:
84
+ '<p><strong>Spin the wheel to win exciting prizes</strong></p>',
85
+ playScreenSubHeading:
86
+ '<p>You have a chance to win a big discount. Are you ready?</p>',
87
+ playScreenButtonText: 'Spin to win',
88
+ postPlayScreenTitle:
89
+ '<p><strong>Special prize only for you!</strong></p>',
90
+ postPlayScreenSubTitle: '<p>To claim prize fill the details below</p>',
91
+ postPlayScreenButtonText: 'Claim prize',
92
+ winningScreenTitle:
93
+ '<p><strong>Hurry! you have won a coupon</strong></p>',
94
+ winningScreenSubTitle: '<p>Use the coupon during checkout</p>',
95
+ winningScreenButtonText: 'Copy and use discount',
96
+ },
97
+ ARABIC: {
98
+ playScreenHeading:
99
+ '<p><strong>ادور العجلة لربح جوائز مثيرة</strong></p>',
100
+ playScreenSubHeading: '<p>لديك فرصة للفوز بخصم كبير. هل أنت جاهز؟</p>',
101
+ playScreenButtonText: 'ادور للفوز',
102
+ postPlayScreenTitle: '<p><strong>جائزة خاصة فقط لك!</strong></p>',
103
+ postPlayScreenSubTitle:
104
+ '<p>للحصول على الجائزة، قم بملء التفاصيل أدناه</p>',
105
+ postPlayScreenButtonText: 'ادعي الجائزة',
106
+ winningScreenTitle: '<p><strong>أسرع! لقد فزت بقسيمة</strong></p>',
107
+ winningScreenSubTitle: '<p>استخدم القسيمة أثناء الخروج</p>',
108
+ winningScreenButtonText: 'انسخ واستخدم الخصم',
109
+ },
110
+ FRENCH: {
111
+ playScreenHeading:
112
+ '<p><strong>Faites tourner la roue pour gagner des prix excitants</strong></p>',
113
+ playScreenSubHeading:
114
+ '<p>Vous avez une chance de gagner un gros rabais. Êtes-vous prêt?</p>',
115
+ playScreenButtonText: 'Tourner pour gagner',
116
+ postPlayScreenTitle:
117
+ '<p><strong>Prix spécial juste pour vous!</strong></p>',
118
+ postPlayScreenSubTitle:
119
+ '<p>Pour réclamer le prix, remplissez les détails ci-dessous</p>',
120
+ postPlayScreenButtonText: 'Réclamer le prix',
121
+ winningScreenTitle:
122
+ '<p><strong>Dépêchez-vous! vous avez gagné un coupon</strong></p>',
123
+ winningScreenSubTitle: '<p>Utilisez le coupon lors du paiement</p>',
124
+ winningScreenButtonText: 'Copier et utiliser le rabais',
125
+ },
126
+ MALAY: {
127
+ playScreenHeading:
128
+ '<p><strong>Putar roda untuk memenangi hadiah menarik</strong></p>',
129
+ playScreenSubHeading:
130
+ '<p>Anda berpeluang untuk memenangi kod diskaun besar. Adakah anda bersedia?</p>',
131
+ playScreenButtonText: 'Putar untuk menang',
132
+ postPlayScreenTitle:
133
+ '<p><strong>Hadiah istimewa hanya untuk anda!</strong></p>',
134
+ postPlayScreenSubTitle:
135
+ '<p>Untuk menuntut hadiah, isikan butiran di bawah</p>',
136
+ postPlayScreenButtonText: 'Tuntut hadiah',
137
+ winningScreenTitle:
138
+ '<p><strong>Bergegas! anda telah memenangi kupon</strong></p>',
139
+ winningScreenSubTitle: '<p>Guna kupon semasa pembayaran</p>',
140
+ winningScreenButtonText: 'Salin dan gunakan diskaun',
141
+ },
142
+ },
143
+ } as ISTWWidgetCustomisation,
144
+ visibility: {
145
+ visiblePages: ['/*'],
146
+ triggers: {
147
+ isPlayable: false,
148
+ playLimit: null,
149
+ hasFAbButton: true,
150
+ pageScroll: null,
151
+ timeDelay: null,
152
+ viewLimit: null,
153
+ fabButtonVisibility: true,
154
+ frequency: null,
155
+ },
156
+ },
157
+ leadGeneration: {
158
+ optionalOptions: {
159
+ isSms: false,
160
+ isWhatsapp: false,
161
+ isEmail: false,
162
+ },
163
+ mandatoryOption: {
164
+ isSms: false,
165
+ isWhatsapp: true,
166
+ isEmail: false,
167
+ },
168
+ enableConsentPolicies: false,
169
+ privacyPolicyURL: '',
170
+ },
171
+ info: {
172
+ scriptPath: 'bap/widget-stw/stw.js',
173
+ widgetTypeId: 'lCcPfO2RuooXpBGgZSs0',
174
+ templateName: 'Spin the wheel popup',
175
+ liveSince: '07/09/2023',
176
+ infra: '2.0',
177
+ id: '1z5TI1ZzjKWrZR5tv39r',
178
+ templateId: 'KHnL25g05yRTFCGyJFit',
179
+ storeId: 'p60HYv5wjgQaOrPdqT5NjbpkroD2',
180
+ delete: false,
181
+ status: 'LIVE',
182
+ },
183
+ storeWidgetConfig: {
184
+ '/*': [
185
+ {
186
+ widgetId: 'widget',
187
+ fabPosition: 'BOTTOM_LEFT',
188
+ },
189
+ ],
190
+ },
191
+ };
192
+
193
+ export default config;
@@ -0,0 +1,7 @@
1
+ import { createContext } from 'react';
2
+
3
+ export const STWContext = createContext<{
4
+ preview: boolean;
5
+ isMobile: boolean;
6
+ templateName: string;
7
+ }>({ preview: false, isMobile: false, templateName: '' });
@@ -0,0 +1,121 @@
1
+ import React, { useState, useEffect } from 'react';
2
+ import Coupon from '../../components/couponDetails/coupon';
3
+ import { ISTWTemplate } from './stw1';
4
+ import CloseIcon from '../../assets/svg/Close';
5
+ import { toSnakeCase } from '../../utilities/stringUtils';
6
+ import {
7
+ BACKGROUND_TYPE,
8
+ ISTWWidgetCustomisation,
9
+ LANGUAGE_VALUES,
10
+ LANGUAGE_ISO_CODES,
11
+ } from '@bikdotai/bik-models/dm';
12
+ import useIsMobile from '../../hooks/useIsMobile';
13
+ import { ComponentStyleMap, injectFontLink } from '../../utilities/styleUtils';
14
+ import { LanguageUtils } from 'utilities/languageUtilities';
15
+
16
+ const CouponDetails = (props: ISTWTemplate) => {
17
+ const {
18
+ widgetCustomisation,
19
+ couponCodeDetails,
20
+ onCloseHandle,
21
+ preview,
22
+ isMobile,
23
+ templateName,
24
+ } = props;
25
+ const {
26
+ fontFamily,
27
+ backgroundType,
28
+ backgroundColour,
29
+ backgroundImageMobile,
30
+ backgroundImageDesktop,
31
+ } = widgetCustomisation as ISTWWidgetCustomisation;
32
+ const [currentStyle, setCurrentStyle] = useState<any>(null);
33
+ const isMobileDevice = useIsMobile();
34
+ const languageUtils = new LanguageUtils();
35
+ const [widgetLanguage, setWidgetLanguage] = useState(LANGUAGE_VALUES.ENGLISH);
36
+
37
+ useEffect(() => {
38
+ if (fontFamily && fontFamily?.link) {
39
+ injectFontLink([fontFamily?.link]);
40
+ }
41
+ }, [fontFamily]);
42
+
43
+ useEffect(() => {
44
+ if (preview) {
45
+ if (isMobile) {
46
+ ComponentStyleMap[templateName]?.thankyouPreviewMobile.then(
47
+ async style => {
48
+ setCurrentStyle((await style()).default);
49
+ },
50
+ );
51
+ } else {
52
+ ComponentStyleMap[templateName]?.thankyouPreviewDesktop.then(
53
+ async style => {
54
+ setCurrentStyle((await style()).default);
55
+ },
56
+ );
57
+ }
58
+ } else {
59
+ ComponentStyleMap[templateName]?.globalStyle.then(async style => {
60
+ setCurrentStyle((await style()).default);
61
+ });
62
+ }
63
+ }, [preview, isMobile]);
64
+
65
+ useEffect(() => {
66
+ const isBikURL =
67
+ window.location.href?.includes('https://dashboard.bik.ai/') ||
68
+ window.location.href?.includes('https://staging.dashboard.bik.ai/');
69
+ const previewLanguage = props?.widgetCustomisation?.previewLanguage;
70
+ const storeLanguage =
71
+ (isBikURL ? previewLanguage : window?.Shopify?.locale) ??
72
+ previewLanguage ??
73
+ LANGUAGE_ISO_CODES.EN;
74
+ setWidgetLanguage(languageUtils.getStoreLanguage(storeLanguage));
75
+ }, [window.location.href, props?.widgetCustomisation?.previewLanguage]);
76
+
77
+ if (!currentStyle || !couponCodeDetails) {
78
+ return <></>;
79
+ }
80
+ return (
81
+ <div className={currentStyle.bikSpinOverlay}>
82
+ <div
83
+ className={currentStyle.bikMainWrapper}
84
+ id={`bik-${props.id}-coupon-screen`}
85
+ >
86
+ <div className={currentStyle.bikCloseBtnWrapper}>
87
+ <div
88
+ className={currentStyle.bikCloseBtn}
89
+ onClick={() => onCloseHandle('couponDetails')}
90
+ >
91
+ <CloseIcon />
92
+ </div>
93
+ </div>
94
+ <div
95
+ className={currentStyle.bikWrapper + ' ' + currentStyle.bikPadding20}
96
+ style={
97
+ backgroundType === BACKGROUND_TYPE.IMAGE
98
+ ? {
99
+ background: `url(${isMobileDevice || isMobile ? backgroundImageMobile : backgroundImageDesktop})`,
100
+ backgroundSize: 'contain',
101
+ backgroundRepeat: 'round',
102
+ backgroundPosition: 'top',
103
+ fontFamily: fontFamily?.name,
104
+ }
105
+ : {
106
+ backgroundColor: backgroundColour ?? '#ffffff',
107
+ fontFamily: fontFamily?.name ?? 'Inter',
108
+ }
109
+ }
110
+ >
111
+ <Coupon
112
+ {...props}
113
+ widgetName={toSnakeCase(templateName)}
114
+ widgetLanguage={widgetLanguage}
115
+ />
116
+ </div>
117
+ </div>
118
+ </div>
119
+ );
120
+ };
121
+ export default CouponDetails;