@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,155 @@
1
+ import React, { useContext, useCallback, useState, useMemo } from 'react';
2
+ import CountriesDropDown from '../countryCodePicker/countriesDropdown';
3
+ import SelectedCountry from '../selectedCountry/selectedCountry';
4
+ import { STWContext } from '../../widgets/STW/context';
5
+ import { UserFields } from '../../types/customFields';
6
+ import { LanguageUtils } from '../../utilities/languageUtilities';
7
+ import { LANGUAGE_VALUES } from '@bikdotai/bik-models/dm';
8
+ import { InputBox } from '../inputComponents/InputBox';
9
+ import useIsMobile from '../../hooks/useIsMobile';
10
+
11
+ export interface InputProps {
12
+ selectedCountryData: { code: string; dial: string; code3: string };
13
+ setUserInputs: React.Dispatch<React.SetStateAction<UserFields>>;
14
+ onChangeHandle: (
15
+ value: string,
16
+ key: 'isWhatsapp' | 'isSms' | 'isEmail',
17
+ ) => void;
18
+ value: string;
19
+ title?: string;
20
+ error: string;
21
+ skipCountryPicker: boolean;
22
+ screenButtonColour?: string;
23
+ id?: string;
24
+ fontColour: string;
25
+ onFocusColour?: string;
26
+ widgetLanguage?: LANGUAGE_VALUES;
27
+ }
28
+
29
+ const WhatsappInputBox: React.FC<InputProps> = ({
30
+ selectedCountryData,
31
+ setUserInputs,
32
+ onChangeHandle,
33
+ value,
34
+ title,
35
+ error,
36
+ skipCountryPicker,
37
+ id,
38
+ fontColour,
39
+ widgetLanguage,
40
+ }) => {
41
+ const languageUtilities = useMemo(() => new LanguageUtils(), []);
42
+ const [showDropdown, setShowDropdown] = useState<boolean>(false);
43
+ const { preview, isMobile } = useContext(STWContext);
44
+ const isMobileDevice = useIsMobile();
45
+
46
+ const toggleDropDown = (flag: boolean) => {
47
+ setShowDropdown(flag);
48
+ };
49
+
50
+ const onListItemClickHandle = (code: string, dial: string, code3: string) => {
51
+ setShowDropdown(false);
52
+ setUserInputs(prevState => {
53
+ return {
54
+ ...prevState,
55
+ isWhatsapp: {
56
+ ...prevState.isWhatsapp,
57
+ countryCodeData: { code, dial, code3 },
58
+ },
59
+ customFields: {
60
+ ...prevState.customFields,
61
+ },
62
+ };
63
+ });
64
+ toggleDropDown(false);
65
+ };
66
+
67
+ const handleChange = useCallback(
68
+ (newValue: string) => {
69
+ onChangeHandle(newValue, 'isWhatsapp');
70
+ },
71
+ [onChangeHandle],
72
+ );
73
+
74
+ const labelText =
75
+ title ?? languageUtilities.getWhatsappNumberTitle(widgetLanguage);
76
+
77
+ const containerStyle = useMemo(() => {
78
+ const fontSize = preview ? (isMobile ? '12px' : '10px') : '14px';
79
+
80
+ return {
81
+ fontFamily: 'inherit',
82
+ color: fontColour,
83
+ display: 'flex' as const,
84
+ gap: skipCountryPicker ? 0 : 8,
85
+ flexDirection: skipCountryPicker ? ('column' as const) : ('row' as const),
86
+ fontSize,
87
+ marginTop: preview ? 4 : 12,
88
+ };
89
+ }, [preview, isMobile, fontColour, skipCountryPicker]);
90
+
91
+ const inputBoxStyle = useMemo(
92
+ () =>
93
+ ({
94
+ '--bik-inputBox-text-color': fontColour,
95
+ '--bik-inputBox-label-color': fontColour,
96
+ '--bik-inputBox-border-color': error ? '#b92321' : '#e0e0e0',
97
+ '--bik-inputBox-error-border-color': '#b92321',
98
+ }) as React.CSSProperties & Record<string, string>,
99
+ [fontColour, error],
100
+ );
101
+
102
+ const inputHeight = useMemo(() => {
103
+ if (preview) {
104
+ return isMobile ? 22 : 18;
105
+ }
106
+ return isMobileDevice ? 48 : 56;
107
+ }, [preview, isMobile, isMobileDevice]);
108
+
109
+ return (
110
+ <div style={containerStyle}>
111
+ {!skipCountryPicker && (
112
+ <div
113
+ style={{
114
+ fontFamily: 'inherit',
115
+ display: 'flex',
116
+ alignItems: 'flex-start',
117
+ position: 'relative',
118
+ }}
119
+ >
120
+ <SelectedCountry
121
+ toggleDropDown={toggleDropDown}
122
+ showDropdown={showDropdown}
123
+ selectedCountryData={selectedCountryData}
124
+ fontColour={fontColour}
125
+ />
126
+ {showDropdown && (
127
+ <CountriesDropDown
128
+ onListItemClickHandle={onListItemClickHandle}
129
+ closeDropdown={() => {
130
+ setShowDropdown(false);
131
+ }}
132
+ />
133
+ )}
134
+ </div>
135
+ )}
136
+
137
+ <div style={{ flex: 1, ...inputBoxStyle }}>
138
+ <InputBox
139
+ id={id}
140
+ value={value || ''}
141
+ onChange={handleChange}
142
+ inputType="number"
143
+ labelText={labelText}
144
+ errorMessage={error}
145
+ isRequired={false}
146
+ inputHeight={inputHeight}
147
+ fontColour={fontColour}
148
+ isPreview={preview}
149
+ />
150
+ </div>
151
+ </div>
152
+ );
153
+ };
154
+
155
+ export default WhatsappInputBox;
@@ -0,0 +1,71 @@
1
+ .bikStwPhoneInputRow {
2
+ font-family: inherit;
3
+ display: flex;
4
+ flex-direction: row;
5
+ margin-top: 4px;
6
+ width: 100%;
7
+ gap: 4px;
8
+ }
9
+
10
+ .bikStwPhoneInputRow > div {
11
+ font-family: inherit;
12
+ }
13
+
14
+ .bikInputMain {
15
+ display: flex;
16
+ margin: 0;
17
+ }
18
+
19
+ .bikStwPhoneInput {
20
+ flex: 1;
21
+ font-family: inherit;
22
+ }
23
+
24
+ .bikStwH2 {
25
+ font-family: inherit;
26
+ font-style: normal;
27
+ font-weight: 400;
28
+ font-size: 8px;
29
+ line-height: 10px;
30
+ font-feature-settings:
31
+ 'tnum' on,
32
+ 'lnum' on,
33
+ 'case' on,
34
+ 'ss04' on;
35
+ color: #212121;
36
+ margin-bottom: 0;
37
+ }
38
+
39
+ .bikInputWrapper {
40
+ width: 100%;
41
+ display: flex;
42
+ flex-direction: column;
43
+ font-family: inherit;
44
+ }
45
+
46
+ .bikInputWrapper input {
47
+ outline: none;
48
+ padding: 2px;
49
+ background-color: rgba(256, 256, 256, 0.3);
50
+ border: 1px solid #e0e0e0;
51
+ border-radius: 4px !important;
52
+ width: 100%;
53
+ font-family: inherit;
54
+ height: 22px;
55
+ box-shadow: none;
56
+ font-size: 7px;
57
+ margin-left: 0;
58
+ pointer-events: none;
59
+ }
60
+
61
+ input::-webkit-outer-spin-button,
62
+ input::-webkit-inner-spin-button {
63
+ -webkit-appearance: none;
64
+ margin: 0;
65
+ }
66
+
67
+ .bikEmailInputMain {
68
+ display: block;
69
+ margin: 0;
70
+ font-family: inherit;
71
+ }
@@ -0,0 +1,65 @@
1
+ .bikStwPhoneInputRow {
2
+ font-family: inherit;
3
+ display: flex;
4
+ gap: 4px;
5
+ flex-direction: row;
6
+ width: 100%;
7
+ }
8
+
9
+ .bikStwPhoneInputRow > div {
10
+ font-family: inherit;
11
+ }
12
+
13
+ .bikInputMain {
14
+ display: flex;
15
+ margin: 4px 0;
16
+ }
17
+
18
+ .bikStwPhoneInput {
19
+ flex: 1;
20
+ font-family: inherit;
21
+ }
22
+
23
+ .bikStwH2 {
24
+ font-family: inherit;
25
+ font-style: normal;
26
+ font-weight: 400;
27
+ font-size: 12px;
28
+ line-height: 14px;
29
+ font-feature-settings:
30
+ 'tnum' on,
31
+ 'lnum' on,
32
+ 'case' on,
33
+ 'ss04' on;
34
+ color: #212121;
35
+ margin-bottom: 0;
36
+ }
37
+
38
+ .bikInputWrapper {
39
+ width: 100%;
40
+ display: flex;
41
+ flex-direction: column;
42
+ font-family: inherit;
43
+ margin-top: 4px;
44
+ }
45
+
46
+ .bikInputWrapper input {
47
+ outline: none;
48
+ padding: 4px 6px;
49
+ background-color: rgba(256, 256, 256, 0.3);
50
+ border: 1px solid #e0e0e0;
51
+ border-radius: 4px;
52
+ width: 100%;
53
+ font-family: inherit;
54
+ height: 26px;
55
+ box-shadow: none;
56
+ font-size: 8px;
57
+ margin-left: 0;
58
+ pointer-events: none;
59
+ }
60
+
61
+ .bikEmailInputMain {
62
+ display: block;
63
+ margin: 0;
64
+ font-family: inherit;
65
+ }
@@ -0,0 +1,19 @@
1
+ .checkbox__container {
2
+ width: 14px;
3
+ height: 14px;
4
+ justify-content: center;
5
+ display: flex;
6
+ align-items: center;
7
+ cursor: pointer;
8
+ }
9
+
10
+ .checkbox__icon {
11
+ width: 10px;
12
+ height: 10px;
13
+ border-radius: 2px;
14
+ background-color: rgba(256, 256, 256, 0.3);
15
+ display: flex !important;
16
+ justify-content: center;
17
+ align-items: center;
18
+ box-sizing: content-box;
19
+ }
@@ -0,0 +1,88 @@
1
+ import React, { useEffect, useState } from 'react';
2
+
3
+ export type CheckBoxProps = {
4
+ isChecked: boolean;
5
+ onChange: (value: boolean) => void;
6
+ checkedColour: string;
7
+ borderColour: string;
8
+ };
9
+
10
+ const CheckMark: React.FC<{
11
+ checkedColour: string;
12
+ }> = props => {
13
+ return (
14
+ <svg
15
+ width={'16'}
16
+ height={'16'}
17
+ viewBox={'0 0 16 16'}
18
+ fill="none"
19
+ xmlns="http://www.w3.org/2000/svg"
20
+ >
21
+ <rect
22
+ x="0"
23
+ y="0"
24
+ width={'16'}
25
+ height={'16'}
26
+ rx="4"
27
+ fill={props.checkedColour}
28
+ />
29
+ <svg
30
+ width={'8'}
31
+ height={'7'}
32
+ x="4"
33
+ y="4"
34
+ viewBox="0 0 10 9"
35
+ fill="none"
36
+ xmlns="http://www.w3.org/2000/svg"
37
+ >
38
+ <path
39
+ fillRule="evenodd"
40
+ clipRule="evenodd"
41
+ d="M9.68189 1.06043C10.0724 1.45096 10.0724 2.08412 9.68189 2.47464L4.02501 8.13152C3.63449 8.52205 3.00132 8.52205 2.6108 8.13152L0.489684 6.01041C0.0991601 5.61988 0.0991598 4.98672 0.489684 4.59619C0.880209 4.20567 1.51337 4.20567 1.9039 4.59619L3.31791 6.0102L8.26768 1.06043C8.6582 0.669907 9.29137 0.669907 9.68189 1.06043Z"
42
+ fill="white"
43
+ />
44
+ </svg>
45
+ </svg>
46
+ );
47
+ };
48
+
49
+ export const CheckBox: React.FC<CheckBoxProps> = props => {
50
+ const [currentStyle, setCurrentStyle] = useState<any>(null);
51
+
52
+ useEffect(() => {
53
+ const importStyles = async () => {
54
+ const stylesModule = await import('../checkbox/checkbox.module.css');
55
+ setCurrentStyle(stylesModule.default);
56
+ };
57
+ importStyles().then();
58
+ }, []);
59
+
60
+ const handleCheck = () => {
61
+ props.onChange(!props.isChecked);
62
+ };
63
+
64
+ if (!currentStyle) {
65
+ return <></>;
66
+ }
67
+
68
+ return (
69
+ <div className={currentStyle.checkbox__container} onClick={handleCheck}>
70
+ <div
71
+ className={currentStyle.checkbox__icon}
72
+ style={
73
+ props.isChecked
74
+ ? {
75
+ outline: `0.5px solid ${props.checkedColour}`,
76
+ outlineOffset: 1,
77
+ border: 0,
78
+ }
79
+ : {
80
+ border: `1px solid ${props.borderColour}`,
81
+ }
82
+ }
83
+ >
84
+ {props.isChecked && <CheckMark checkedColour={props.checkedColour} />}
85
+ </div>
86
+ </div>
87
+ );
88
+ };
@@ -0,0 +1,77 @@
1
+ .dropdownContent {
2
+ display: inline-block;
3
+ position: absolute;
4
+ top: 100%;
5
+ left: 0;
6
+ background-color: #fff;
7
+ border: 1px solid #e0e0e0;
8
+ border-radius: 4px;
9
+ height: 110px;
10
+ overflow: auto;
11
+ scrollbar-width: none;
12
+ box-shadow: 0px 8px 16px 0px rgba(0, 0, 0, 0.2);
13
+ z-index: 1000;
14
+ font-family: inherit;
15
+ margin-top: 4px;
16
+ min-width: 100px;
17
+ }
18
+
19
+ .dropdownContent a {
20
+ color: black;
21
+ padding: 12px 16px;
22
+ text-decoration: none;
23
+ border-bottom: 1px solid #e0e0e0;
24
+ display: block;
25
+ font-family: inherit;
26
+ }
27
+
28
+ .bikDropDownItem {
29
+ display: flex;
30
+ flex-direction: row;
31
+ align-items: center;
32
+ border-bottom: 1px solid #e0e0e0;
33
+ gap: 8px;
34
+ padding: 4px 20px;
35
+ font-family: inherit;
36
+ }
37
+
38
+ .bikDropDownItem:hover {
39
+ background-color: #edeef1;
40
+ cursor: pointer;
41
+ }
42
+
43
+ .bikStwCountryFlag {
44
+ width: 24px;
45
+ height: auto;
46
+ }
47
+
48
+ .bikStwH2 {
49
+ font-family: inherit;
50
+ font-style: normal;
51
+ font-weight: 400;
52
+ font-size: 12px;
53
+ line-height: 20px;
54
+ font-feature-settings:
55
+ 'tnum' on,
56
+ 'lnum' on,
57
+ 'case' on,
58
+ 'ss04' on;
59
+ color: #212121;
60
+ margin-bottom: 8px;
61
+ }
62
+
63
+ @media only screen and (max-width: 768px) {
64
+ .bikStwH2 {
65
+ font-size: 10px;
66
+ }
67
+
68
+ .bikStwCountryFlag {
69
+ width: 22px;
70
+ height: auto;
71
+ }
72
+
73
+ .bikDropDownItem {
74
+ gap: 8px;
75
+ padding: 3px 6px;
76
+ }
77
+ }
@@ -0,0 +1,81 @@
1
+ import React, { useContext, useEffect, useRef, useState } from 'react';
2
+ import { CountriesData } from '../../widgets/STW/utility';
3
+ import { STWContext } from '../../widgets/STW/context';
4
+
5
+ const CountriesDropDown: React.FC<{
6
+ onListItemClickHandle: (code: string, dial: string, code3: string) => void;
7
+ closeDropdown: () => void;
8
+ }> = ({ onListItemClickHandle, closeDropdown }) => {
9
+ const { preview } = useContext(STWContext);
10
+ const [currentStyle, setCurrentStyle] = useState<any>(null);
11
+ const wrapperRef = useRef(null);
12
+
13
+ const handleClickOutside = event => {
14
+ if (wrapperRef.current && !wrapperRef.current.contains(event.target)) {
15
+ closeDropdown();
16
+ }
17
+ };
18
+
19
+ useEffect(() => {
20
+ document.addEventListener('mousedown', handleClickOutside);
21
+
22
+ return () => {
23
+ document.removeEventListener('mousedown', handleClickOutside);
24
+ };
25
+ }, []);
26
+
27
+ useEffect(() => {
28
+ const importStyles = async () => {
29
+ let stylesModule;
30
+ if (!preview) {
31
+ stylesModule = await import('./countriesDropdown.module.css');
32
+ }
33
+ setCurrentStyle(stylesModule.default);
34
+ };
35
+ importStyles().then();
36
+ }, [preview]);
37
+
38
+ if (!currentStyle) {
39
+ return <></>;
40
+ }
41
+
42
+ return (
43
+ <>
44
+ <div
45
+ ref={wrapperRef}
46
+ id={currentStyle.bikStwMandWaDropdown}
47
+ className={currentStyle.dropdownContent}
48
+ style={{
49
+ overflowX: 'hidden',
50
+ overflowY: 'auto',
51
+ zIndex: 8,
52
+ borderRadius: '8px',
53
+ }}
54
+ >
55
+ <div>
56
+ {CountriesData.map(data => {
57
+ const flag = `https://flagcdn.com/${data.code.toLowerCase()}.svg`;
58
+ const code = data.dial;
59
+ return (
60
+ <div
61
+ key={data.dial}
62
+ onClick={() => {
63
+ onListItemClickHandle(data.code, data.dial, data.code3);
64
+ }}
65
+ >
66
+ <div className={currentStyle.bikDropDownItem}>
67
+ <img
68
+ className={currentStyle.bikStwCountryFlag}
69
+ src={`${flag}`}
70
+ />
71
+ <h2 className={currentStyle.bikStwH2}>{code}</h2>
72
+ </div>
73
+ </div>
74
+ );
75
+ })}
76
+ </div>
77
+ </div>
78
+ </>
79
+ );
80
+ };
81
+ export default CountriesDropDown;