@bikdotai/bik-widgets 1.0.0 → 1.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist-package/index.css +95 -0
- package/dist-package/index.js +2 -0
- package/package.json +17 -4
- package/.eslintrc +0 -22
- package/.eslintrc.js +0 -19
- package/.github/workflows/main.yml +0 -293
- package/.prettierignore +0 -13
- package/.prettierrc +0 -10
- package/cypress/apiHelper/endpoints.ts +0 -21
- package/cypress/apiHelper/executor.ts +0 -42
- package/cypress/e2e/bottomDrawer.cy.ts +0 -49
- package/cypress/e2e/directReward.cy.ts +0 -67
- package/cypress/e2e/scratchTheCard.cy.ts +0 -68
- package/cypress/e2e/stw.cy.ts +0 -82
- package/cypress/e2e/waRedirection.cy.ts +0 -46
- package/cypress/fixtures/payloads.ts +0 -330
- package/cypress/support/commands.ts +0 -37
- package/cypress/support/e2e.ts +0 -20
- package/cypress.staging.config.ts +0 -23
- package/jsconfig.json +0 -6
- package/localtest.sh +0 -10
- package/log-server.js +0 -86
- package/postcss.config.js +0 -8
- package/src/Globals.d.ts +0 -2
- package/src/assets/lottie/santa.json +0 -11722
- package/src/assets/svg/CalendarClockIcon.tsx +0 -30
- package/src/assets/svg/CalendarIcon.tsx +0 -24
- package/src/assets/svg/CheckIcon.tsx +0 -17
- package/src/assets/svg/ChevronIcon.tsx +0 -21
- package/src/assets/svg/Close.tsx +0 -39
- package/src/assets/svg/Confetti.tsx +0 -140
- package/src/assets/svg/Copy.tsx +0 -26
- package/src/assets/svg/DropdownCheckIcon.tsx +0 -35
- package/src/assets/svg/ErrorIcon.tsx +0 -27
- package/src/assets/svg/RadioIcon.tsx +0 -25
- package/src/assets/svg/UncheckedCheckboxIcon.tsx +0 -28
- package/src/assets/svg/UncheckedRadioIcon.tsx +0 -26
- package/src/assets/svg/info.tsx +0 -30
- package/src/assets/svg/qrcode.svg +0 -14
- package/src/bootstrap.tsx +0 -8
- package/src/components/CtaCard/index.tsx +0 -37
- package/src/components/CtaCard/preview.module.css +0 -32
- package/src/components/CtaCard/style.module.css +0 -32
- package/src/components/EmailInput/emailInputBox.tsx +0 -95
- package/src/components/Fab/index.tsx +0 -224
- package/src/components/Fab/preview.module.css +0 -28
- package/src/components/Fab/style.module.css +0 -37
- package/src/components/Icons/Call.tsx +0 -26
- package/src/components/Icons/Cross.tsx +0 -24
- package/src/components/Icons/Gmail.tsx +0 -61
- package/src/components/Icons/Instagram.tsx +0 -60
- package/src/components/Icons/LiveChat.tsx +0 -43
- package/src/components/Icons/Messenger.tsx +0 -57
- package/src/components/Icons/Send.tsx +0 -22
- package/src/components/Icons/Whatsapp.tsx +0 -24
- package/src/components/Shimmer/index.tsx +0 -12
- package/src/components/Shimmer/style.module.css +0 -37
- package/src/components/SmsInput/smsInputBox.tsx +0 -135
- package/src/components/UserDetailsV2/userDetailsV2.desktop.module.css +0 -52
- package/src/components/UserDetailsV2/userDetailsV2.mobile.module.css +0 -52
- package/src/components/UserDetailsV2/userDetailsV2.module.css +0 -81
- package/src/components/UserDetailsV2/userDetailsV2.tsx +0 -527
- package/src/components/WhatsappInput/Spinner.tsx +0 -26
- package/src/components/WhatsappInput/whatsappInput.module.css +0 -106
- package/src/components/WhatsappInput/whatsappInputBox.tsx +0 -155
- package/src/components/WhatsappInput/whatsappInputPreviewDesktop.module.css +0 -71
- package/src/components/WhatsappInput/whatsappInputPreviewMobile.module.css +0 -65
- package/src/components/checkbox/checkbox.module.css +0 -19
- package/src/components/checkbox/checkbox.tsx +0 -88
- package/src/components/countryCodePicker/countriesDropdown.module.css +0 -77
- package/src/components/countryCodePicker/countriesDropdown.tsx +0 -81
- package/src/components/couponDetails/coupon.module.css +0 -208
- package/src/components/couponDetails/coupon.tsx +0 -210
- package/src/components/couponDetails/couponPreviewDesktop.module.css +0 -158
- package/src/components/couponDetails/couponPreviewMobile.module.css +0 -164
- package/src/components/index.ts +0 -3
- package/src/components/inputComponents/Checkbox.module.css +0 -197
- package/src/components/inputComponents/Checkbox.tsx +0 -85
- package/src/components/inputComponents/DatePicker.module.css +0 -565
- package/src/components/inputComponents/DatePicker.tsx +0 -278
- package/src/components/inputComponents/Dropdown.module.css +0 -796
- package/src/components/inputComponents/Dropdown.tsx +0 -630
- package/src/components/inputComponents/InputBox.module.css +0 -401
- package/src/components/inputComponents/InputBox.tsx +0 -209
- package/src/components/selectedCountry/selectedCountry.module.css +0 -76
- package/src/components/selectedCountry/selectedCountry.tsx +0 -76
- package/src/components/selectedCountry/selectedCountryPreviewDesktop.module.css +0 -56
- package/src/components/selectedCountry/selectedCountryPreviewMobile.module.css +0 -57
- package/src/components/userDetailsForm/RenderCustomFields.tsx +0 -333
- package/src/components/userDetailsForm/userDetailsForm.tsx +0 -675
- package/src/hooks/index.ts +0 -4
- package/src/hooks/useExitIntent.ts +0 -452
- package/src/hooks/useIsMobile.tsx +0 -21
- package/src/hooks/useMessageEvent.ts +0 -8
- package/src/hooks/useTriggeredIntentDetails.ts +0 -43
- package/src/hooks/useUrlListerner.ts +0 -30
- package/src/hooks/useWebSocketLogger.ts +0 -59
- package/src/hooks/useWindowEvent.ts +0 -8
- package/src/icons/copyIcon.tsx +0 -26
- package/src/icons/crossIconDesktop.tsx +0 -20
- package/src/icons/crossIconMobile.tsx +0 -20
- package/src/index.html +0 -30
- package/src/index.ts +0 -32
- package/src/index.tsx +0 -1
- package/src/repo/widgetRepo.ts +0 -21
- package/src/types/customFields.ts +0 -73
- package/src/utilities/cookie.ts +0 -70
- package/src/utilities/customFieldTypeMapping.ts +0 -67
- package/src/utilities/customFieldValidation.ts +0 -201
- package/src/utilities/encryption.ts +0 -21
- package/src/utilities/exitIntentUtils.ts +0 -31
- package/src/utilities/global.css +0 -11
- package/src/utilities/languageUtilities.ts +0 -235
- package/src/utilities/localRunner.js +0 -26
- package/src/utilities/localRunner.ts +0 -27
- package/src/utilities/localStorage.ts +0 -40
- package/src/utilities/script.tsx +0 -15
- package/src/utilities/stringUtils.ts +0 -5
- package/src/utilities/styleUtils.ts +0 -134
- package/src/utilities/variables.ts +0 -11
- package/src/utilities/widgetUtils.js +0 -342
- package/src/utilities/widgetUtils.ts +0 -313
- package/src/widgets/BottomDrawer/config.ts +0 -41
- package/src/widgets/BottomDrawer/index.tsx +0 -116
- package/src/widgets/BottomDrawer/modal.tsx +0 -286
- package/src/widgets/BottomDrawer/preview.module.css +0 -122
- package/src/widgets/BottomDrawer/previewMobile.module.css +0 -124
- package/src/widgets/BottomDrawer/style.module.css +0 -279
- package/src/widgets/CaptivateBanner/captivateBanner.tsx +0 -200
- package/src/widgets/CaptivateBanner/config.ts +0 -72
- package/src/widgets/CaptivateBanner/index.tsx +0 -204
- package/src/widgets/CaptivateBanner/previewDesktop.module.css +0 -51
- package/src/widgets/CaptivateBanner/previewMobile.module.css +0 -51
- package/src/widgets/CaptivateBanner/style.module.css +0 -77
- package/src/widgets/CaptivateBanner/utils.ts +0 -104
- package/src/widgets/CentrallyAlignedPopup/config.ts +0 -42
- package/src/widgets/CentrallyAlignedPopup/index.tsx +0 -109
- package/src/widgets/CentrallyAlignedPopup/modal.tsx +0 -269
- package/src/widgets/CentrallyAlignedPopup/preview.module.css +0 -153
- package/src/widgets/CentrallyAlignedPopup/previewMobile.module.css +0 -153
- package/src/widgets/CentrallyAlignedPopup/style.module.css +0 -283
- package/src/widgets/DirectReward/components/couponDetails.tsx +0 -265
- package/src/widgets/DirectReward/components/userDetails.tsx +0 -117
- package/src/widgets/DirectReward/config.ts +0 -186
- package/src/widgets/DirectReward/directReward.tsx +0 -350
- package/src/widgets/DirectReward/index.tsx +0 -579
- package/src/widgets/DirectReward/previewStyles/thankYouPreviewDesktop.module.css +0 -276
- package/src/widgets/DirectReward/previewStyles/thankYouPreviewMobile.module.css +0 -303
- package/src/widgets/DirectReward/previewStyles/userDetailsPreviewDesktop.module.css +0 -511
- package/src/widgets/DirectReward/previewStyles/userDetailsPreviewMobile.module.css +0 -462
- package/src/widgets/DirectReward/style.module.css +0 -836
- package/src/widgets/ExitIntentHook.tsx +0 -28
- package/src/widgets/STW/api.ts +0 -70
- package/src/widgets/STW/components/svgFactory.tsx +0 -44
- package/src/widgets/STW/config.ts +0 -193
- package/src/widgets/STW/context.ts +0 -7
- package/src/widgets/STW/couponDetails.tsx +0 -121
- package/src/widgets/STW/index.tsx +0 -733
- package/src/widgets/STW/previewStyles/thankyouPreviewDesktop.module.css +0 -215
- package/src/widgets/STW/previewStyles/thankyouPreviewMobile.module.css +0 -205
- package/src/widgets/STW/previewStyles/userInputsPreviewDesktop.module.css +0 -732
- package/src/widgets/STW/previewStyles/userInputsPreviewMobile.module.css +0 -661
- package/src/widgets/STW/previewStyles/wheelPreviewDesktop.module.css +0 -498
- package/src/widgets/STW/previewStyles/wheelPreviewMobile.module.css +0 -497
- package/src/widgets/STW/stw1.tsx +0 -119
- package/src/widgets/STW/stw2Components/wheelDesign.tsx +0 -183
- package/src/widgets/STW/stw2Pages/couponDetails.tsx +0 -72
- package/src/widgets/STW/stw2Pages/stw2.tsx +0 -212
- package/src/widgets/STW/stw2Pages/style.module.css +0 -1226
- package/src/widgets/STW/stw2Pages/userDetails.tsx +0 -86
- package/src/widgets/STW/stw2Pages/wheel.tsx +0 -117
- package/src/widgets/STW/stw2PreviewStyles/thankyouPreviewDesktop.module.css +0 -835
- package/src/widgets/STW/stw2PreviewStyles/thankyouPreviewMobile.module.css +0 -787
- package/src/widgets/STW/stw2PreviewStyles/userInputsPreviewDesktop.module.css +0 -867
- package/src/widgets/STW/stw2PreviewStyles/userInputsPreviewMobile.module.css +0 -798
- package/src/widgets/STW/stw2PreviewStyles/wheelPreviewDesktop.module.css +0 -572
- package/src/widgets/STW/stw2PreviewStyles/wheelPreviewMobile.module.css +0 -559
- package/src/widgets/STW/style.module.css +0 -901
- package/src/widgets/STW/userDetails.tsx +0 -150
- package/src/widgets/STW/utility.ts +0 -664
- package/src/widgets/STW/wheel.tsx +0 -304
- package/src/widgets/ScratchCard/ScratchOff/scratchOff.tsx +0 -157
- package/src/widgets/ScratchCard/config.ts +0 -152
- package/src/widgets/ScratchCard/globalStyle.module.css +0 -931
- package/src/widgets/ScratchCard/index.tsx +0 -546
- package/src/widgets/ScratchCard/modal.tsx +0 -225
- package/src/widgets/ScratchCard/preview.module.css +0 -250
- package/src/widgets/ScratchCard/previewMobile.module.css +0 -247
- package/src/widgets/ScratchCard/previewStyles/userDetailsPreviewDesktop.module.css +0 -537
- package/src/widgets/ScratchCard/previewStyles/userDetailsPreviewMobile.module.css +0 -463
- package/src/widgets/ScratchCard/style.module.css +0 -220
- package/src/widgets/ShopifyForm/config.ts +0 -168
- package/src/widgets/ShopifyForm/index.tsx +0 -214
- package/src/widgets/ShopifyForm/previewDesktop.module.css +0 -117
- package/src/widgets/ShopifyForm/previewMobile.module.css +0 -131
- package/src/widgets/ShopifyForm/shopifyForm.tsx +0 -445
- package/src/widgets/ShopifyForm/style.module.css +0 -161
- package/src/widgets/SingleButtonRedirection/config.ts +0 -47
- package/src/widgets/SingleButtonRedirection/index.tsx +0 -121
- package/src/widgets/WebStories/config.ts +0 -105
- package/src/widgets/WebStories/index.css +0 -3
- package/src/widgets/WebStories/index.tsx +0 -282
- package/src/widgets/WebStories/style.module.css +0 -26
- package/src/widgets/index.tsx +0 -3
- package/src/widgets/utility.ts +0 -31
- package/tsconfig.json +0 -12
- package/webpack.config.js +0 -239
package/src/index.html
DELETED
|
@@ -1,30 +0,0 @@
|
|
|
1
|
-
<!doctype html>
|
|
2
|
-
<html lang="en">
|
|
3
|
-
<head>
|
|
4
|
-
<style></style>
|
|
5
|
-
<meta charset="utf-8" />
|
|
6
|
-
<meta
|
|
7
|
-
name="viewport"
|
|
8
|
-
content="width=device-width, initial-scale=1, shrink-to-fit=no, maximum-scale=1"
|
|
9
|
-
/>
|
|
10
|
-
<meta name="theme-color" content="#000000" />
|
|
11
|
-
<title>Bik widgets dev</title>
|
|
12
|
-
<script
|
|
13
|
-
type="text/javascript"
|
|
14
|
-
async
|
|
15
|
-
href="https://api.staging.bik.ai/bik-widgets/bap/sumesh/vendor.js"
|
|
16
|
-
></script>
|
|
17
|
-
<script
|
|
18
|
-
type="text/javascript"
|
|
19
|
-
async
|
|
20
|
-
href="https://api.staging.bik.ai/bik-widgets/bap/sumesh/singleButtonRedirection.js"
|
|
21
|
-
></script>
|
|
22
|
-
</head>
|
|
23
|
-
|
|
24
|
-
<body>
|
|
25
|
-
<noscript> You need to enable JavaScript to run this app. </noscript>
|
|
26
|
-
<div id="root">
|
|
27
|
-
<!-- This div is where our app will run -->
|
|
28
|
-
</div>
|
|
29
|
-
</body>
|
|
30
|
-
</html>
|
package/src/index.ts
DELETED
|
@@ -1,32 +0,0 @@
|
|
|
1
|
-
export { default as Fab } from './components/Fab';
|
|
2
|
-
export type { IFab } from './components/Fab';
|
|
3
|
-
export { IconSvg } from './components/Fab';
|
|
4
|
-
|
|
5
|
-
export { default as CentrallyAlignedModal } from './widgets/CentrallyAlignedPopup/modal';
|
|
6
|
-
export type { ICentrallyAlignedModal } from './widgets/CentrallyAlignedPopup/modal';
|
|
7
|
-
|
|
8
|
-
export { default as BottomDrawerModal } from './widgets/BottomDrawer/modal';
|
|
9
|
-
export type { IBottomDrawerModal } from './widgets/BottomDrawer/modal';
|
|
10
|
-
|
|
11
|
-
export { default as SingleButtonRedirection } from './widgets/SingleButtonRedirection';
|
|
12
|
-
export type { ISingleButtonRedirection } from './widgets/SingleButtonRedirection';
|
|
13
|
-
|
|
14
|
-
export { default as Wheel } from './widgets/STW/wheel';
|
|
15
|
-
|
|
16
|
-
// STW user details screen (aka "UserInputs" in MF exposes)
|
|
17
|
-
export { default as UserInputs } from './widgets/STW/userDetails';
|
|
18
|
-
export type { IUserInputs, IPhoneInput, IEmailInput } from './widgets/STW/userDetails';
|
|
19
|
-
|
|
20
|
-
export { default as CouponDetails } from './widgets/STW/couponDetails';
|
|
21
|
-
|
|
22
|
-
export { default as STW2 } from './widgets/STW/stw2Pages/stw2';
|
|
23
|
-
|
|
24
|
-
export { default as ScratchCardModal } from './widgets/ScratchCard/modal';
|
|
25
|
-
export type { IScratchCardModal } from './widgets/ScratchCard/modal';
|
|
26
|
-
|
|
27
|
-
export { default as DirectReward } from './widgets/DirectReward/directReward';
|
|
28
|
-
|
|
29
|
-
export { default as CaptivateBanner } from './widgets/CaptivateBanner/captivateBanner';
|
|
30
|
-
|
|
31
|
-
export { default as ShopifyForm } from './widgets/ShopifyForm/shopifyForm';
|
|
32
|
-
export { SCREENS } from './widgets/ShopifyForm/shopifyForm';
|
package/src/index.tsx
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import('./bootstrap');
|
package/src/repo/widgetRepo.ts
DELETED
|
@@ -1,21 +0,0 @@
|
|
|
1
|
-
export class WidgetRepo {
|
|
2
|
-
async sendWidgetEvent(
|
|
3
|
-
event: string,
|
|
4
|
-
env: string,
|
|
5
|
-
widgetId: string,
|
|
6
|
-
eventProperties?: {},
|
|
7
|
-
) {
|
|
8
|
-
fetch(`${env}/publicApiFunctions-sendWidgetEvent`, {
|
|
9
|
-
method: 'POST',
|
|
10
|
-
headers: {
|
|
11
|
-
Accept: 'application/json',
|
|
12
|
-
'Content-Type': 'application/json',
|
|
13
|
-
},
|
|
14
|
-
body: JSON.stringify({
|
|
15
|
-
widgetId: widgetId,
|
|
16
|
-
event,
|
|
17
|
-
eventProperties,
|
|
18
|
-
}),
|
|
19
|
-
}).then();
|
|
20
|
-
}
|
|
21
|
-
}
|
|
@@ -1,73 +0,0 @@
|
|
|
1
|
-
export interface CustomField {
|
|
2
|
-
id: number;
|
|
3
|
-
storeId: string;
|
|
4
|
-
fieldName: string;
|
|
5
|
-
fieldType:
|
|
6
|
-
| 'single_line'
|
|
7
|
-
| 'multi_line'
|
|
8
|
-
| 'number'
|
|
9
|
-
| 'checkbox'
|
|
10
|
-
| 'date'
|
|
11
|
-
| 'date_time'
|
|
12
|
-
| 'dropdown'
|
|
13
|
-
| 'multiselect_dropdown';
|
|
14
|
-
options: string[];
|
|
15
|
-
}
|
|
16
|
-
|
|
17
|
-
export interface CustomFieldsConfig {
|
|
18
|
-
mandatory: CustomField[];
|
|
19
|
-
optional: CustomField[];
|
|
20
|
-
}
|
|
21
|
-
|
|
22
|
-
export type CustomFieldValue = string | string[] | boolean | number | null;
|
|
23
|
-
|
|
24
|
-
export interface CustomFieldsData {
|
|
25
|
-
[fieldId: number]: CustomFieldValue;
|
|
26
|
-
}
|
|
27
|
-
|
|
28
|
-
export interface CustomFieldError {
|
|
29
|
-
[fieldId: number]: string | null;
|
|
30
|
-
}
|
|
31
|
-
|
|
32
|
-
export interface UserFieldDetails {
|
|
33
|
-
value: string | null | boolean;
|
|
34
|
-
countryCodeData?: {
|
|
35
|
-
dial: string;
|
|
36
|
-
code: string;
|
|
37
|
-
code3: string;
|
|
38
|
-
};
|
|
39
|
-
showComponent?: boolean;
|
|
40
|
-
error: string | null;
|
|
41
|
-
}
|
|
42
|
-
|
|
43
|
-
export interface UserFields {
|
|
44
|
-
isWhatsapp: UserFieldDetails;
|
|
45
|
-
isSms: UserFieldDetails;
|
|
46
|
-
isEmail: UserFieldDetails;
|
|
47
|
-
isPolicyChecked: UserFieldDetails;
|
|
48
|
-
customFields?: CustomFieldsData;
|
|
49
|
-
}
|
|
50
|
-
|
|
51
|
-
// Validation types
|
|
52
|
-
export interface CustomFieldValidationResult {
|
|
53
|
-
isValid: boolean;
|
|
54
|
-
errors: CustomFieldError;
|
|
55
|
-
}
|
|
56
|
-
|
|
57
|
-
export enum LEAD_GENERATION_CHANNELS {
|
|
58
|
-
EMAIL = 'email',
|
|
59
|
-
SMS = 'sms',
|
|
60
|
-
WHATSAPP = 'whatsapp',
|
|
61
|
-
}
|
|
62
|
-
|
|
63
|
-
// Form submission payload types
|
|
64
|
-
export interface ChannelInfo {
|
|
65
|
-
channel: LEAD_GENERATION_CHANNELS & 'customFields';
|
|
66
|
-
value: string | boolean | number;
|
|
67
|
-
customFieldId?: number;
|
|
68
|
-
}
|
|
69
|
-
|
|
70
|
-
export interface FormSubmissionPayload {
|
|
71
|
-
primaryInfo: ChannelInfo[];
|
|
72
|
-
secondaryInfo: ChannelInfo[];
|
|
73
|
-
}
|
package/src/utilities/cookie.ts
DELETED
|
@@ -1,70 +0,0 @@
|
|
|
1
|
-
import { WidgetRepo } from '../repo/widgetRepo';
|
|
2
|
-
|
|
3
|
-
export class CookieUtils {
|
|
4
|
-
widgetRepo: WidgetRepo;
|
|
5
|
-
d = new Date();
|
|
6
|
-
|
|
7
|
-
constructor() {
|
|
8
|
-
this.widgetRepo = new WidgetRepo();
|
|
9
|
-
}
|
|
10
|
-
|
|
11
|
-
setCookie(cname: string, cvalue: string, exdays: number) {
|
|
12
|
-
this.d.setTime(this.d.getTime() + exdays * 24 * 60 * 60 * 1000);
|
|
13
|
-
let expires = 'expires=' + this.d.toUTCString();
|
|
14
|
-
document.cookie = cname + '=' + cvalue + ';' + expires + ';path=/';
|
|
15
|
-
}
|
|
16
|
-
|
|
17
|
-
getCookie(name) {
|
|
18
|
-
let cookies;
|
|
19
|
-
cookies = document.cookie
|
|
20
|
-
.split(';')
|
|
21
|
-
.map(cookie => cookie.split('='))
|
|
22
|
-
.reduce(
|
|
23
|
-
(accumulator, [key, value]) => ({
|
|
24
|
-
...accumulator,
|
|
25
|
-
[key.trim()]: decodeURIComponent(value),
|
|
26
|
-
}),
|
|
27
|
-
{},
|
|
28
|
-
);
|
|
29
|
-
return cookies[name];
|
|
30
|
-
}
|
|
31
|
-
|
|
32
|
-
cookieProcessor(
|
|
33
|
-
cookieName,
|
|
34
|
-
cookieValue,
|
|
35
|
-
eventName,
|
|
36
|
-
expiry,
|
|
37
|
-
env,
|
|
38
|
-
id,
|
|
39
|
-
eventProperties?: any,
|
|
40
|
-
) {
|
|
41
|
-
this.setCookie(cookieName, cookieValue, expiry);
|
|
42
|
-
this.widgetRepo.sendWidgetEvent(eventName, env, id, eventProperties).then();
|
|
43
|
-
}
|
|
44
|
-
|
|
45
|
-
cookieClickHandler(
|
|
46
|
-
cookieName,
|
|
47
|
-
cookieValue,
|
|
48
|
-
eventN,
|
|
49
|
-
exDay,
|
|
50
|
-
env,
|
|
51
|
-
id,
|
|
52
|
-
eventProperties?: any,
|
|
53
|
-
) {
|
|
54
|
-
if (this.getCookie(cookieName) !== cookieValue) {
|
|
55
|
-
this.cookieProcessor(
|
|
56
|
-
cookieName,
|
|
57
|
-
cookieValue,
|
|
58
|
-
eventN,
|
|
59
|
-
exDay,
|
|
60
|
-
env,
|
|
61
|
-
id,
|
|
62
|
-
eventProperties,
|
|
63
|
-
);
|
|
64
|
-
}
|
|
65
|
-
}
|
|
66
|
-
|
|
67
|
-
addItemInLocalStorage(key, value) {
|
|
68
|
-
localStorage.setItem(key, JSON.stringify(value));
|
|
69
|
-
}
|
|
70
|
-
}
|
|
@@ -1,67 +0,0 @@
|
|
|
1
|
-
import { CustomField } from '../types/customFields';
|
|
2
|
-
|
|
3
|
-
export const CUSTOM_FIELDS = 'customFields';
|
|
4
|
-
|
|
5
|
-
export interface CustomFieldsI {
|
|
6
|
-
id: number;
|
|
7
|
-
storeId: string;
|
|
8
|
-
fieldName: string;
|
|
9
|
-
aliasName?: string;
|
|
10
|
-
dataType?: string;
|
|
11
|
-
fieldType: string;
|
|
12
|
-
options: string[];
|
|
13
|
-
isVisible?: boolean;
|
|
14
|
-
createdAt?: string;
|
|
15
|
-
updatedAt?: string;
|
|
16
|
-
}
|
|
17
|
-
|
|
18
|
-
export const mapCustomFields = (
|
|
19
|
-
customFields: (CustomFieldsI | Record<string, unknown>)[] | undefined,
|
|
20
|
-
): CustomField[] => {
|
|
21
|
-
if (!customFields || !Array.isArray(customFields)) {
|
|
22
|
-
return [];
|
|
23
|
-
}
|
|
24
|
-
|
|
25
|
-
return customFields.map((field: CustomFieldsI | Record<string, unknown>) => {
|
|
26
|
-
return {
|
|
27
|
-
id: field.id as number,
|
|
28
|
-
storeId: field.storeId as string,
|
|
29
|
-
fieldName: field.fieldName as string,
|
|
30
|
-
fieldType: field.fieldType as CustomField['fieldType'],
|
|
31
|
-
options: (field.options as string[]) || [],
|
|
32
|
-
};
|
|
33
|
-
});
|
|
34
|
-
};
|
|
35
|
-
|
|
36
|
-
export const isCustomField = (field: unknown): field is CustomField => {
|
|
37
|
-
return (
|
|
38
|
-
field &&
|
|
39
|
-
typeof field === 'object' &&
|
|
40
|
-
typeof (field as Record<string, unknown>).id === 'number' &&
|
|
41
|
-
typeof (field as Record<string, unknown>).storeId === 'string' &&
|
|
42
|
-
typeof (field as Record<string, unknown>).fieldName === 'string' &&
|
|
43
|
-
typeof (field as Record<string, unknown>).fieldType === 'string' &&
|
|
44
|
-
Array.isArray((field as Record<string, unknown>).options)
|
|
45
|
-
);
|
|
46
|
-
};
|
|
47
|
-
|
|
48
|
-
export const areCustomFields = (fields: unknown[]): fields is CustomField[] => {
|
|
49
|
-
return Array.isArray(fields) && fields.every(isCustomField);
|
|
50
|
-
};
|
|
51
|
-
|
|
52
|
-
export const getCustomFieldsFromConfig = (
|
|
53
|
-
config: Record<string, unknown>,
|
|
54
|
-
type: 'mandatory' | 'optional',
|
|
55
|
-
): CustomField[] => {
|
|
56
|
-
let fields;
|
|
57
|
-
|
|
58
|
-
if (type === 'mandatory') {
|
|
59
|
-
fields = (config?.mandatoryOption as Record<string, unknown>)?.customFields;
|
|
60
|
-
} else {
|
|
61
|
-
fields = (config?.optionalOptions as Record<string, unknown>)?.customFields;
|
|
62
|
-
}
|
|
63
|
-
|
|
64
|
-
return mapCustomFields(
|
|
65
|
-
fields as (CustomFieldsI | Record<string, unknown>)[] | undefined,
|
|
66
|
-
);
|
|
67
|
-
};
|
|
@@ -1,201 +0,0 @@
|
|
|
1
|
-
import {
|
|
2
|
-
CustomField,
|
|
3
|
-
CustomFieldsData,
|
|
4
|
-
CustomFieldError,
|
|
5
|
-
CustomFieldValidationResult,
|
|
6
|
-
CustomFieldValue,
|
|
7
|
-
} from '../types/customFields';
|
|
8
|
-
|
|
9
|
-
export const validateField = (
|
|
10
|
-
field: CustomField,
|
|
11
|
-
value: CustomFieldValue,
|
|
12
|
-
isRequired: boolean,
|
|
13
|
-
): string | null => {
|
|
14
|
-
if (field.fieldType === 'checkbox') {
|
|
15
|
-
return null;
|
|
16
|
-
}
|
|
17
|
-
|
|
18
|
-
if (isRequired) {
|
|
19
|
-
if (
|
|
20
|
-
value === null ||
|
|
21
|
-
value === undefined ||
|
|
22
|
-
(typeof value === 'string' && value.trim() === '') ||
|
|
23
|
-
(Array.isArray(value) && value.length === 0)
|
|
24
|
-
) {
|
|
25
|
-
return `${field.fieldName} is required`;
|
|
26
|
-
}
|
|
27
|
-
}
|
|
28
|
-
|
|
29
|
-
switch (field.fieldType) {
|
|
30
|
-
case 'number': {
|
|
31
|
-
const numValue = Number(value);
|
|
32
|
-
if (isNaN(numValue)) {
|
|
33
|
-
return `${field.fieldName} must be a valid number`;
|
|
34
|
-
}
|
|
35
|
-
break;
|
|
36
|
-
}
|
|
37
|
-
|
|
38
|
-
case 'single_line':
|
|
39
|
-
if (typeof value === 'string' && value.length > 50) {
|
|
40
|
-
return `${field.fieldName} must be 50 characters or less`;
|
|
41
|
-
}
|
|
42
|
-
break;
|
|
43
|
-
|
|
44
|
-
case 'multi_line':
|
|
45
|
-
if (typeof value === 'string' && value.length > 500) {
|
|
46
|
-
return `${field.fieldName} must be 500 characters or less`;
|
|
47
|
-
}
|
|
48
|
-
break;
|
|
49
|
-
|
|
50
|
-
case 'dropdown':
|
|
51
|
-
if (value && !field.options.includes(value as string)) {
|
|
52
|
-
return `${field.fieldName} must be one of the available options`;
|
|
53
|
-
}
|
|
54
|
-
break;
|
|
55
|
-
|
|
56
|
-
case 'multiselect_dropdown':
|
|
57
|
-
if (Array.isArray(value)) {
|
|
58
|
-
const invalidOptions = value.filter(v => !field.options.includes(v));
|
|
59
|
-
if (invalidOptions.length > 0) {
|
|
60
|
-
return `${field.fieldName} contains invalid options`;
|
|
61
|
-
}
|
|
62
|
-
}
|
|
63
|
-
break;
|
|
64
|
-
|
|
65
|
-
case 'date':
|
|
66
|
-
case 'date_time':
|
|
67
|
-
if (value && typeof value === 'string') {
|
|
68
|
-
const date = new Date(value);
|
|
69
|
-
if (isNaN(date.getTime())) {
|
|
70
|
-
return `${field.fieldName} must be a valid date`;
|
|
71
|
-
}
|
|
72
|
-
}
|
|
73
|
-
break;
|
|
74
|
-
}
|
|
75
|
-
return null;
|
|
76
|
-
};
|
|
77
|
-
|
|
78
|
-
export const validateCustomFields = (
|
|
79
|
-
mandatoryFields: CustomField[],
|
|
80
|
-
optionalFields: CustomField[],
|
|
81
|
-
customFieldsData: CustomFieldsData = {},
|
|
82
|
-
): CustomFieldValidationResult => {
|
|
83
|
-
const errors: CustomFieldError = {};
|
|
84
|
-
let isValid = true;
|
|
85
|
-
|
|
86
|
-
mandatoryFields.forEach(field => {
|
|
87
|
-
const error = validateField(field, customFieldsData[field.id], true);
|
|
88
|
-
if (error) {
|
|
89
|
-
errors[field.id] = error;
|
|
90
|
-
isValid = false;
|
|
91
|
-
}
|
|
92
|
-
});
|
|
93
|
-
|
|
94
|
-
optionalFields.forEach(field => {
|
|
95
|
-
const value = customFieldsData[field.id];
|
|
96
|
-
if (value !== null && value !== undefined && value !== '') {
|
|
97
|
-
const error = validateField(field, value, false);
|
|
98
|
-
if (error) {
|
|
99
|
-
errors[field.id] = error;
|
|
100
|
-
isValid = false;
|
|
101
|
-
}
|
|
102
|
-
}
|
|
103
|
-
});
|
|
104
|
-
|
|
105
|
-
return { isValid, errors };
|
|
106
|
-
};
|
|
107
|
-
|
|
108
|
-
export const getFieldTypeErrorMessage = (fieldType: string): string => {
|
|
109
|
-
const messages = {
|
|
110
|
-
single_line: 'Please enter valid text',
|
|
111
|
-
multi_line: 'Please enter valid text',
|
|
112
|
-
number: 'Please enter a valid number',
|
|
113
|
-
checkbox: 'Please check this field',
|
|
114
|
-
date: 'Please enter a valid date',
|
|
115
|
-
date_time: 'Please enter a valid date and time',
|
|
116
|
-
dropdown: 'Please select an option',
|
|
117
|
-
multiselect_dropdown: 'Please select at least one option',
|
|
118
|
-
};
|
|
119
|
-
|
|
120
|
-
return messages[fieldType] || 'Please enter a valid value';
|
|
121
|
-
};
|
|
122
|
-
|
|
123
|
-
export const sanitizeValue = (
|
|
124
|
-
field: CustomField,
|
|
125
|
-
value: CustomFieldValue,
|
|
126
|
-
): CustomFieldValue => {
|
|
127
|
-
switch (field.fieldType) {
|
|
128
|
-
case 'single_line':
|
|
129
|
-
case 'multi_line':
|
|
130
|
-
return typeof value === 'string' ? value.trim() : '';
|
|
131
|
-
|
|
132
|
-
case 'number': {
|
|
133
|
-
if (value === '' || value === null || value === undefined) {
|
|
134
|
-
return null;
|
|
135
|
-
}
|
|
136
|
-
const numValue = Number(value);
|
|
137
|
-
return isNaN(numValue) ? null : numValue;
|
|
138
|
-
}
|
|
139
|
-
|
|
140
|
-
case 'checkbox':
|
|
141
|
-
return Boolean(value);
|
|
142
|
-
|
|
143
|
-
case 'dropdown':
|
|
144
|
-
return typeof value === 'string' ? value : null;
|
|
145
|
-
|
|
146
|
-
case 'multiselect_dropdown':
|
|
147
|
-
return Array.isArray(value) ? value : [];
|
|
148
|
-
|
|
149
|
-
case 'date':
|
|
150
|
-
case 'date_time':
|
|
151
|
-
return typeof value === 'string' ? value : '';
|
|
152
|
-
|
|
153
|
-
default:
|
|
154
|
-
return value;
|
|
155
|
-
}
|
|
156
|
-
};
|
|
157
|
-
|
|
158
|
-
export const getDefaultCustomFieldValue = (
|
|
159
|
-
fieldType: string,
|
|
160
|
-
): CustomFieldValue => {
|
|
161
|
-
switch (fieldType) {
|
|
162
|
-
case 'checkbox':
|
|
163
|
-
return false;
|
|
164
|
-
case 'multiselect_dropdown':
|
|
165
|
-
return [];
|
|
166
|
-
case 'number':
|
|
167
|
-
return null;
|
|
168
|
-
default:
|
|
169
|
-
return '';
|
|
170
|
-
}
|
|
171
|
-
};
|
|
172
|
-
|
|
173
|
-
export const formatCustomFieldValue = (
|
|
174
|
-
field: CustomField,
|
|
175
|
-
value: CustomFieldValue,
|
|
176
|
-
): string => {
|
|
177
|
-
if (value === null || value === undefined) {
|
|
178
|
-
return '';
|
|
179
|
-
}
|
|
180
|
-
|
|
181
|
-
switch (field.fieldType) {
|
|
182
|
-
case 'checkbox':
|
|
183
|
-
return value ? 'Yes' : 'No';
|
|
184
|
-
case 'multiselect_dropdown':
|
|
185
|
-
return Array.isArray(value) ? value.join(', ') : '';
|
|
186
|
-
case 'date':
|
|
187
|
-
if (typeof value === 'string' && value) {
|
|
188
|
-
const date = new Date(value);
|
|
189
|
-
return date.toLocaleDateString();
|
|
190
|
-
}
|
|
191
|
-
return '';
|
|
192
|
-
case 'date_time':
|
|
193
|
-
if (typeof value === 'string' && value) {
|
|
194
|
-
const date = new Date(value);
|
|
195
|
-
return date.toLocaleString();
|
|
196
|
-
}
|
|
197
|
-
return '';
|
|
198
|
-
default:
|
|
199
|
-
return String(value);
|
|
200
|
-
}
|
|
201
|
-
};
|
|
@@ -1,21 +0,0 @@
|
|
|
1
|
-
export function encryptBikData(data: string) {
|
|
2
|
-
const key = 'phaedrus';
|
|
3
|
-
let encryptedData = '';
|
|
4
|
-
for (let i = 0; i < data.length; i++) {
|
|
5
|
-
encryptedData += String.fromCharCode(
|
|
6
|
-
data.charCodeAt(i) ^ key.charCodeAt(i % key.length),
|
|
7
|
-
);
|
|
8
|
-
}
|
|
9
|
-
return encryptedData;
|
|
10
|
-
}
|
|
11
|
-
|
|
12
|
-
export function decryptBikData(encryptedData: string) {
|
|
13
|
-
const key = 'phaedrus';
|
|
14
|
-
let decryptedData = '';
|
|
15
|
-
for (let i = 0; i < encryptedData.length; i++) {
|
|
16
|
-
decryptedData += String.fromCharCode(
|
|
17
|
-
encryptedData.charCodeAt(i) ^ key.charCodeAt(i % key.length),
|
|
18
|
-
);
|
|
19
|
-
}
|
|
20
|
-
return decryptedData;
|
|
21
|
-
}
|
|
@@ -1,31 +0,0 @@
|
|
|
1
|
-
interface ExitIntentTriggers {
|
|
2
|
-
exitIntentFastUpScroll?: boolean | null;
|
|
3
|
-
exitIntentTimeDelay?: number | null;
|
|
4
|
-
}
|
|
5
|
-
|
|
6
|
-
interface ShouldShowExitIntentProps {
|
|
7
|
-
visiblePages: string[];
|
|
8
|
-
currentLocation: string;
|
|
9
|
-
currentPathname: string;
|
|
10
|
-
isMobileDevice: boolean;
|
|
11
|
-
triggers: ExitIntentTriggers;
|
|
12
|
-
}
|
|
13
|
-
|
|
14
|
-
export const shouldShowExitIntent = ({
|
|
15
|
-
visiblePages,
|
|
16
|
-
currentLocation,
|
|
17
|
-
currentPathname,
|
|
18
|
-
isMobileDevice,
|
|
19
|
-
triggers,
|
|
20
|
-
}: ShouldShowExitIntentProps): boolean => {
|
|
21
|
-
const isPageVisible =
|
|
22
|
-
visiblePages.includes('/*') ||
|
|
23
|
-
visiblePages.includes(currentLocation) ||
|
|
24
|
-
visiblePages.some(page => currentPathname.startsWith(page));
|
|
25
|
-
|
|
26
|
-
const hasTriggerConditions =
|
|
27
|
-
(isMobileDevice && triggers?.exitIntentFastUpScroll) ||
|
|
28
|
-
Boolean(triggers?.exitIntentTimeDelay);
|
|
29
|
-
|
|
30
|
-
return isPageVisible && hasTriggerConditions;
|
|
31
|
-
};
|