@fynd-design-engineering/fynd-one-v2 2.2.11 → 3.0.1
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/analytics/debug.js +153 -1
- package/dist/analytics/form-success.js +74 -1
- package/dist/analytics/main.js +98 -1
- package/dist/analytics/main.js.map +2 -2
- package/dist/navigation/desktop/index.js.map +1 -1
- package/dist/posthog/main.js +1 -0
- package/dist/posthog/main.js.map +7 -0
- package/dist/tracking/form-tracker.js +1 -0
- package/dist/tracking/form-tracker.js.map +7 -0
- package/dist/tracking/user-journey.js +1 -1
- package/dist/tracking/user-journey.js.map +2 -2
- package/package.json +1 -1
package/dist/analytics/debug.js
CHANGED
|
@@ -1 +1,153 @@
|
|
|
1
|
-
"use strict";
|
|
1
|
+
"use strict";
|
|
2
|
+
(() => {
|
|
3
|
+
// bin/live-reload.js
|
|
4
|
+
if (window.location.hostname === "localhost" || window.location.hostname === "127.0.0.1") {
|
|
5
|
+
new EventSource(`${"http://localhost:3000"}/esbuild`).addEventListener(
|
|
6
|
+
"change",
|
|
7
|
+
() => location.reload()
|
|
8
|
+
);
|
|
9
|
+
} else {
|
|
10
|
+
console.log("Live reload disabled: not running on localhost");
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
// src/analytics/debug.ts
|
|
14
|
+
var trackEvent = (eventName, properties, gaEventName) => {
|
|
15
|
+
console.log("\u{1F50D} Tracking Event:", eventName);
|
|
16
|
+
console.log("\u{1F4CA} Properties:", properties);
|
|
17
|
+
if (window.posthog) {
|
|
18
|
+
console.log("\u2705 PostHog found - sending event");
|
|
19
|
+
try {
|
|
20
|
+
window.posthog.capture(eventName, properties);
|
|
21
|
+
console.log("\u2705 PostHog event sent successfully");
|
|
22
|
+
} catch (error) {
|
|
23
|
+
console.error("\u274C PostHog error:", error);
|
|
24
|
+
}
|
|
25
|
+
} else {
|
|
26
|
+
console.log("\u274C PostHog not found");
|
|
27
|
+
}
|
|
28
|
+
if (window.gtag) {
|
|
29
|
+
console.log("\u2705 gtag found - sending to GA4");
|
|
30
|
+
const gtagEventName = gaEventName || eventName;
|
|
31
|
+
const gtagPayload = {
|
|
32
|
+
event_category: "fynd_engagement",
|
|
33
|
+
event_label: properties.source_page,
|
|
34
|
+
custom_source_page: properties.source_page,
|
|
35
|
+
custom_fynd_product: properties.fynd_product,
|
|
36
|
+
custom_interface: properties.interface,
|
|
37
|
+
custom_device_type: properties.device_type,
|
|
38
|
+
custom_utm_source: properties.utm_source,
|
|
39
|
+
custom_utm_medium: properties.utm_medium,
|
|
40
|
+
custom_utm_campaign: properties.utm_campaign,
|
|
41
|
+
custom_referrer: properties.referrer,
|
|
42
|
+
..."form_name" in properties && { custom_form_name: properties.form_name }
|
|
43
|
+
};
|
|
44
|
+
console.log("\u{1F4E4} GA4 Event Name:", gtagEventName);
|
|
45
|
+
console.log("\u{1F4E4} GA4 Payload:", gtagPayload);
|
|
46
|
+
try {
|
|
47
|
+
window.gtag("event", gtagEventName, gtagPayload);
|
|
48
|
+
console.log("\u2705 Event sent to GA4 successfully");
|
|
49
|
+
} catch (error) {
|
|
50
|
+
console.error("\u274C GA4 error:", error);
|
|
51
|
+
}
|
|
52
|
+
} else {
|
|
53
|
+
console.log("\u274C gtag not found - GA4 not loaded");
|
|
54
|
+
console.log("Available on window:", Object.keys(window).filter((key) => key.includes("g")));
|
|
55
|
+
}
|
|
56
|
+
console.log("---");
|
|
57
|
+
};
|
|
58
|
+
var getTrackingProperties = () => {
|
|
59
|
+
const pathname = window.location.pathname;
|
|
60
|
+
const properties = {
|
|
61
|
+
source_page: pathname === "/" ? pathname + " Home" : pathname,
|
|
62
|
+
fynd_product: "fynd.com website",
|
|
63
|
+
interface: "Webflow",
|
|
64
|
+
device_type: /Mobile|Android|iPhone|iPad/.test(navigator.userAgent) ? "Mobile" : "Web",
|
|
65
|
+
utm_source: new URLSearchParams(window.location.search).get("utm_source") || "",
|
|
66
|
+
utm_medium: new URLSearchParams(window.location.search).get("utm_medium") || "",
|
|
67
|
+
utm_campaign: new URLSearchParams(window.location.search).get("utm_campaign") || "",
|
|
68
|
+
referrer: document.referrer
|
|
69
|
+
};
|
|
70
|
+
console.log("\u{1F4CB} Generated tracking properties:", properties);
|
|
71
|
+
return properties;
|
|
72
|
+
};
|
|
73
|
+
var getTrackingPropertiesWithForm = (formName) => {
|
|
74
|
+
const baseProperties = getTrackingProperties();
|
|
75
|
+
const propertiesWithForm = {
|
|
76
|
+
...baseProperties,
|
|
77
|
+
form_name: formName
|
|
78
|
+
};
|
|
79
|
+
console.log("\u{1F4CB} Generated form tracking properties:", propertiesWithForm);
|
|
80
|
+
return propertiesWithForm;
|
|
81
|
+
};
|
|
82
|
+
window.getTrackingProperties = getTrackingProperties;
|
|
83
|
+
window.getTrackingPropertiesWithForm = getTrackingPropertiesWithForm;
|
|
84
|
+
window.interactedForm = "";
|
|
85
|
+
document.addEventListener("DOMContentLoaded", function() {
|
|
86
|
+
console.log("\u{1F680} Debug tracking script loaded");
|
|
87
|
+
const testButton = document.createElement("button");
|
|
88
|
+
testButton.textContent = "Test GA4 Event";
|
|
89
|
+
testButton.style.cssText = "position:fixed;top:10px;right:10px;z-index:9999;background:red;color:white;padding:10px;border:none;border-radius:4px;cursor:pointer;";
|
|
90
|
+
testButton.onclick = function() {
|
|
91
|
+
console.log("\u{1F9EA} Testing GA4 integration...");
|
|
92
|
+
trackEvent("fynd_test_event", window.getTrackingProperties());
|
|
93
|
+
};
|
|
94
|
+
document.body.appendChild(testButton);
|
|
95
|
+
console.log("\u{1F534} Test button added to page");
|
|
96
|
+
});
|
|
97
|
+
document.addEventListener("DOMContentLoaded", function() {
|
|
98
|
+
setTimeout(() => {
|
|
99
|
+
console.log("\u{1F50D} === GA4 Integration Diagnostic Report ===");
|
|
100
|
+
const gtagType = typeof window.gtag;
|
|
101
|
+
console.log("gtag type:", gtagType);
|
|
102
|
+
console.log("gtag available:", gtagType !== "undefined");
|
|
103
|
+
const posthogType = typeof window.posthog;
|
|
104
|
+
console.log("PostHog type:", posthogType);
|
|
105
|
+
console.log("PostHog available:", posthogType !== "undefined");
|
|
106
|
+
const dataLayerExists = "dataLayer" in window;
|
|
107
|
+
console.log("dataLayer exists:", dataLayerExists);
|
|
108
|
+
if (dataLayerExists) {
|
|
109
|
+
console.log("dataLayer length:", window.dataLayer?.length || "undefined");
|
|
110
|
+
}
|
|
111
|
+
const gaScripts = document.querySelectorAll('script[src*="googletagmanager"], script[src*="google-analytics"]');
|
|
112
|
+
console.log("GA script tags found:", gaScripts.length);
|
|
113
|
+
gaScripts.forEach((script, index) => {
|
|
114
|
+
console.log(`GA Script ${index + 1}:`, script.src);
|
|
115
|
+
});
|
|
116
|
+
const gaProperties = Object.keys(window).filter(
|
|
117
|
+
(key) => key.toLowerCase().includes("google") || key.toLowerCase().includes("gtag") || key.toLowerCase().includes("ga") || key.toLowerCase().includes("analytics")
|
|
118
|
+
);
|
|
119
|
+
console.log("GA-related window properties:", gaProperties);
|
|
120
|
+
if (gtagType === "undefined") {
|
|
121
|
+
console.log("\u274C GA4 (gtag) not loaded. Check your GA4 installation.");
|
|
122
|
+
console.log("\u{1F4A1} Make sure the Google Analytics script loads before this debug script");
|
|
123
|
+
} else {
|
|
124
|
+
console.log("\u2705 GA4 (gtag) is loaded and ready");
|
|
125
|
+
try {
|
|
126
|
+
window.gtag("config", "test");
|
|
127
|
+
console.log("\u2705 gtag function is callable");
|
|
128
|
+
} catch (error) {
|
|
129
|
+
console.log("\u26A0\uFE0F gtag function exists but threw error:", error);
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
if (posthogType === "undefined") {
|
|
133
|
+
console.log("\u274C PostHog not loaded");
|
|
134
|
+
} else {
|
|
135
|
+
console.log("\u2705 PostHog is loaded and ready");
|
|
136
|
+
}
|
|
137
|
+
console.log("=== End Diagnostic Report ===");
|
|
138
|
+
setTimeout(() => {
|
|
139
|
+
console.log("\u{1F916} Auto-triggering test event...");
|
|
140
|
+
trackEvent("fynd_auto_test_event", window.getTrackingProperties());
|
|
141
|
+
}, 5e3);
|
|
142
|
+
}, 2e3);
|
|
143
|
+
});
|
|
144
|
+
var originalFetch = window.fetch;
|
|
145
|
+
window.fetch = function(...args) {
|
|
146
|
+
const url = args[0]?.toString() || "";
|
|
147
|
+
if (url.includes("google-analytics") || url.includes("collect")) {
|
|
148
|
+
console.log("\u{1F4E1} GA4 network request detected:", url);
|
|
149
|
+
}
|
|
150
|
+
return originalFetch.apply(this, args);
|
|
151
|
+
};
|
|
152
|
+
})();
|
|
153
|
+
//# sourceMappingURL=debug.js.map
|
|
@@ -1 +1,74 @@
|
|
|
1
|
-
"use strict";
|
|
1
|
+
"use strict";
|
|
2
|
+
(() => {
|
|
3
|
+
// bin/live-reload.js
|
|
4
|
+
if (window.location.hostname === "localhost" || window.location.hostname === "127.0.0.1") {
|
|
5
|
+
new EventSource(`${"http://localhost:3000"}/esbuild`).addEventListener(
|
|
6
|
+
"change",
|
|
7
|
+
() => location.reload()
|
|
8
|
+
);
|
|
9
|
+
} else {
|
|
10
|
+
console.log("Live reload disabled: not running on localhost");
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
// src/analytics/form-success.ts
|
|
14
|
+
var FORM_SUCCESS_STORAGE_KEY = "form_success_tracking";
|
|
15
|
+
var SESSION_DURATION_MS = 10 * 60 * 500;
|
|
16
|
+
function getFormName() {
|
|
17
|
+
const urlParams = new URLSearchParams(window.location.search);
|
|
18
|
+
const formName = urlParams.get("form_name");
|
|
19
|
+
return formName ? decodeURIComponent(formName) : null;
|
|
20
|
+
}
|
|
21
|
+
function hasFormSuccessBeenTracked(formName) {
|
|
22
|
+
try {
|
|
23
|
+
const storedData = sessionStorage.getItem(FORM_SUCCESS_STORAGE_KEY);
|
|
24
|
+
if (!storedData) {
|
|
25
|
+
return false;
|
|
26
|
+
}
|
|
27
|
+
const parsedData = JSON.parse(storedData);
|
|
28
|
+
const currentTime = Date.now();
|
|
29
|
+
const timeDifference = currentTime - parsedData.timestamp;
|
|
30
|
+
if (timeDifference > SESSION_DURATION_MS) {
|
|
31
|
+
sessionStorage.removeItem(FORM_SUCCESS_STORAGE_KEY);
|
|
32
|
+
return false;
|
|
33
|
+
}
|
|
34
|
+
return parsedData.formName === formName;
|
|
35
|
+
} catch (error) {
|
|
36
|
+
console.error("Error checking form success tracking:", error);
|
|
37
|
+
sessionStorage.removeItem(FORM_SUCCESS_STORAGE_KEY);
|
|
38
|
+
return false;
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
function markFormSuccessAsTracked(formName) {
|
|
42
|
+
try {
|
|
43
|
+
const trackingData = {
|
|
44
|
+
timestamp: Date.now(),
|
|
45
|
+
formName
|
|
46
|
+
};
|
|
47
|
+
sessionStorage.setItem(FORM_SUCCESS_STORAGE_KEY, JSON.stringify(trackingData));
|
|
48
|
+
} catch (error) {
|
|
49
|
+
console.error("Error storing form success tracking data:", error);
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
document.addEventListener("DOMContentLoaded", function() {
|
|
53
|
+
const currentFormName = getFormName();
|
|
54
|
+
if (!currentFormName) {
|
|
55
|
+
console.log("No form name found in URL parameters");
|
|
56
|
+
return;
|
|
57
|
+
}
|
|
58
|
+
if (hasFormSuccessBeenTracked(currentFormName)) {
|
|
59
|
+
console.log(`Form success for "${currentFormName}" already tracked in this session`);
|
|
60
|
+
return;
|
|
61
|
+
}
|
|
62
|
+
if (window.posthog && window.getTrackingPropertiesWithForm) {
|
|
63
|
+
window.posthog.capture(
|
|
64
|
+
"fynd_form_success",
|
|
65
|
+
window.getTrackingPropertiesWithForm(currentFormName)
|
|
66
|
+
);
|
|
67
|
+
markFormSuccessAsTracked(currentFormName);
|
|
68
|
+
console.log(`Form success tracked for "${currentFormName}"`);
|
|
69
|
+
} else {
|
|
70
|
+
console.warn("PostHog or tracking functions not available");
|
|
71
|
+
}
|
|
72
|
+
});
|
|
73
|
+
})();
|
|
74
|
+
//# sourceMappingURL=form-success.js.map
|
package/dist/analytics/main.js
CHANGED
|
@@ -1 +1,98 @@
|
|
|
1
|
-
"use strict";
|
|
1
|
+
"use strict";
|
|
2
|
+
(() => {
|
|
3
|
+
// bin/live-reload.js
|
|
4
|
+
if (window.location.hostname === "localhost" || window.location.hostname === "127.0.0.1") {
|
|
5
|
+
new EventSource(`${"http://localhost:3000"}/esbuild`).addEventListener(
|
|
6
|
+
"change",
|
|
7
|
+
() => location.reload()
|
|
8
|
+
);
|
|
9
|
+
} else {
|
|
10
|
+
console.log("Live reload disabled: not running on localhost");
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
// src/analytics/main.ts
|
|
14
|
+
var getTrackingProperties = () => {
|
|
15
|
+
const pathname = window.location.pathname;
|
|
16
|
+
return {
|
|
17
|
+
source_page: pathname === "/" ? `${pathname} Home` : pathname,
|
|
18
|
+
fynd_product: "fynd.com website",
|
|
19
|
+
interface: "Webflow",
|
|
20
|
+
device_type: /Mobile|Android|iPhone|iPad/.test(navigator.userAgent) ? "Mobile" : "Web",
|
|
21
|
+
utm_source: new URLSearchParams(window.location.search).get("utm_source") || "",
|
|
22
|
+
utm_medium: new URLSearchParams(window.location.search).get("utm_medium") || "",
|
|
23
|
+
utm_campaign: new URLSearchParams(window.location.search).get("utm_campaign") || "",
|
|
24
|
+
referrer: document.referrer
|
|
25
|
+
};
|
|
26
|
+
};
|
|
27
|
+
var getTrackingPropertiesWithForm = (formName) => {
|
|
28
|
+
return {
|
|
29
|
+
...getTrackingProperties(),
|
|
30
|
+
form_name: formName
|
|
31
|
+
};
|
|
32
|
+
};
|
|
33
|
+
var trackEvent = (eventName, properties) => {
|
|
34
|
+
if (window.posthog) {
|
|
35
|
+
window.posthog.capture(eventName, properties);
|
|
36
|
+
}
|
|
37
|
+
};
|
|
38
|
+
window.getTrackingProperties = getTrackingProperties;
|
|
39
|
+
window.getTrackingPropertiesWithForm = getTrackingPropertiesWithForm;
|
|
40
|
+
window.interactedForm = "";
|
|
41
|
+
function getParentFormName(fieldElement) {
|
|
42
|
+
const parentForm = fieldElement.closest("form");
|
|
43
|
+
if (parentForm) {
|
|
44
|
+
const formName = parentForm.getAttribute("data-name");
|
|
45
|
+
return formName || null;
|
|
46
|
+
}
|
|
47
|
+
return null;
|
|
48
|
+
}
|
|
49
|
+
document.addEventListener("DOMContentLoaded", function() {
|
|
50
|
+
const trackingProps = window.getTrackingProperties();
|
|
51
|
+
if (window.posthog) {
|
|
52
|
+
window.posthog.capture("$pageview", trackingProps);
|
|
53
|
+
}
|
|
54
|
+
});
|
|
55
|
+
window.addEventListener("load", function() {
|
|
56
|
+
trackEvent("fynd_page_loaded", window.getTrackingProperties());
|
|
57
|
+
});
|
|
58
|
+
document.addEventListener("DOMContentLoaded", function() {
|
|
59
|
+
const signUpButtons = document.querySelectorAll('[data-ph="sign-up"]');
|
|
60
|
+
const signInButtons = document.querySelectorAll('[data-ph="sign-in"]');
|
|
61
|
+
const scrollToFormButtons = document.querySelectorAll(
|
|
62
|
+
'[href="#footer-form"]'
|
|
63
|
+
);
|
|
64
|
+
const bookADemoButtons = document.querySelectorAll('[data-ph="book-a-demo"]');
|
|
65
|
+
const submitButtons = document.querySelectorAll('[type="submit"]');
|
|
66
|
+
submitButtons.forEach((button) => {
|
|
67
|
+
button.addEventListener("click", function() {
|
|
68
|
+
const formName = getParentFormName(this);
|
|
69
|
+
setTimeout(() => {
|
|
70
|
+
if (window.validationPassed = true) {
|
|
71
|
+
trackEvent("fynd_form_submitted", window.getTrackingPropertiesWithForm(formName || ""));
|
|
72
|
+
}
|
|
73
|
+
}, 100);
|
|
74
|
+
});
|
|
75
|
+
});
|
|
76
|
+
signUpButtons.forEach((button) => {
|
|
77
|
+
button.addEventListener("click", function() {
|
|
78
|
+
trackEvent("fynd_clicked_sign_up", window.getTrackingProperties());
|
|
79
|
+
});
|
|
80
|
+
});
|
|
81
|
+
signInButtons.forEach((button) => {
|
|
82
|
+
button.addEventListener("click", function() {
|
|
83
|
+
trackEvent("fynd_clicked_sign_in", window.getTrackingProperties());
|
|
84
|
+
});
|
|
85
|
+
});
|
|
86
|
+
scrollToFormButtons.forEach((button) => {
|
|
87
|
+
button.addEventListener("click", function() {
|
|
88
|
+
trackEvent("fynd_clicked_scroll_to_form", window.getTrackingProperties());
|
|
89
|
+
});
|
|
90
|
+
});
|
|
91
|
+
bookADemoButtons.forEach((button) => {
|
|
92
|
+
button.addEventListener("click", function() {
|
|
93
|
+
trackEvent("fynd_clicked_book_a_demo", window.getTrackingProperties());
|
|
94
|
+
});
|
|
95
|
+
});
|
|
96
|
+
});
|
|
97
|
+
})();
|
|
98
|
+
//# sourceMappingURL=main.js.map
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../bin/live-reload.js", "../../src/analytics/main.ts"],
|
|
4
|
-
"sourcesContent": ["// Only enable live reload when running on localhost\nif (\n window.location.hostname === \"localhost\" ||\n window.location.hostname === \"127.0.0.1\"\n) {\n new EventSource(`${SERVE_ORIGIN}/esbuild`).addEventListener(\"change\", () =>\n location.reload()\n );\n} else {\n console.log(\"Live reload disabled: not running on localhost\");\n}\n", "import { createLanguageService } from \"typescript\";\n\n// Type definitions\ninterface TrackingProperties {\n source_page: string;\n fynd_product: string;\n interface: string;\n device_type: string;\n utm_source: string;\n utm_medium: string;\n utm_campaign: string;\n referrer: string;\n}\n\ninterface TrackingPropertiesWithForm extends TrackingProperties {\n form_name: string;\n}\n\n// PostHog interface\ninterface PostHog {\n capture: (\n eventName: string,\n properties: TrackingProperties | TrackingPropertiesWithForm\n ) => void;\n}\n\n// Extend Window interface to include custom properties\ndeclare global {\n interface Window {\n getTrackingProperties: () => TrackingProperties;\n getTrackingPropertiesWithForm: (\n formName: string\n ) => TrackingPropertiesWithForm;\n interactedForm: string;\n validationPassed?: boolean;\n posthog: PostHog;\n }\n}\n\n// This export statement is needed to make this file a module\n// and allow the global declarations to work properly\nexport { };\n\n// Default tracking properties function\nconst getTrackingProperties = (): TrackingProperties => {\n const pathname: string = window.location.pathname;\n\n return {\n source_page: pathname === \"/\" ? `${pathname} Home` : pathname,\n fynd_product: \"fynd.com website\",\n interface: \"Webflow\",\n device_type: /Mobile|Android|iPhone|iPad/.test(navigator.userAgent)\n ? \"Mobile\"\n : \"Web\",\n utm_source:\n new URLSearchParams(window.location.search).get(\"utm_source\") || \"\",\n utm_medium:\n new URLSearchParams(window.location.search).get(\"utm_medium\") || \"\",\n utm_campaign:\n new URLSearchParams(window.location.search).get(\"utm_campaign\") || \"\",\n referrer: document.referrer,\n };\n};\n\n// Function to get tracking properties with form name\nconst getTrackingPropertiesWithForm = (\n formName: string\n): TrackingPropertiesWithForm => {\n return {\n ...getTrackingProperties(),\n form_name: formName,\n };\n};\n\n// Helper function to send events to PostHog\nconst trackEvent = (\n eventName: string,\n properties: TrackingProperties | TrackingPropertiesWithForm\n) => {\n // PostHog tracking\n if (window.posthog) {\n window.posthog.capture(eventName, properties);\n }\n};\n\n// Assign functions to window object\nwindow.getTrackingProperties = getTrackingProperties;\nwindow.getTrackingPropertiesWithForm = getTrackingPropertiesWithForm;\nwindow.interactedForm = \"\";\n\n// Getting parent form name by passing field element\nfunction getParentFormName(fieldElement: Element): string | null {\n const parentForm = fieldElement.closest(\"form\") as HTMLFormElement | null;\n if (parentForm) {\n const formName = parentForm.getAttribute(\"data-name\");\n return formName || null;\n }\n return null;\n}\n\n// Initialize PostHog pageview\ndocument.addEventListener(\"DOMContentLoaded\", function (): void {\n const trackingProps = window.getTrackingProperties();\n\n // PostHog pageview\n if (window.posthog) {\n window.posthog.capture(\"$pageview\", trackingProps);\n }\n});\n\n// Track page load event\nwindow.addEventListener(\"load\", function (): void {\n trackEvent(\"fynd_page_loaded\", window.getTrackingProperties());\n});\n\n// Button click tracking for sign up, sign in, scroll to form and book a demo buttons\ndocument.addEventListener(\"DOMContentLoaded\", function (): void {\n const signUpButtons = document.querySelectorAll('[data-ph=\"sign-up\"]') as NodeListOf<Element>;\n const signInButtons = document.querySelectorAll('[data-ph=\"sign-in\"]') as NodeListOf<Element>;\n const scrollToFormButtons = document.querySelectorAll(\n '[href=\"#footer-form\"]'\n ) as NodeListOf<Element>;\n const bookADemoButtons = document.querySelectorAll('[data-ph=\"book-a-demo\"]') as NodeListOf<Element>;\n const submitButtons = document.querySelectorAll('[type=\"submit\"]') as NodeListOf<Element>;\n\n submitButtons.forEach((button: Element) => {\n button.addEventListener(\"click\", function (this: HTMLElement): void {\n const formName = getParentFormName(this);\n setTimeout(() => {\n if (window.validationPassed = true) {\n // If validation passed, track the submit event\n trackEvent(\"fynd_form_submitted\", window.getTrackingPropertiesWithForm(formName || \"\"));\n }\n }, 100);\n });\n });\n\n signUpButtons.forEach((button: Element) => {\n button.addEventListener(\"click\", function (): void {\n trackEvent(\"fynd_clicked_sign_up\", window.getTrackingProperties());\n });\n });\n\n signInButtons.forEach((button: Element) => {\n button.addEventListener(\"click\", function (): void {\n trackEvent(\"fynd_clicked_sign_in\", window.getTrackingProperties());\n });\n });\n\n scrollToFormButtons.forEach((button: Element) => {\n button.addEventListener(\"click\", function (): void {\n trackEvent(\"fynd_clicked_scroll_to_form\", window.getTrackingProperties());\n });\n });\n\n bookADemoButtons.forEach((button: Element) => {\n button.addEventListener(\"click\", function (): void {\n trackEvent(\"fynd_clicked_book_a_demo\", window.getTrackingProperties());\n });\n });\n});\n\n
|
|
5
|
-
"mappings": "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
|
|
4
|
+
"sourcesContent": ["// Only enable live reload when running on localhost\nif (\n window.location.hostname === \"localhost\" ||\n window.location.hostname === \"127.0.0.1\"\n) {\n new EventSource(`${SERVE_ORIGIN}/esbuild`).addEventListener(\"change\", () =>\n location.reload()\n );\n} else {\n console.log(\"Live reload disabled: not running on localhost\");\n}\n", "import { createLanguageService } from \"typescript\";\n\n// Type definitions\ninterface TrackingProperties {\n source_page: string;\n fynd_product: string;\n interface: string;\n device_type: string;\n utm_source: string;\n utm_medium: string;\n utm_campaign: string;\n referrer: string;\n}\n\ninterface TrackingPropertiesWithForm extends TrackingProperties {\n form_name: string;\n}\n\n// PostHog interface\ninterface PostHog {\n capture: (\n eventName: string,\n properties: TrackingProperties | TrackingPropertiesWithForm\n ) => void;\n}\n\n// Extend Window interface to include custom properties\ndeclare global {\n interface Window {\n getTrackingProperties: () => TrackingProperties;\n getTrackingPropertiesWithForm: (\n formName: string\n ) => TrackingPropertiesWithForm;\n interactedForm: string;\n validationPassed?: boolean;\n posthog: PostHog;\n }\n}\n\n// This export statement is needed to make this file a module\n// and allow the global declarations to work properly\nexport { };\n\n// Default tracking properties function\nconst getTrackingProperties = (): TrackingProperties => {\n const pathname: string = window.location.pathname;\n\n return {\n source_page: pathname === \"/\" ? `${pathname} Home` : pathname,\n fynd_product: \"fynd.com website\",\n interface: \"Webflow\",\n device_type: /Mobile|Android|iPhone|iPad/.test(navigator.userAgent)\n ? \"Mobile\"\n : \"Web\",\n utm_source:\n new URLSearchParams(window.location.search).get(\"utm_source\") || \"\",\n utm_medium:\n new URLSearchParams(window.location.search).get(\"utm_medium\") || \"\",\n utm_campaign:\n new URLSearchParams(window.location.search).get(\"utm_campaign\") || \"\",\n referrer: document.referrer,\n };\n};\n\n// Function to get tracking properties with form name\nconst getTrackingPropertiesWithForm = (\n formName: string\n): TrackingPropertiesWithForm => {\n return {\n ...getTrackingProperties(),\n form_name: formName,\n };\n};\n\n// Helper function to send events to PostHog\nconst trackEvent = (\n eventName: string,\n properties: TrackingProperties | TrackingPropertiesWithForm\n) => {\n // PostHog tracking\n if (window.posthog) {\n window.posthog.capture(eventName, properties);\n }\n};\n\n// Assign functions to window object\nwindow.getTrackingProperties = getTrackingProperties;\nwindow.getTrackingPropertiesWithForm = getTrackingPropertiesWithForm;\nwindow.interactedForm = \"\";\n\n// Getting parent form name by passing field element\nfunction getParentFormName(fieldElement: Element): string | null {\n const parentForm = fieldElement.closest(\"form\") as HTMLFormElement | null;\n if (parentForm) {\n const formName = parentForm.getAttribute(\"data-name\");\n return formName || null;\n }\n return null;\n}\n\n// Initialize PostHog pageview\ndocument.addEventListener(\"DOMContentLoaded\", function (): void {\n const trackingProps = window.getTrackingProperties();\n\n // PostHog pageview\n if (window.posthog) {\n window.posthog.capture(\"$pageview\", trackingProps);\n }\n});\n\n// Track page load event\nwindow.addEventListener(\"load\", function (): void {\n trackEvent(\"fynd_page_loaded\", window.getTrackingProperties());\n});\n\n// Button click tracking for sign up, sign in, scroll to form and book a demo buttons\ndocument.addEventListener(\"DOMContentLoaded\", function (): void {\n const signUpButtons = document.querySelectorAll('[data-ph=\"sign-up\"]') as NodeListOf<Element>;\n const signInButtons = document.querySelectorAll('[data-ph=\"sign-in\"]') as NodeListOf<Element>;\n const scrollToFormButtons = document.querySelectorAll(\n '[href=\"#footer-form\"]'\n ) as NodeListOf<Element>;\n const bookADemoButtons = document.querySelectorAll('[data-ph=\"book-a-demo\"]') as NodeListOf<Element>;\n const submitButtons = document.querySelectorAll('[type=\"submit\"]') as NodeListOf<Element>;\n\n submitButtons.forEach((button: Element) => {\n button.addEventListener(\"click\", function (this: HTMLElement): void {\n const formName = getParentFormName(this);\n setTimeout(() => {\n if (window.validationPassed = true) {\n // If validation passed, track the submit event\n trackEvent(\"fynd_form_submitted\", window.getTrackingPropertiesWithForm(formName || \"\"));\n }\n }, 100);\n });\n });\n\n signUpButtons.forEach((button: Element) => {\n button.addEventListener(\"click\", function (): void {\n trackEvent(\"fynd_clicked_sign_up\", window.getTrackingProperties());\n });\n });\n\n signInButtons.forEach((button: Element) => {\n button.addEventListener(\"click\", function (): void {\n trackEvent(\"fynd_clicked_sign_in\", window.getTrackingProperties());\n });\n });\n\n scrollToFormButtons.forEach((button: Element) => {\n button.addEventListener(\"click\", function (): void {\n trackEvent(\"fynd_clicked_scroll_to_form\", window.getTrackingProperties());\n });\n });\n\n bookADemoButtons.forEach((button: Element) => {\n button.addEventListener(\"click\", function (): void {\n trackEvent(\"fynd_clicked_book_a_demo\", window.getTrackingProperties());\n });\n });\n});\n\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|