@fynd-design-engineering/fynd-one-v2 3.1.2 → 3.1.4

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.
@@ -0,0 +1 @@
1
+ "use strict";(()=>{function e(){document.querySelectorAll('a[href="#footer-form"]').forEach(o=>{let t=o;t.href="/contact-us"})}document.addEventListener("DOMContentLoaded",e);document.readyState==="loading"?document.addEventListener("DOMContentLoaded",e):e();})();
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../bin/live-reload.js", "../../src/global/miscellaneous.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", "// Replace footer form hash links\nfunction replaceFooterFormLinks(): void {\n const footerLinks = document.querySelectorAll('a[href=\"#footer-form\"]');\n \n footerLinks.forEach((link: Element) => {\n const anchorElement = link as HTMLAnchorElement;\n anchorElement.href = '/contact-us';\n });\n }\n \n document.addEventListener('DOMContentLoaded', replaceFooterFormLinks);\n \n if (document.readyState === 'loading') {\n document.addEventListener('DOMContentLoaded', replaceFooterFormLinks);\n } else {\n replaceFooterFormLinks();\n }"],
5
+ "mappings": ";;;AACA,MACE,OAAO,SAAS,aAAa,eAC7B,OAAO,SAAS,aAAa,aAC7B;AACA,QAAI,YAAY,GAAG,uBAAY,UAAU,EAAE;AAAA,MAAiB;AAAA,MAAU,MACpE,SAAS,OAAO;AAAA,IAClB;AAAA,EACF,OAAO;AACL,YAAQ,IAAI,gDAAgD;AAAA,EAC9D;;;ACTA,WAAS,yBAA+B;AACpC,UAAM,cAAc,SAAS,iBAAiB,wBAAwB;AAEtE,gBAAY,QAAQ,CAAC,SAAkB;AACrC,YAAM,gBAAgB;AACtB,oBAAc,OAAO;AAAA,IACvB,CAAC;AAAA,EACH;AAEA,WAAS,iBAAiB,oBAAoB,sBAAsB;AAEpE,MAAI,SAAS,eAAe,WAAW;AACrC,aAAS,iBAAiB,oBAAoB,sBAAsB;AAAA,EACtE,OAAO;AACL,2BAAuB;AAAA,EACzB;",
6
+ "names": []
7
+ }
@@ -0,0 +1 @@
1
+ "use strict";(()=>{var o=[{attribute:"data-ph",attributeValue:"book-a-demo",condition:"href",conditionValue:"/contact-us"},{attribute:"data-ph",attributeValue:"sign-in",condition:"href",conditionValue:"https://console.fynd.com/auth/sign-in"},{attribute:"data-ph",attributeValue:"sign-up",condition:"href",conditionValue:"https://console.fynd.com/auth/sign-up"}];function s(n,e,t){switch(e.toLowerCase()){case"href":return u(n,t);case"text":return d(n,t);case"class":return n.classList.contains(t);case"id":return n.id===t;default:return!1}}function u(n,e){let t=n.getAttribute("href")||"";if(!t)return!1;try{let i;if(t.startsWith("http://")||t.startsWith("https://")?i=new URL(t):t.startsWith("/")?i=new URL(t,window.location.origin):i=new URL(t,window.location.href),e.startsWith("http://")||e.startsWith("https://"))try{let a=new URL(e);return i.origin===a.origin&&i.pathname===a.pathname}catch{return t.includes(e)}return i.pathname.includes(e)}catch{return t.includes(e)}}function d(n,e){let i=(n.textContent?.trim().toLowerCase()||"").replace(/\s+/g," "),a=e.toLowerCase().replace(/\s+/g," ");return i.includes(a)}function b(n=o){document.querySelectorAll("a").forEach(t=>{n.forEach(i=>{t.hasAttribute(i.attribute)&&t.getAttribute(i.attribute)===i.attributeValue||s(t,i.condition,i.conditionValue)&&t.setAttribute(i.attribute,i.attributeValue)})})}function c(n=o){document.querySelectorAll("a").forEach(t=>{n.forEach(i=>{t.hasAttribute(i.attribute)&&t.getAttribute(i.attribute)===i.attributeValue||s(t,i.condition,i.conditionValue)&&t.setAttribute(i.attribute,i.attributeValue)})})}var r=class{constructor(e=o){this.observer=null;this.config=e}updateConfig(e){this.config=e}tagExistingLinks(){document.querySelectorAll("a").forEach(t=>{this.config.forEach(i=>{this.shouldTagLink(t,i)&&this.tagLink(t,i)})})}startObserving(){this.observer=new MutationObserver(e=>{e.forEach(t=>{t.addedNodes.forEach(i=>{if(i.nodeType===Node.ELEMENT_NODE){let a=i;a.tagName==="A"&&this.processAnchor(a),a.querySelectorAll("a").forEach(g=>{this.processAnchor(g)})}})})}),this.observer.observe(document.body,{childList:!0,subtree:!0})}stopObserving(){this.observer&&(this.observer.disconnect(),this.observer=null)}processAnchor(e){this.config.forEach(t=>{this.shouldTagLink(e,t)&&this.tagLink(e,t)})}shouldTagLink(e,t){return e.hasAttribute(t.attribute)&&e.getAttribute(t.attribute)===t.attributeValue?!1:s(e,t.condition,t.conditionValue)}tagLink(e,t){e.setAttribute(t.attribute,t.attributeValue)}};function f(n){document.readyState==="loading"?document.addEventListener("DOMContentLoaded",()=>{c(n)}):c(n)}function h(n){let e=()=>{let t=new r(n);t.tagExistingLinks(),t.startObserving()};document.readyState==="loading"?document.addEventListener("DOMContentLoaded",e):e()}h();})();
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../bin/live-reload.js", "../../src/posthog/attributes.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", "interface LinkTaggingRule {\n attribute: string;\n attributeValue: string;\n condition: string;\n conditionValue: string;\n }\n \n const DEFAULT_TAGGING_CONFIG: LinkTaggingRule[] = [\n {\n attribute: \"data-ph\",\n attributeValue: \"book-a-demo\",\n condition: \"href\",\n conditionValue: \"/contact-us\"\n },\n {\n attribute: \"data-ph\",\n attributeValue: \"sign-in\",\n condition: \"href\",\n conditionValue: \"https://console.fynd.com/auth/sign-in\"\n },\n {\n attribute: \"data-ph\",\n attributeValue: \"sign-up\",\n condition: \"href\",\n conditionValue: \"https://console.fynd.com/auth/sign-up\"\n }\n ];\n \n function matchesCondition(anchor: HTMLAnchorElement, condition: string, conditionValue: string): boolean {\n switch (condition.toLowerCase()) {\n case 'href':\n return matchesHref(anchor, conditionValue);\n case 'text':\n return matchesText(anchor, conditionValue);\n case 'class':\n return anchor.classList.contains(conditionValue);\n case 'id':\n return anchor.id === conditionValue;\n default:\n return false;\n }\n }\n \n function matchesHref(anchor: HTMLAnchorElement, conditionValue: string): boolean {\n const href = anchor.getAttribute('href') || '';\n if (!href) return false;\n \n try {\n let url: URL;\n \n if (href.startsWith('http://') || href.startsWith('https://')) {\n url = new URL(href);\n } else if (href.startsWith('/')) {\n url = new URL(href, window.location.origin);\n } else {\n url = new URL(href, window.location.href);\n }\n \n if (conditionValue.startsWith('http://') || conditionValue.startsWith('https://')) {\n try {\n const conditionUrl = new URL(conditionValue);\n return url.origin === conditionUrl.origin && url.pathname === conditionUrl.pathname;\n } catch {\n return href.includes(conditionValue);\n }\n }\n \n return url.pathname.includes(conditionValue);\n } catch (error) {\n return href.includes(conditionValue);\n }\n }\n \n function matchesText(anchor: HTMLAnchorElement, conditionValue: string): boolean {\n const textContent = anchor.textContent?.trim().toLowerCase() || '';\n const normalizedText = textContent.replace(/\\s+/g, ' ');\n const normalizedCondition = conditionValue.toLowerCase().replace(/\\s+/g, ' ');\n \n return normalizedText.includes(normalizedCondition);\n }\n \n function tagLinks(config: LinkTaggingRule[] = DEFAULT_TAGGING_CONFIG): void {\n const anchorTags = document.querySelectorAll('a');\n \n anchorTags.forEach((anchor) => {\n config.forEach((rule) => {\n if (anchor.hasAttribute(rule.attribute) && \n anchor.getAttribute(rule.attribute) === rule.attributeValue) {\n return;\n }\n \n if (matchesCondition(anchor, rule.condition, rule.conditionValue)) {\n anchor.setAttribute(rule.attribute, rule.attributeValue);\n }\n });\n });\n }\n \n function tagLinksAdvanced(config: LinkTaggingRule[] = DEFAULT_TAGGING_CONFIG): void {\n const anchorTags = document.querySelectorAll('a');\n \n anchorTags.forEach((anchor) => {\n config.forEach((rule) => {\n if (anchor.hasAttribute(rule.attribute) && \n anchor.getAttribute(rule.attribute) === rule.attributeValue) {\n return;\n }\n \n if (matchesCondition(anchor, rule.condition, rule.conditionValue)) {\n anchor.setAttribute(rule.attribute, rule.attributeValue);\n }\n });\n });\n }\n \n class GenericLinkTagger {\n private config: LinkTaggingRule[];\n private observer: MutationObserver | null = null;\n \n constructor(config: LinkTaggingRule[] = DEFAULT_TAGGING_CONFIG) {\n this.config = config;\n }\n \n updateConfig(config: LinkTaggingRule[]): void {\n this.config = config;\n }\n \n tagExistingLinks(): void {\n const anchorTags = document.querySelectorAll('a');\n \n anchorTags.forEach((anchor) => {\n this.config.forEach((rule) => {\n if (this.shouldTagLink(anchor, rule)) {\n this.tagLink(anchor, rule);\n }\n });\n });\n }\n \n startObserving(): void {\n this.observer = new MutationObserver((mutations) => {\n mutations.forEach((mutation) => {\n mutation.addedNodes.forEach((node) => {\n if (node.nodeType === Node.ELEMENT_NODE) {\n const element = node as Element;\n \n if (element.tagName === 'A') {\n this.processAnchor(element as HTMLAnchorElement);\n }\n \n const anchorTags = element.querySelectorAll('a');\n anchorTags.forEach((anchor) => {\n this.processAnchor(anchor);\n });\n }\n });\n });\n });\n \n this.observer.observe(document.body, {\n childList: true,\n subtree: true\n });\n }\n \n stopObserving(): void {\n if (this.observer) {\n this.observer.disconnect();\n this.observer = null;\n }\n }\n \n private processAnchor(anchor: HTMLAnchorElement): void {\n this.config.forEach((rule) => {\n if (this.shouldTagLink(anchor, rule)) {\n this.tagLink(anchor, rule);\n }\n });\n }\n \n private shouldTagLink(anchor: HTMLAnchorElement, rule: LinkTaggingRule): boolean {\n if (anchor.hasAttribute(rule.attribute) && \n anchor.getAttribute(rule.attribute) === rule.attributeValue) {\n return false;\n }\n \n return matchesCondition(anchor, rule.condition, rule.conditionValue);\n }\n \n private tagLink(anchor: HTMLAnchorElement, rule: LinkTaggingRule): void {\n anchor.setAttribute(rule.attribute, rule.attributeValue);\n }\n }\n \n function initGenericLinkTagger(config?: LinkTaggingRule[]): void {\n if (document.readyState === 'loading') {\n document.addEventListener('DOMContentLoaded', () => {\n tagLinksAdvanced(config);\n });\n } else {\n tagLinksAdvanced(config);\n }\n }\n \n function initGenericLinkTaggerWithObserver(config?: LinkTaggingRule[]): void {\n const runTagger = () => {\n const tagger = new GenericLinkTagger(config);\n tagger.tagExistingLinks();\n tagger.startObserving();\n };\n \n if (document.readyState === 'loading') {\n document.addEventListener('DOMContentLoaded', runTagger);\n } else {\n runTagger();\n }\n }\n \n initGenericLinkTaggerWithObserver();\n \n export { \n GenericLinkTagger, \n tagLinks, \n tagLinksAdvanced, \n initGenericLinkTagger, \n initGenericLinkTaggerWithObserver,\n DEFAULT_TAGGING_CONFIG,\n type LinkTaggingRule\n };"],
5
+ "mappings": "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",
6
+ "names": []
7
+ }
@@ -1 +1 @@
1
- "use strict";(()=>{var a=()=>{let r=window.location.pathname,t={source_page:r==="/"?`${r} Home`:r,fynd_product:"fynd.com website",interface:"Webflow",device_type:/Mobile|Android|iPhone|iPad/.test(navigator.userAgent)?"Mobile":"Web",utm_source:new URLSearchParams(window.location.search).get("utm_source")||"",utm_medium:new URLSearchParams(window.location.search).get("utm_medium")||"",utm_campaign:new URLSearchParams(window.location.search).get("utm_campaign")||"",referrer:document.referrer};try{let e=null;if(typeof window.getUserJourney=="function"&&(e=window.getUserJourney()),!e){let n=sessionStorage.getItem("userJourney");n&&(e=JSON.parse(n))}if(e){if(t.user_journey=e.userJourney||e,e.formDetails){let n=e.formDetails;n.formId&&(t.form_id=n.formId),n.formName&&(t.form_name=n.formName),n.firstName&&(t.form_first_name=n.firstName),n.lastName&&(t.form_last_name=n.lastName),n.email&&(t.form_email=n.email),n.phone&&(t.form_phone=n.phone)}if(e.userJourney&&e.userJourney.length>0){t.journey_total_pages=e.userJourney.length,t.journey_first_page=e.userJourney[0].page,t.journey_current_page=e.userJourney[e.userJourney.length-1].page;let n=new Date(e.userJourney[0].time),c=new Date(e.userJourney[e.userJourney.length-1].time);t.journey_session_duration=Math.floor((c.getTime()-n.getTime())/1e3)}e.deviceCategory&&(t.journey_device_category=e.deviceCategory),e.browser&&(t.journey_browser=e.browser),e.origin&&(t.journey_origin=e.origin)}}catch(e){console.warn("Error getting user journey data for tracking:",e)}return t},i=(r,t)=>{try{let e=a(),n=t?{...e,...t}:e;window.posthog&&window.posthog.capture(r,n)}catch(e){console.error("Error tracking event:",e)}},u=r=>{let t=r.closest("form");return t&&(t.getAttribute("data-name")||t.getAttribute("name")||t.id)||null};document.addEventListener("DOMContentLoaded",function(){let r=a();window.posthog&&window.posthog.capture("$pageview",r)});window.addEventListener("load",function(){i("fynd_page_loaded"),l()});function l(){if(window.location.pathname==="/thank-you"){let t=performance.getEntriesByType("navigation");t.length>0&&(t[0].type==="reload"||document.referrer&&new URL(document.referrer).origin===window.location.origin)&&setTimeout(()=>{i("fynd_form_success")},200)}}document.addEventListener("DOMContentLoaded",function(){let r=document.querySelectorAll('[data-ph="sign-up"]'),t=document.querySelectorAll('[data-ph="sign-in"]'),e=document.querySelectorAll('[href="#footer-form"]'),n=document.querySelectorAll('[data-ph="book-a-demo"]');document.querySelectorAll('[type="submit"]').forEach(o=>{o.addEventListener("click",function(){let s=u(this);setTimeout(()=>{window.validationPassed===!0&&i("fynd_form_submitted",s?{submitted_form:s}:{})},100)})}),r.forEach(o=>{o.addEventListener("click",function(){i("fynd_clicked_sign_up")})}),t.forEach(o=>{o.addEventListener("click",function(){i("fynd_clicked_sign_in")})}),e.forEach(o=>{o.addEventListener("click",function(){i("fynd_clicked_scroll_to_form")})}),n.forEach(o=>{o.addEventListener("click",function(){i("fynd_clicked_book_a_demo")})});let f=document.querySelectorAll("[ph-form-field]"),m=new Set;f.forEach(o=>{let s=o.tagName.toLowerCase()==="select"?"change":"input";o.addEventListener(s,function(){let d=u(this)||"unknown-form";m.has(d)||(m.add(d),i("fynd_form_started"))})})});window.getPosthogTrackingProperties=a;window.trackEvent=i;})();
1
+ "use strict";(()=>{var u=()=>{let r={};try{let t=null;if(typeof window.getUserJourney=="function"&&(t=window.getUserJourney()),!t){let e=sessionStorage.getItem("userJourney");e&&(t=JSON.parse(e))}if(t&&t.formDetails){let e=t.formDetails;e.formId&&(r.form_id=e.formId),e.formName&&(r.form_name=e.formName),e.firstName&&(r.form_first_name=e.firstName),e.lastName&&(r.form_last_name=e.lastName),e.email&&(r.form_email=e.email),e.phone&&(r.form_phone=e.phone)}}catch(t){console.warn("Error getting user journey data for GA tracking:",t)}return r},f=()=>{let t={"fynd_website.source_page":window.location.pathname,"fynd_website.product":"fynd.com website","fynd_website.device_type":"Unknown","fynd_website.utm_source":new URLSearchParams(window.location.search).get("utm_source")||"","fynd_website.utm_medium":new URLSearchParams(window.location.search).get("utm_medium")||"","fynd_website.utm_campaign":new URLSearchParams(window.location.search).get("utm_campaign")||"","fynd_website.referrer":document.referrer};try{let e=null;if(typeof window.getUserJourney=="function"&&(e=window.getUserJourney()),!e){let n=sessionStorage.getItem("userJourney");n&&(e=JSON.parse(n))}if(e){if(t["fynd_website.journey_touchpoints"]=e.userJourney||e,e.formDetails){let n=e.formDetails;n.formId&&(t["fynd_website.form_id"]=n.formId),n.formName&&(t["fynd_website.form_name"]=n.formName),n.firstName&&(t["fynd_website.form_first_name"]=n.firstName),n.lastName&&(t["fynd_website.form_last_name"]=n.lastName),n.email&&(t["fynd_website.form_email"]=n.email),n.phone&&(t["fynd_website.form_phone"]=n.phone)}if(e.userJourney&&e.userJourney.length>0){t["fynd_website.journey_total_pages"]=e.userJourney.length,t["fynd_website.journey_touchpoints_count"]=e.userJourney.length,t["fynd_website.journey_first_page"]=e.userJourney[0].page,t["fynd_website.journey_current_page"]=e.userJourney[e.userJourney.length-1].page;let n=new Date(e.userJourney[0].time),s=new Date(e.userJourney[e.userJourney.length-1].time);t["fynd_website.journey_session_duration"]=Math.floor((s.getTime()-n.getTime())/1e3),t["fynd_website.journey_entry_time"]=e.userJourney[0].time,t["fynd_website.journey_exit_time"]=e.userJourney[e.userJourney.length-1].time}e.deviceCategory&&(t["fynd_website.device_type"]=e.deviceCategory),e.browser&&(t["fynd_website.journey_browser"]=e.browser),e.device&&(t["fynd_website.journey_device"]=e.device),e.origin&&(t["fynd_website.journey_origin"]=e.origin),e.utmPath&&(t["fynd_website.journey_utm_path"]=e.utmPath),e.scrollDepth&&(t["fynd_website.journey_scroll_depth"]=e.scrollDepth)}}catch(e){console.warn("Error getting user journey data for tracking:",e)}if(t["fynd_website.device_type"]==="Unknown"){let e=navigator.userAgent;/iPad/.test(e)||/Android/.test(e)&&!/Mobile/.test(e)||/Tablet/.test(e)?t["fynd_website.device_type"]="Tablet":/Mobile|iPhone|Android|BlackBerry|Opera Mini|IEMobile|WPDesktop/.test(e)?t["fynd_website.device_type"]="Mobile":t["fynd_website.device_type"]="Desktop"}return t},g=(r,t,e)=>{if(window.dataLayer){let n={event:r,event_category:"form_interaction",event_label:r,...t};e?.submitted_form&&(n.submitted_form=e.submitted_form),window.dataLayer.push(n),console.log("Event sent to GA:",n)}else console.log("dataLayer not available for GA tracking")},o=(r,t)=>{try{let e=f(),n=t?{...e,...t}:e;window.posthog&&window.posthog.capture(r,n);let s=u();(r.includes("form")||Object.keys(s).length>0||t?.submitted_form)&&g(r,s,t)}catch(e){console.error("Error tracking event:",e)}},_=r=>{let t=r.closest("form");return t&&(t.getAttribute("data-name")||t.getAttribute("name")||t.id)||null};document.addEventListener("DOMContentLoaded",function(){let r=f();window.posthog&&window.posthog.capture("$pageview",r)});window.addEventListener("load",function(){let r=f();console.log("Tracking Properties on Page Load:",r),o("fynd_website.page.loaded"),l()});function l(){if(window.location.pathname==="/thank-you"){let t=performance.getEntriesByType("navigation");t.length>0&&(t[0].type==="reload"||document.referrer&&new URL(document.referrer).origin===window.location.origin)&&setTimeout(()=>{o("fynd_website.form.success")},200)}}document.addEventListener("DOMContentLoaded",function(){let r=document.querySelectorAll('[data-ph="sign-up"]'),t=document.querySelectorAll('[data-ph="sign-in"]'),e=document.querySelectorAll('[href="#footer-form"]'),n=document.querySelectorAll('[data-ph="book-a-demo"]');document.querySelectorAll('[type="submit"]').forEach(i=>{i.addEventListener("click",function(){let a=_(this);setTimeout(()=>{window.validationPassed===!0&&o("fynd_website.form.submitted",a?{submitted_form:a}:{})},100)})}),r.forEach(i=>{i.addEventListener("click",function(){o("fynd_website.sign_up.clicked")})}),t.forEach(i=>{i.addEventListener("click",function(){o("fynd_website.sign_in.clicked")})}),e.forEach(i=>{i.addEventListener("click",function(){o("fynd_website.scroll_to_form.clicked")})}),n.forEach(i=>{i.addEventListener("click",function(){o("fynd_website.book_a_demo.clicked")})});let d=document.querySelectorAll("[ph-form-field]"),m=new Set;d.forEach(i=>{let a=i.tagName.toLowerCase()==="select"?"change":"input";i.addEventListener(a,function(){let c=_(this)||"unknown-form";m.has(c)||(m.add(c),o("fynd_website.form.started"))})})});window.getPosthogTrackingProperties=f;window.trackEvent=o;window.getGaTrackingProperties=u;})();
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../bin/live-reload.js", "../../src/posthog/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", "// trackingIntegration.ts - PostHog tracking with user journey integration\nimport { FormDetails } from '../utils/types/user-journey';\n\n// Define tracking properties interface\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 // Form details from user journey\n form_id?: string;\n form_name?: string;\n form_first_name?: string;\n form_last_name?: string;\n form_email?: string;\n form_phone?: string;\n // User journey details\n journey_total_pages?: number;\n journey_session_duration?: number;\n journey_first_page?: string;\n journey_current_page?: string;\n journey_device_category?: string;\n journey_browser?: string;\n journey_origin?: string;\n // Complete user journey data\n user_journey?: any; // Array of touchpoints from userJourney field\n // Additional event-specific properties\n submitted_form?: string;\n [key: string]: any; // Allow additional properties\n}\n\ndeclare global {\n interface Window {\n trackEvent: (eventName: string, properties?: Partial<TrackingProperties>) => void;\n getPosthogTrackingProperties: () => TrackingProperties;\n }\n}\n\n// Enhanced tracking properties function\nconst getPosthogTrackingProperties = (): TrackingProperties => {\n const pathname: string = window.location.pathname;\n\n // Base tracking properties\n const baseProperties: TrackingProperties = {\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 // Get user journey data if available\n try {\n // Try to get from getUserJourney function first\n let journey = null;\n if (typeof (window as any).getUserJourney === 'function') {\n journey = (window as any).getUserJourney();\n }\n\n // If not available from function, try to get directly from sessionStorage\n if (!journey) {\n const storedData = sessionStorage.getItem('userJourney');\n if (storedData) {\n journey = JSON.parse(storedData);\n }\n }\n\n if (journey) {\n // Add the complete user journey object\n baseProperties.user_journey = journey.userJourney || journey;\n\n // Add form details if available\n if (journey.formDetails) {\n const formDetails: FormDetails = journey.formDetails;\n\n // Only add form properties if they have values\n if (formDetails.formId) {\n baseProperties.form_id = formDetails.formId;\n }\n if (formDetails.formName) {\n baseProperties.form_name = formDetails.formName;\n }\n if (formDetails.firstName) {\n baseProperties.form_first_name = formDetails.firstName;\n }\n if (formDetails.lastName) {\n baseProperties.form_last_name = formDetails.lastName;\n }\n if (formDetails.email) {\n baseProperties.form_email = formDetails.email;\n }\n if (formDetails.phone) {\n baseProperties.form_phone = formDetails.phone;\n }\n }\n\n // Add journey metadata\n if (journey.userJourney && journey.userJourney.length > 0) {\n baseProperties.journey_total_pages = journey.userJourney.length;\n baseProperties.journey_first_page = journey.userJourney[0].page;\n baseProperties.journey_current_page = journey.userJourney[journey.userJourney.length - 1].page;\n\n // Calculate session duration\n const firstVisit = new Date(journey.userJourney[0].time);\n const lastVisit = new Date(journey.userJourney[journey.userJourney.length - 1].time);\n baseProperties.journey_session_duration = Math.floor((lastVisit.getTime() - firstVisit.getTime()) / 1000);\n }\n\n // Add device and browser info from journey\n if (journey.deviceCategory) {\n baseProperties.journey_device_category = journey.deviceCategory;\n }\n if (journey.browser) {\n baseProperties.journey_browser = journey.browser;\n }\n if (journey.origin) {\n baseProperties.journey_origin = journey.origin;\n }\n }\n } catch (error) {\n console.warn('Error getting user journey data for tracking:', error);\n }\n\n return baseProperties;\n};\n\n// Track event function\nconst trackEvent = (eventName: string, properties?: Partial<TrackingProperties>): void => {\n try {\n const trackingProps = getPosthogTrackingProperties();\n\n // Merge with additional properties if provided\n const finalProperties = properties ? { ...trackingProps, ...properties } : trackingProps;\n\n // Track with PostHog if available\n if ((window as any).posthog) {\n (window as any).posthog.capture(eventName, finalProperties);\n }\n\n // Optional: Console log for debugging (remove in production)\n // console.log('Tracked event:', eventName, finalProperties);\n } catch (error) {\n console.error('Error tracking event:', error);\n }\n};\n\n// Helper function to get parent form name\nconst getParentFormName = (element: HTMLElement): string | null => {\n const parentForm = element.closest(\"form\") as HTMLFormElement | null;\n if (parentForm) {\n return parentForm.getAttribute(\"data-name\") ||\n parentForm.getAttribute(\"name\") ||\n parentForm.id ||\n null;\n }\n return null;\n};\n\n// Initialize PostHog pageview\ndocument.addEventListener(\"DOMContentLoaded\", function (): void {\n const trackingProps = getPosthogTrackingProperties();\n\n // PostHog pageview\n if ((window as any).posthog) {\n (window as any).posthog.capture(\"$pageview\", trackingProps);\n }\n});\n\n// Track page load event\nwindow.addEventListener(\"load\", function (): void {\n trackEvent(\"fynd_page_loaded\");\n\n // Check if this is the thank you page and trigger form success event\n checkThankYouPageEvent();\n});\n\n// Function to check and trigger thank you page event\nfunction checkThankYouPageEvent(): void {\n const currentPath = window.location.pathname;\n\n // Check if current page is thank you page\n if (currentPath === '/thank-you') {\n // Check if this is a page reload (not initial navigation)\n const navigationEntries = performance.getEntriesByType('navigation');\n if (navigationEntries.length > 0) {\n const navEntry = navigationEntries[0] as PerformanceNavigationTiming;\n\n // Check if it's a reload (type === 'reload') or if there's a referrer from the same origin\n const isReload = navEntry.type === 'reload' ||\n (document.referrer && new URL(document.referrer).origin === window.location.origin);\n\n if (isReload) {\n // Trigger event after 200ms delay\n setTimeout(() => {\n trackEvent(\"fynd_form_success\");\n }, 200);\n }\n }\n }\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 // Additional properties can be added here if needed\n const additionalProps = formName ? { submitted_form: formName } : {};\n trackEvent(\"fynd_form_submitted\", additionalProps);\n }\n }, 100);\n });\n });\n\n signUpButtons.forEach((button: Element) => {\n button.addEventListener(\"click\", function (): void {\n trackEvent(\"fynd_clicked_sign_up\");\n });\n });\n\n signInButtons.forEach((button: Element) => {\n button.addEventListener(\"click\", function (): void {\n trackEvent(\"fynd_clicked_sign_in\");\n });\n });\n\n scrollToFormButtons.forEach((button: Element) => {\n button.addEventListener(\"click\", function (): void {\n trackEvent(\"fynd_clicked_scroll_to_form\");\n });\n });\n\n bookADemoButtons.forEach((button: Element) => {\n button.addEventListener(\"click\", function (): void {\n trackEvent(\"fynd_clicked_book_a_demo\");\n });\n });\n});\n\n// Make functions globally accessible\nwindow.getPosthogTrackingProperties = getPosthogTrackingProperties;\nwindow.trackEvent = trackEvent;\n\n// Export for module usage\nexport {\n getPosthogTrackingProperties,\n trackEvent,\n getParentFormName,\n type TrackingProperties\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", "// trackingIntegration.ts - PostHog tracking with user journey integration\nimport { FormDetails, UserJourney } from '../utils/types/user-journey';\n\n// TypeScript interface for GTM dataLayer events\ninterface GTMEvent {\n event: string;\n event_category: string;\n event_label: string;\n form_id?: string;\n form_name?: string;\n form_first_name?: string;\n form_last_name?: string;\n form_email?: string;\n form_phone?: string;\n submitted_form?: string;\n [key: string]: any; // Allow additional properties\n}\n\n// GA tracking properties interface (form-related only)\ninterface GATrackingProperties {\n form_id?: string;\n form_name?: string;\n form_first_name?: string;\n form_last_name?: string;\n form_email?: string;\n form_phone?: string;\n submitted_form?: string;\n}\n\n// Define tracking properties interface\ninterface TrackingProperties {\n 'fynd_website.source_page': string;\n 'fynd_website.product': string;\n 'fynd_website.device_type': string;\n 'fynd_website.utm_source': string;\n 'fynd_website.utm_medium': string;\n 'fynd_website.utm_campaign': string;\n 'fynd_website.referrer': string;\n // Form details from user journey\n 'fynd_website.form_id'?: string;\n 'fynd_website.form_name'?: string;\n 'fynd_website.form_first_name'?: string;\n 'fynd_website.form_last_name'?: string;\n 'fynd_website.form_email'?: string;\n 'fynd_website.form_phone'?: string;\n // User journey details\n 'fynd_website.journey_total_pages'?: number;\n 'fynd_website.journey_session_duration'?: number;\n 'fynd_website.journey_first_page'?: string;\n 'fynd_website.journey_current_page'?: string;\n 'fynd_website.journey_device'?: string;\n 'fynd_website.journey_browser'?: string;\n 'fynd_website.journey_device_name'?: string;\n 'fynd_website.journey_origin'?: string;\n 'fynd_website.journey_touchpoints'?: any; // Array of touchpoints from userJourney field\n 'fynd_website.journey_touchpoints_count'?: number;\n 'fynd_website.journey_utm_path'?: string;\n 'fynd_website.journey_entry_time'?: string;\n 'fynd_website.journey_exit_time'?: string;\n 'fynd_website.journey_scroll_depth'?: number;\n // Additional event-specific properties\n submitted_form?: string;\n field_type?: string;\n field_name?: string;\n [key: string]: any; // Allow additional properties\n}\n\ndeclare global {\n interface Window {\n trackEvent: (eventName: string, properties?: any) => void;\n getPosthogTrackingProperties: () => TrackingProperties;\n getGaTrackingProperties: () => GATrackingProperties;\n validationPassed?: boolean;\n getUserJourney: () => UserJourney | null;\n dataLayer?: GTMEvent[];\n }\n}\n\n// GA tracking properties function (form-related data only)\nconst getGaTrackingProperties = (): GATrackingProperties => {\n const gaProperties: GATrackingProperties = {};\n\n // Get user journey data if available\n try {\n // Try to get from getUserJourney function first\n let journey = null;\n if (typeof (window as any).getUserJourney === 'function') {\n journey = (window as any).getUserJourney();\n }\n\n // If not available from function, try to get directly from sessionStorage\n if (!journey) {\n const storedData = sessionStorage.getItem('userJourney');\n if (storedData) {\n journey = JSON.parse(storedData);\n }\n }\n\n if (journey && journey.formDetails) {\n const formDetails: FormDetails = journey.formDetails;\n\n // Only add form properties if they have values\n if (formDetails.formId) {\n gaProperties.form_id = formDetails.formId;\n }\n if (formDetails.formName) {\n gaProperties.form_name = formDetails.formName;\n }\n if (formDetails.firstName) {\n gaProperties.form_first_name = formDetails.firstName;\n }\n if (formDetails.lastName) {\n gaProperties.form_last_name = formDetails.lastName;\n }\n if (formDetails.email) {\n gaProperties.form_email = formDetails.email;\n }\n if (formDetails.phone) {\n gaProperties.form_phone = formDetails.phone;\n }\n }\n } catch (error) {\n console.warn('Error getting user journey data for GA tracking:', error);\n }\n\n return gaProperties;\n};\n\n// Enhanced tracking properties function\nconst getPosthogTrackingProperties = (): TrackingProperties => {\n const pathname: string = window.location.pathname;\n\n // Base tracking properties\n const baseProperties: TrackingProperties = {\n 'fynd_website.source_page': pathname,\n 'fynd_website.product': \"fynd.com website\",\n 'fynd_website.device_type': \"Unknown\", // Will be updated from user journey\n 'fynd_website.utm_source':\n new URLSearchParams(window.location.search).get(\"utm_source\") || \"\",\n 'fynd_website.utm_medium':\n new URLSearchParams(window.location.search).get(\"utm_medium\") || \"\",\n 'fynd_website.utm_campaign':\n new URLSearchParams(window.location.search).get(\"utm_campaign\") || \"\",\n 'fynd_website.referrer': document.referrer,\n };\n\n // Get user journey data if available\n try {\n // Try to get from getUserJourney function first\n let journey = null;\n if (typeof (window as any).getUserJourney === 'function') {\n journey = (window as any).getUserJourney();\n }\n\n // If not available from function, try to get directly from sessionStorage\n if (!journey) {\n const storedData = sessionStorage.getItem('userJourney');\n if (storedData) {\n journey = JSON.parse(storedData);\n }\n }\n\n if (journey) {\n // Add the complete user journey object as touchpoints\n baseProperties['fynd_website.journey_touchpoints'] = journey.userJourney || journey;\n\n // Add form details if available\n if (journey.formDetails) {\n const formDetails: FormDetails = journey.formDetails;\n\n // Only add form properties if they have values\n if (formDetails.formId) {\n baseProperties['fynd_website.form_id'] = formDetails.formId;\n }\n if (formDetails.formName) {\n baseProperties['fynd_website.form_name'] = formDetails.formName;\n }\n if (formDetails.firstName) {\n baseProperties['fynd_website.form_first_name'] = formDetails.firstName;\n }\n if (formDetails.lastName) {\n baseProperties['fynd_website.form_last_name'] = formDetails.lastName;\n }\n if (formDetails.email) {\n baseProperties['fynd_website.form_email'] = formDetails.email;\n }\n if (formDetails.phone) {\n baseProperties['fynd_website.form_phone'] = formDetails.phone;\n }\n }\n\n // Add journey metadata\n if (journey.userJourney && journey.userJourney.length > 0) {\n baseProperties['fynd_website.journey_total_pages'] = journey.userJourney.length;\n baseProperties['fynd_website.journey_touchpoints_count'] = journey.userJourney.length;\n baseProperties['fynd_website.journey_first_page'] = journey.userJourney[0].page;\n baseProperties['fynd_website.journey_current_page'] = journey.userJourney[journey.userJourney.length - 1].page;\n\n // Calculate session duration\n const firstVisit = new Date(journey.userJourney[0].time);\n const lastVisit = new Date(journey.userJourney[journey.userJourney.length - 1].time);\n baseProperties['fynd_website.journey_session_duration'] = Math.floor((lastVisit.getTime() - firstVisit.getTime()) / 1000);\n \n // Add entry and exit times\n baseProperties['fynd_website.journey_entry_time'] = journey.userJourney[0].time;\n baseProperties['fynd_website.journey_exit_time'] = journey.userJourney[journey.userJourney.length - 1].time;\n }\n\n // Add device and browser info from journey\n if (journey.deviceCategory) {\n // Device category is already capitalized from user journey\n baseProperties['fynd_website.device_type'] = journey.deviceCategory;\n }\n if (journey.browser) {\n baseProperties['fynd_website.journey_browser'] = journey.browser;\n }\n if (journey.device) {\n baseProperties['fynd_website.journey_device'] = journey.device;\n }\n if (journey.origin) {\n baseProperties['fynd_website.journey_origin'] = journey.origin;\n }\n \n // Add UTM path if available\n if (journey.utmPath) {\n baseProperties['fynd_website.journey_utm_path'] = journey.utmPath;\n }\n \n // Add scroll depth if available\n if (journey.scrollDepth) {\n baseProperties['fynd_website.journey_scroll_depth'] = journey.scrollDepth;\n }\n }\n } catch (error) {\n console.warn('Error getting user journey data for tracking:', error);\n }\n\n // Fallback device type calculation if user journey isn't available\n if (baseProperties['fynd_website.device_type'] === \"Unknown\") {\n const userAgent = navigator.userAgent;\n \n // Check for tablets first\n if (/iPad/.test(userAgent) || \n (/Android/.test(userAgent) && !/Mobile/.test(userAgent)) ||\n /Tablet/.test(userAgent)) {\n baseProperties['fynd_website.device_type'] = \"Tablet\";\n }\n // Check for mobile devices\n else if (/Mobile|iPhone|Android|BlackBerry|Opera Mini|IEMobile|WPDesktop/.test(userAgent)) {\n baseProperties['fynd_website.device_type'] = \"Mobile\";\n }\n // Default to desktop\n else {\n baseProperties['fynd_website.device_type'] = \"Desktop\";\n }\n }\n\n return baseProperties;\n};\n\n// Function to send event to GA via dataLayer\nconst sendToGA = (eventName: string, gaProperties: GATrackingProperties, additionalProperties?: any): void => {\n if ((window as any).dataLayer) {\n const eventData: GTMEvent = {\n event: eventName,\n event_category: 'form_interaction',\n event_label: eventName,\n ...gaProperties\n };\n\n // Add submitted_form from additional properties if available\n if (additionalProperties?.submitted_form) {\n eventData.submitted_form = additionalProperties.submitted_form;\n }\n\n (window as any).dataLayer.push(eventData);\n console.log('Event sent to GA:', eventData);\n } else {\n console.log('dataLayer not available for GA tracking');\n }\n};\n\n// Track event function\nconst trackEvent = (eventName: string, properties?: Partial<TrackingProperties>): void => {\n try {\n // Get PostHog tracking properties (all data)\n const trackingProps = getPosthogTrackingProperties();\n\n // Merge with additional properties if provided\n const finalProperties = properties ? { ...trackingProps, ...properties } : trackingProps;\n\n // Track with PostHog if available\n if ((window as any).posthog) {\n (window as any).posthog.capture(eventName, finalProperties);\n }\n\n // Get GA tracking properties (form-related data only)\n const gaProperties = getGaTrackingProperties();\n\n // Only send to GA if there's form-related data or it's a form-related event\n const isFormRelatedEvent = eventName.includes('form') || \n Object.keys(gaProperties).length > 0 || \n properties?.submitted_form;\n\n if (isFormRelatedEvent) {\n sendToGA(eventName, gaProperties, properties);\n }\n\n // Optional: Console log for debugging (remove in production)\n // console.log('Tracked event:', eventName, finalProperties);\n } catch (error) {\n console.error('Error tracking event:', error);\n }\n};\n\n// Helper function to get parent form name\nconst getParentFormName = (element: HTMLElement): string | null => {\n const parentForm = element.closest(\"form\") as HTMLFormElement | null;\n if (parentForm) {\n return parentForm.getAttribute(\"data-name\") ||\n parentForm.getAttribute(\"name\") ||\n parentForm.id ||\n null;\n }\n return null;\n};\n\n// Initialize PostHog pageview\ndocument.addEventListener(\"DOMContentLoaded\", function (): void {\n const trackingProps = getPosthogTrackingProperties();\n\n // PostHog pageview\n if ((window as any).posthog) {\n (window as any).posthog.capture(\"$pageview\", trackingProps);\n }\n});\n\n// Track page load event\nwindow.addEventListener(\"load\", function (): void {\n const trackingProps = getPosthogTrackingProperties();\n console.log(\"Tracking Properties on Page Load:\", trackingProps);\n \n trackEvent(\"fynd_website.page.loaded\");\n\n // Check if this is the thank you page and trigger form success event\n checkThankYouPageEvent();\n});\n\n// Function to check and trigger thank you page event\nfunction checkThankYouPageEvent(): void {\n const currentPath = window.location.pathname;\n\n // Check if current page is thank you page\n if (currentPath === '/thank-you') {\n // Check if this is a page reload (not initial navigation)\n const navigationEntries = performance.getEntriesByType('navigation');\n if (navigationEntries.length > 0) {\n const navEntry = navigationEntries[0] as PerformanceNavigationTiming;\n\n // Check if it's a reload (type === 'reload') or if there's a referrer from the same origin\n const isReload = navEntry.type === 'reload' ||\n (document.referrer && new URL(document.referrer).origin === window.location.origin);\n\n if (isReload) {\n // Trigger event after 200ms delay\n setTimeout(() => {\n trackEvent(\"fynd_website.form.success\");\n }, 200);\n }\n }\n }\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 // Additional properties can be added here if needed\n const additionalProps = formName ? { submitted_form: formName } : {};\n trackEvent(\"fynd_website.form.submitted\", additionalProps);\n }\n }, 100);\n });\n });\n\n signUpButtons.forEach((button: Element) => {\n button.addEventListener(\"click\", function (): void {\n trackEvent(\"fynd_website.sign_up.clicked\");\n });\n });\n\n signInButtons.forEach((button: Element) => {\n button.addEventListener(\"click\", function (): void {\n trackEvent(\"fynd_website.sign_in.clicked\");\n });\n });\n\n scrollToFormButtons.forEach((button: Element) => {\n button.addEventListener(\"click\", function (): void {\n trackEvent(\"fynd_website.scroll_to_form.clicked\");\n });\n });\n\n bookADemoButtons.forEach((button: Element) => {\n button.addEventListener(\"click\", function (): void {\n trackEvent(\"fynd_website.book_a_demo.clicked\");\n });\n });\n\n // Form field change tracking for fynd_form_started event\n const formFields = document.querySelectorAll('[ph-form-field]') as NodeListOf<HTMLElement>;\n \n // Set to track which forms have already triggered the event\n const triggeredForms = new Set<string>();\n\n formFields.forEach((field: HTMLElement) => {\n // Handle different input types\n const eventType = field.tagName.toLowerCase() === 'select' ? 'change' : 'input';\n \n field.addEventListener(eventType, function (this: HTMLElement): void {\n const formName = getParentFormName(this);\n const formIdentifier = formName || 'unknown-form';\n \n // Only trigger once per form to avoid duplicate events\n if (!triggeredForms.has(formIdentifier)) {\n triggeredForms.add(formIdentifier);\n \n trackEvent(\"fynd_website.form.started\");\n }\n });\n });\n});\n\n// Make functions globally accessible\nwindow.getPosthogTrackingProperties = getPosthogTrackingProperties;\nwindow.trackEvent = trackEvent;\nwindow.getGaTrackingProperties = getGaTrackingProperties;\n\n// Export for module usage\nexport {\n getPosthogTrackingProperties,\n getGaTrackingProperties,\n trackEvent,\n sendToGA,\n getParentFormName,\n type TrackingProperties,\n type GATrackingProperties,\n type GTMEvent\n};"],
5
+ "mappings": "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",
6
6
  "names": []
7
7
  }
@@ -1 +1 @@
1
- "use strict";(()=>{async function f(){let e="userJourney";function t(){let n=navigator.userAgent;return/tablet|ipad|playbook|silk/i.test(n)?"tablet":/mobile|iphone|ipod|android|blackberry|opera|mini|windows\sce|palm|smartphone|iemobile/i.test(n)?"mobile":"desktop"}function a(){let n=navigator.userAgent;return n.includes("Chrome")&&!n.includes("Edg")?"Chrome":n.includes("Firefox")?"Firefox":n.includes("Safari")&&!n.includes("Chrome")?"Safari":n.includes("Edg")?"Edge":n.includes("Opera")?"Opera":"Unknown"}function s(n){if(!n)return"Unknown";try{let u=new URL(n).hostname.replace(/^www\./,""),m=u.split(".");return m.length>=2?m[0]:u||"Unknown"}catch{return"Unknown"}}function d(n,o){let i=new URLSearchParams(window.location.search),u=i.has("utm_source")||i.has("utm_medium")||i.has("utm_campaign");return n||u?u?{source:i.get("utm_source")||"",medium:i.get("utm_medium")||"",campaign:i.get("utm_campaign")||""}:{source:s(document.referrer),medium:"organic",campaign:"unknown"}:o||{source:"Unknown",medium:"organic",campaign:"unknown"}}function h(){try{return typeof window.pageCategories<"u"&&Array.isArray(window.pageCategories)&&window.pageCategories.length>0?window.pageCategories:["Not applicable"]}catch(n){return console.warn("Error accessing pageCategories:",n),["Not applicable"]}}function w(){let n=new URLSearchParams(window.location.search);return n.has("utm_source")||n.has("utm_medium")||n.has("utm_campaign")}function J(n){let o=n.split("?")[0].toLowerCase(),i={exactMatches:{"/":"Home","/home":"Home","/blog":"Blog listing","/about-us":"About us","/contact-us":"Contact","/privacy-policy":"Privacy policy","/terms-of-service":"Terms of service","/careers":"Careers","/customer-stories":"Customer stories listing","/events":"Events listing","/infographics":"Infographics listing","/newsroom":"Newsroom","/releases":"Releases listing"},pathStartsWith:[{pattern:"/blog/",type:"Blog"},{pattern:"/customer-stories/",type:"Customer story"},{pattern:"/case-studies/",type:"Case study"},{pattern:"/solutions/",type:"Solution"},{pattern:"/events/",type:"Event"},{pattern:"/news/",type:"News"},{pattern:"/press-releases/",type:"Press release"},{pattern:"/releases/",type:"Release"}]};if(i.exactMatches[o])return i.exactMatches[o];for(let u of i.pathStartsWith)if(o.startsWith(u.pattern))return u.type;return"Other"}function D(n){if(!n.userJourney||n.userJourney.length===0)return!1;let o=new Date(n.userJourney[n.userJourney.length-1].time);return new Date().getTime()-o.getTime()<18e5}return new Promise(n=>{setTimeout(()=>{try{let o=null,i=sessionStorage.getItem(e);if(i){let c=JSON.parse(i);D(c)&&(o=c)}o||(o={userJourney:[],origin:window.location.hostname,deviceCategory:t(),browser:a(),formDetails:{formId:"",formName:"",firstName:"",lastName:"",email:"",phone:""}}),o.formDetails||(o.formDetails={formId:"",formName:"",firstName:"",lastName:"",email:"",phone:""});let u=window.location.pathname,m=new Date().toISOString(),y=o.userJourney[o.userJourney.length-1];if(y&&y.page===u)y.time=m;else{let c=o.userJourney.length===0,S=c?void 0:o.userJourney[0].utm,b={touchPoint:o.userJourney.length+1,page:u,title:document.title||"Untitled",type:J(u),category:h(),time:m,utmVisibility:w()?"visible":"hidden",utm:d(c,S)};o.userJourney.push(b)}sessionStorage.setItem(e,JSON.stringify(o)),p(),n(o)}catch(o){console.error("Error tracking user journey:",o),n(null)}},200)})}function p(){document.querySelectorAll("input[ph-form-field], textarea[ph-form-field], select[ph-form-field]").forEach(t=>{t.removeEventListener("input",g),t.removeEventListener("change",g)}),document.querySelectorAll("input[ph-form-field], textarea[ph-form-field], select[ph-form-field]").forEach(t=>{t.addEventListener("input",g),t.addEventListener("change",g)}),U()}function U(){let e=l();if(!e)return;let r=document.querySelector("[ph-form-name]");if(!r)return;let t=r.getAttribute("ph-form-name"),a=r.getAttribute("ph-form-id")||"form-1";t&&(e.formDetails.formName||(e.formDetails.formId=a,e.formDetails.formName=t),sessionStorage.setItem("userJourney",JSON.stringify(e)))}function g(e){let r=e.target,t=r.getAttribute("ph-form-field");if(!t)return;let a=r.closest("[ph-form-name]");if(!a)return;let s=a.getAttribute("ph-form-name"),d=a.getAttribute("ph-form-id")||"form-1";s&&T(s,d,t,r.value)}function T(e,r,t,a){try{let s=l();if(!s)return!1;switch(s.formDetails.formId=r,s.formDetails.formName=e,t){case"firstName":s.formDetails.firstName=a;break;case"lastName":s.formDetails.lastName=a;break;case"email":s.formDetails.email=a;break;case"phone":s.formDetails.phone=a;break;default:return console.warn(`Unknown field: ${t}`),!1}return sessionStorage.setItem("userJourney",JSON.stringify(s)),!0}catch(s){return console.error("Error updating form data:",s),!1}}function l(){try{let e=sessionStorage.getItem("userJourney");return e?JSON.parse(e):null}catch(e){return console.error("Error getting user journey:",e),null}}function P(){sessionStorage.removeItem("userJourney")}function F(e){try{let r=l();if(!r||r.userJourney.length===0)return!1;let t=r.userJourney[r.userJourney.length-1];return t.category=e.length>0?e:["Not applicable"],sessionStorage.setItem("userJourney",JSON.stringify(r)),!0}catch(r){return console.error("Error updating page categories:",r),!1}}function N(e){try{let r=l();if(!r||r.userJourney.length===0)return!1;let t=r.userJourney[r.userJourney.length-1];return t.type=e,sessionStorage.setItem("userJourney",JSON.stringify(r)),!0}catch(r){return console.error("Error updating page type:",r),!1}}function k(){let e=l();if(!e||e.userJourney.length===0)return null;let r=e.userJourney[0],t=e.userJourney[e.userJourney.length-1],a=new Date(t.time).getTime()-new Date(r.time).getTime();return{totalPages:e.userJourney.length,sessionDuration:Math.floor(a/1e3),firstPage:r.page,lastPage:t.page}}function v(){let e=l();return e?e.formDetails:null}function E(e){let r=l();return r&&r.formDetails[e]||null}function C(e,r){try{let t=l();return t?(t.formDetails[e]=r,sessionStorage.setItem("userJourney",JSON.stringify(t)),!0):!1}catch(t){return console.error("Error setting form data:",t),!1}}function I(e,r){try{let t=l();return t?(t.formDetails.formId=e,t.formDetails.formName=r,sessionStorage.setItem("userJourney",JSON.stringify(t)),!0):!1}catch(t){return console.error("Error setting form details:",t),!1}}function M(){p()}document.addEventListener("DOMContentLoaded",()=>{f()});document.readyState==="loading"?document.addEventListener("DOMContentLoaded",()=>{f()}):f();window.trackUserJourney=f;window.getUserJourney=l;window.clearUserJourney=P;window.updatePageType=N;window.updatePageCategories=F;window.getJourneyStats=k;window.getFormData=v;window.getFormFieldValue=E;window.setFormData=C;window.setFormDetails=I;window.reinitializeFormTracking=M;})();
1
+ "use strict";(()=>{async function g(){let r="userJourney";function n(){let e=navigator.userAgent;return/tablet|ipad|playbook|silk/i.test(e)?"Tablet":/mobile|iphone|ipod|android|blackberry|opera|mini|windows\sce|palm|smartphone|iemobile/i.test(e)?"Mobile":"Desktop"}function a(){let e=navigator.userAgent;return e.includes("Chrome")&&!e.includes("Edg")?"Chrome":e.includes("Firefox")?"Firefox":e.includes("Safari")&&!e.includes("Chrome")?"Safari":e.includes("Edg")?"Edge":e.includes("Opera")?"Opera":"Unknown"}function s(){let e=navigator.userAgent;if(/iPhone/.test(e)){let i=e.match(/iPhone\s*([^;]*)/);return i?`iPhone ${i[1].trim()}`:"iPhone"}if(/iPad/.test(e)){let i=e.match(/iPad\s*([^;]*)/);return i?`iPad ${i[1].trim()}`:"iPad"}if(/Android/.test(e)){let i=e.match(/;\s*([^)]*)\s*\)/);return i&&i[1].trim().replace(/wv/g,"").replace(/Build\/.*$/g,"").replace(/\s+/g," ").trim()||"Android Device"}return/Windows/.test(e)?/Windows NT 10/.test(e)?"Windows 10/11 PC":/Windows NT 6\.3/.test(e)?"Windows 8.1 PC":/Windows NT 6\.2/.test(e)?"Windows 8 PC":/Windows NT 6\.1/.test(e)?"Windows 7 PC":"Windows PC":/Macintosh/.test(e)?/Intel/.test(e)?"Mac (Intel)":/Apple Silicon|ARM64/.test(e)?"Mac (Apple Silicon)":"Mac":/Linux/.test(e)?"Linux PC":/BlackBerry/.test(e)?"BlackBerry":/Windows Phone/.test(e)?"Windows Phone":n().charAt(0).toUpperCase()}function d(e){if(!e)return"Unknown";try{let u=new URL(e).hostname.replace(/^www\./,""),c=u.split(".");return c.length>=2?c[0]:u||"Unknown"}catch{return"Unknown"}}function h(e,o){let i=new URLSearchParams(window.location.search),u=i.has("utm_source")||i.has("utm_medium")||i.has("utm_campaign");return e||u?u?{source:i.get("utm_source")||"",medium:i.get("utm_medium")||"",campaign:i.get("utm_campaign")||""}:{source:d(document.referrer),medium:"organic",campaign:"unknown"}:o||{source:"Unknown",medium:"organic",campaign:"unknown"}}function w(){try{return typeof window.pageCategories<"u"&&Array.isArray(window.pageCategories)&&window.pageCategories.length>0?window.pageCategories:["Not applicable"]}catch(e){return console.warn("Error accessing pageCategories:",e),["Not applicable"]}}function J(){let e=new URLSearchParams(window.location.search);return e.has("utm_source")||e.has("utm_medium")||e.has("utm_campaign")}function D(e){let o=e.split("?")[0].toLowerCase(),i={exactMatches:{"/":"Home","/home":"Home","/blog":"Blog listing","/about-us":"About us","/contact-us":"Contact","/privacy-policy":"Privacy policy","/terms-of-service":"Terms of service","/careers":"Careers","/customer-stories":"Customer stories listing","/events":"Events listing","/infographics":"Infographics listing","/newsroom":"Newsroom","/releases":"Releases listing"},pathStartsWith:[{pattern:"/blog/",type:"Blog"},{pattern:"/customer-stories/",type:"Customer story"},{pattern:"/case-studies/",type:"Case study"},{pattern:"/solutions/",type:"Solution"},{pattern:"/events/",type:"Event"},{pattern:"/news/",type:"News"},{pattern:"/press-releases/",type:"Press release"},{pattern:"/releases/",type:"Release"}]};if(i.exactMatches[o])return i.exactMatches[o];for(let u of i.pathStartsWith)if(o.startsWith(u.pattern))return u.type;return"Other"}function P(e){if(!e.userJourney||e.userJourney.length===0)return!1;let o=new Date(e.userJourney[e.userJourney.length-1].time);return new Date().getTime()-o.getTime()<18e5}return new Promise(e=>{setTimeout(()=>{try{let o=null,i=sessionStorage.getItem(r);if(i){let m=JSON.parse(i);P(m)&&(o=m)}if(o||(o={userJourney:[],origin:window.location.hostname,deviceCategory:n(),browser:a(),device:s(),formDetails:{formId:"",formName:"",firstName:"",lastName:"",email:"",phone:""}}),o.formDetails||(o.formDetails={formId:"",formName:"",firstName:"",lastName:"",email:"",phone:""}),o.device||(o.device=s()),!o){console.error("Journey initialization failed"),e(null);return}let u=window.location.pathname,c=new Date().toISOString(),y=o.userJourney[o.userJourney.length-1];if(y&&y.page===u)y.time=c;else{let m=o.userJourney.length===0,S=m?void 0:o.userJourney[0].utm,b={touchPoint:o.userJourney.length+1,page:u,title:document.title||"Untitled",type:D(u),category:w(),time:c,utmVisibility:J()?"visible":"hidden",utm:h(m,S)};o.userJourney.push(b)}sessionStorage.setItem(r,JSON.stringify(o)),p(),e(o)}catch(o){console.error("Error tracking user journey:",o),e(null)}},200)})}function p(){document.querySelectorAll("input[ph-form-field], textarea[ph-form-field], select[ph-form-field]").forEach(n=>{n.removeEventListener("input",f),n.removeEventListener("change",f)}),document.querySelectorAll("input[ph-form-field], textarea[ph-form-field], select[ph-form-field]").forEach(n=>{n.addEventListener("input",f),n.addEventListener("change",f)}),U()}function U(){let r=l();if(!r)return;let t=document.querySelector("[ph-form-name]");if(!t)return;let n=t.getAttribute("ph-form-name"),a=t.getAttribute("ph-form-id")||"form-1";n&&(r.formDetails.formName||(r.formDetails.formId=a,r.formDetails.formName=n),sessionStorage.setItem("userJourney",JSON.stringify(r)))}function f(r){let t=r.target,n=t.getAttribute("ph-form-field");if(!n)return;let a=t.closest("[ph-form-name]");if(!a)return;let s=a.getAttribute("ph-form-name"),d=a.getAttribute("ph-form-id")||"form-1";s&&v(s,d,n,t.value)}function v(r,t,n,a){try{let s=l();if(!s)return!1;switch(s.formDetails.formId=t,s.formDetails.formName=r,n){case"firstName":s.formDetails.firstName=a;break;case"lastName":s.formDetails.lastName=a;break;case"email":s.formDetails.email=a;break;case"phone":s.formDetails.phone=a;break;default:return console.warn(`Unknown field: ${n}`),!1}return sessionStorage.setItem("userJourney",JSON.stringify(s)),!0}catch(s){return console.error("Error updating form data:",s),!1}}function l(){try{let r=sessionStorage.getItem("userJourney");return r?JSON.parse(r):null}catch(r){return console.error("Error getting user journey:",r),null}}function T(){sessionStorage.removeItem("userJourney")}function N(r){try{let t=l();if(!t||t.userJourney.length===0)return!1;let n=t.userJourney[t.userJourney.length-1];return n.category=r.length>0?r:["Not applicable"],sessionStorage.setItem("userJourney",JSON.stringify(t)),!0}catch(t){return console.error("Error updating page categories:",t),!1}}function C(r){try{let t=l();if(!t||t.userJourney.length===0)return!1;let n=t.userJourney[t.userJourney.length-1];return n.type=r,sessionStorage.setItem("userJourney",JSON.stringify(t)),!0}catch(t){return console.error("Error updating page type:",t),!1}}function F(){let r=l();if(!r||r.userJourney.length===0)return null;let t=r.userJourney[0],n=r.userJourney[r.userJourney.length-1],a=new Date(n.time).getTime()-new Date(t.time).getTime();return{totalPages:r.userJourney.length,sessionDuration:Math.floor(a/1e3),firstPage:t.page,lastPage:n.page}}function k(){let r=l();return r?r.formDetails:null}function E(r){let t=l();return t&&t.formDetails[r]||null}function I(r,t){try{let n=l();return n?(n.formDetails[r]=t,sessionStorage.setItem("userJourney",JSON.stringify(n)),!0):!1}catch(n){return console.error("Error setting form data:",n),!1}}function M(r,t){try{let n=l();return n?(n.formDetails.formId=r,n.formDetails.formName=t,sessionStorage.setItem("userJourney",JSON.stringify(n)),!0):!1}catch(n){return console.error("Error setting form details:",n),!1}}function A(){p()}document.addEventListener("DOMContentLoaded",()=>{g()});document.readyState==="loading"?document.addEventListener("DOMContentLoaded",()=>{g()}):g();window.trackUserJourney=g;window.getUserJourney=l;window.clearUserJourney=T;window.updatePageType=C;window.updatePageCategories=N;window.getJourneyStats=F;window.getFormData=k;window.getFormFieldValue=E;window.setFormData=I;window.setFormDetails=M;window.reinitializeFormTracking=A;})();
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../bin/live-reload.js", "../../src/tracking/user-journey.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", "// userJourney.ts - Main tracking functionality with form details\nimport {\n UTMParameters,\n TouchPoint,\n UserJourney,\n DeviceCategory,\n UTMVisibility,\n JourneyStats,\n FormDetails\n} from '../utils/types/user-journey';\n\nexport { };\n\nasync function trackUserJourney(): Promise<UserJourney | null> {\n const STORAGE_KEY: string = 'userJourney';\n const SESSION_TIMEOUT: number = 30 * 60 * 1000; // 30 minutes\n\n // Helper function to get device category\n function getDeviceCategory(): DeviceCategory {\n const userAgent: string = navigator.userAgent;\n if (/tablet|ipad|playbook|silk/i.test(userAgent)) return 'tablet';\n if (/mobile|iphone|ipod|android|blackberry|opera|mini|windows\\sce|palm|smartphone|iemobile/i.test(userAgent)) return 'mobile';\n return 'desktop';\n }\n\n // Helper function to get browser\n function getBrowser(): string {\n const userAgent: string = navigator.userAgent;\n if (userAgent.includes('Chrome') && !userAgent.includes('Edg')) return 'Chrome';\n if (userAgent.includes('Firefox')) return 'Firefox';\n if (userAgent.includes('Safari') && !userAgent.includes('Chrome')) return 'Safari';\n if (userAgent.includes('Edg')) return 'Edge';\n if (userAgent.includes('Opera')) return 'Opera';\n return 'Unknown';\n }\n\n // Helper function to extract domain from referrer\n function extractDomainFromReferrer(referrer: string): string {\n if (!referrer) return 'Unknown';\n\n try {\n const url = new URL(referrer);\n const hostname = url.hostname;\n\n // Remove www. prefix if present\n const domain = hostname.replace(/^www\\./, '');\n\n // Extract the main domain name (remove TLD)\n const domainParts = domain.split('.');\n if (domainParts.length >= 2) {\n return domainParts[0];\n }\n\n return domain || 'Unknown';\n } catch (error) {\n return 'Unknown';\n }\n }\n\n // Helper function to get UTM parameters\n function getUTMParameters(isFirstVisit: boolean, firstVisitUTM?: UTMParameters): UTMParameters {\n const urlParams: URLSearchParams = new URLSearchParams(window.location.search);\n const hasCurrentUTM: boolean = urlParams.has('utm_source') || urlParams.has('utm_medium') || urlParams.has('utm_campaign');\n\n if (isFirstVisit || hasCurrentUTM) {\n // If UTM parameters are present in URL, use them\n if (hasCurrentUTM) {\n return {\n source: urlParams.get('utm_source') || '',\n medium: urlParams.get('utm_medium') || '',\n campaign: urlParams.get('utm_campaign') || ''\n };\n } else {\n // No UTM parameters in URL, use referrer-based defaults\n const referrerDomain = extractDomainFromReferrer(document.referrer);\n return {\n source: referrerDomain,\n medium: 'organic',\n campaign: 'unknown'\n };\n }\n } else {\n // Inherit from first visit\n return firstVisitUTM || {\n source: 'Unknown',\n medium: 'organic',\n campaign: 'unknown'\n };\n }\n }\n\n // Helper function to get page categories from global variable\n function getPageCategories(): string[] {\n try {\n // Check if global pageCategories variable exists and is an array\n if (typeof (window as any).pageCategories !== 'undefined' &&\n Array.isArray((window as any).pageCategories) &&\n (window as any).pageCategories.length > 0) {\n return (window as any).pageCategories;\n }\n\n // Return default if not available or empty\n return ['Not applicable'];\n } catch (error) {\n console.warn('Error accessing pageCategories:', error);\n return ['Not applicable'];\n }\n }\n\n function hasVisibleUTM(): boolean {\n const urlParams: URLSearchParams = new URLSearchParams(window.location.search);\n return urlParams.has('utm_source') || urlParams.has('utm_medium') || urlParams.has('utm_campaign');\n }\n\n // Helper function to get page type (customize as needed)\n function getPageType(url: string): string {\n const path: string = url.split('?')[0].toLowerCase();\n\n // Type configuration - easy to maintain and extend\n const typeConfig = {\n // Exact path matches (highest priority)\n exactMatches: {\n '/': 'Home',\n '/home': 'Home',\n '/blog': 'Blog listing',\n '/about-us': 'About us',\n '/contact-us': 'Contact',\n '/privacy-policy': 'Privacy policy',\n '/terms-of-service': 'Terms of service',\n '/careers': 'Careers',\n '/customer-stories': 'Customer stories listing',\n '/events': 'Events listing',\n '/infographics': 'Infographics listing',\n '/newsroom': 'Newsroom',\n '/releases': 'Releases listing',\n } as Record<string, string>,\n\n // Path pattern matches\n // These will match if the path starts with the pattern\n pathStartsWith: [\n { pattern: '/blog/', type: 'Blog' },\n { pattern: '/customer-stories/', type: 'Customer story' },\n { pattern: '/case-studies/', type: 'Case study' },\n { pattern: '/solutions/', type: 'Solution' },\n { pattern: '/events/', type: 'Event' },\n { pattern: '/news/', type: 'News' },\n { pattern: '/press-releases/', type: 'Press release' },\n { pattern: '/releases/', type: 'Release' },\n ]\n };\n\n // 1. Check exact matches first\n if (typeConfig.exactMatches[path]) {\n return typeConfig.exactMatches[path];\n }\n\n // 2. Check path starts with patterns\n for (const item of typeConfig.pathStartsWith) {\n if (path.startsWith(item.pattern)) {\n return item.type;\n }\n }\n\n // 3. Default fallback\n return 'Other';\n }\n\n // Check if session is still valid\n function isValidSession(journey: UserJourney): boolean {\n if (!journey.userJourney || journey.userJourney.length === 0) return false;\n\n const lastVisit: Date = new Date(journey.userJourney[journey.userJourney.length - 1].time);\n const now: Date = new Date();\n\n return (now.getTime() - lastVisit.getTime()) < SESSION_TIMEOUT;\n }\n\n // Add 200ms delay before executing the main logic\n return new Promise((resolve) => {\n setTimeout(() => {\n try {\n // Get existing journey from sessionStorage\n let journey: UserJourney | null = null;\n const storedData: string | null = sessionStorage.getItem(STORAGE_KEY);\n\n if (storedData) {\n const parsedData: UserJourney = JSON.parse(storedData);\n\n // Check if session is still valid\n if (isValidSession(parsedData)) {\n journey = parsedData;\n }\n }\n\n // Initialize new journey if none exists or session expired\n if (!journey) {\n journey = {\n userJourney: [],\n origin: window.location.hostname,\n deviceCategory: getDeviceCategory(),\n browser: getBrowser(),\n formDetails: {\n formId: '',\n formName: '',\n firstName: '',\n lastName: '',\n email: '',\n phone: ''\n }\n };\n }\n\n // Ensure formDetails exists for backward compatibility\n if (!journey.formDetails) {\n journey.formDetails = {\n formId: '',\n formName: '',\n firstName: '',\n lastName: '',\n email: '',\n phone: ''\n };\n }\n\n // Get current page info\n const currentUrl: string = window.location.pathname;\n const currentTime: string = new Date().toISOString();\n\n // Check if this is the same page as the last visit (avoid duplicates)\n const lastVisit: TouchPoint | undefined = journey.userJourney[journey.userJourney.length - 1];\n if (lastVisit && lastVisit.page === currentUrl) {\n // Same page, just update the time\n lastVisit.time = currentTime;\n } else {\n // New page visit\n const isFirstVisit: boolean = journey.userJourney.length === 0;\n const firstVisitUTM: UTMParameters | undefined = isFirstVisit ? undefined : journey.userJourney[0].utm;\n\n const touchPoint: TouchPoint = {\n touchPoint: journey.userJourney.length + 1,\n page: currentUrl,\n title: document.title || 'Untitled',\n type: getPageType(currentUrl),\n category: getPageCategories(),\n time: currentTime,\n utmVisibility: hasVisibleUTM() ? 'visible' : 'hidden',\n utm: getUTMParameters(isFirstVisit, firstVisitUTM)\n };\n\n journey.userJourney.push(touchPoint);\n }\n\n // Save updated journey to sessionStorage\n sessionStorage.setItem(STORAGE_KEY, JSON.stringify(journey));\n\n // Initialize form tracking\n initializeFormTracking();\n\n // // Optional: Log for debugging\n // console.log('User journey updated:', journey);\n\n resolve(journey);\n\n } catch (error: unknown) {\n console.error('Error tracking user journey:', error);\n resolve(null);\n }\n }, 200); // 200ms delay\n });\n}\n\n// Form tracking functionality\nfunction initializeFormTracking(): void {\n // Remove existing event listeners to prevent duplicates\n const existingInputs = document.querySelectorAll('input[ph-form-field], textarea[ph-form-field], select[ph-form-field]');\n existingInputs.forEach(input => {\n input.removeEventListener('input', handleFormFieldChange);\n input.removeEventListener('change', handleFormFieldChange);\n });\n\n // Add event listeners to form fields\n const formFields = document.querySelectorAll('input[ph-form-field], textarea[ph-form-field], select[ph-form-field]');\n formFields.forEach(field => {\n field.addEventListener('input', handleFormFieldChange);\n field.addEventListener('change', handleFormFieldChange);\n });\n\n // Initialize form data structure\n initializeFormData();\n}\n\nfunction initializeFormData(): void {\n const journey = getUserJourney();\n if (!journey) return;\n\n // Find the form container\n const formContainer = document.querySelector('[ph-form-name]');\n if (!formContainer) return;\n\n const formName = formContainer.getAttribute('ph-form-name');\n const formId = formContainer.getAttribute('ph-form-id') || 'form-1'; // Default form ID\n\n if (!formName) return;\n\n // Initialize form details if not already set\n if (!journey.formDetails.formName) {\n journey.formDetails.formId = formId;\n journey.formDetails.formName = formName;\n }\n\n // Save updated journey\n sessionStorage.setItem('userJourney', JSON.stringify(journey));\n}\n\nfunction handleFormFieldChange(event: Event): void {\n const target = event.target as HTMLInputElement | HTMLTextAreaElement | HTMLSelectElement;\n const fieldName = target.getAttribute('ph-form-field');\n\n if (!fieldName) return;\n\n // Find the form container\n const formContainer = target.closest('[ph-form-name]');\n if (!formContainer) return;\n\n const formName = formContainer.getAttribute('ph-form-name');\n const formId = formContainer.getAttribute('ph-form-id') || 'form-1';\n\n if (!formName) return;\n\n // Update form data\n updateFormData(formName, formId, fieldName, target.value);\n}\n\nfunction updateFormData(formName: string, formId: string, fieldName: string, value: string): boolean {\n try {\n const journey = getUserJourney();\n if (!journey) return false;\n\n // Update form details\n journey.formDetails.formId = formId;\n journey.formDetails.formName = formName;\n\n // Update the specific field\n switch (fieldName) {\n case 'firstName':\n journey.formDetails.firstName = value;\n break;\n case 'lastName':\n journey.formDetails.lastName = value;\n break;\n case 'email':\n journey.formDetails.email = value;\n break;\n case 'phone':\n journey.formDetails.phone = value;\n break;\n default:\n console.warn(`Unknown field: ${fieldName}`);\n return false;\n }\n\n // Save updated journey\n sessionStorage.setItem('userJourney', JSON.stringify(journey));\n\n return true;\n } catch (error) {\n console.error('Error updating form data:', error);\n return false;\n }\n}\n\n// Helper function to get current journey data\nfunction getUserJourney(): UserJourney | null {\n try {\n const storedData: string | null = sessionStorage.getItem('userJourney');\n return storedData ? JSON.parse(storedData) as UserJourney : null;\n } catch (error: unknown) {\n console.error('Error getting user journey:', error);\n return null;\n }\n}\n\n// Helper function to clear journey data\nfunction clearUserJourney(): void {\n sessionStorage.removeItem('userJourney');\n}\n\n// Helper function to update page categories manually\nfunction updatePageCategories(categories: string[]): boolean {\n try {\n const journey: UserJourney | null = getUserJourney();\n if (!journey || journey.userJourney.length === 0) return false;\n\n const lastVisit: TouchPoint = journey.userJourney[journey.userJourney.length - 1];\n lastVisit.category = categories.length > 0 ? categories : ['Not applicable'];\n\n sessionStorage.setItem('userJourney', JSON.stringify(journey));\n return true;\n } catch (error: unknown) {\n console.error('Error updating page categories:', error);\n return false;\n }\n}\n\nfunction updatePageType(type: string): boolean {\n try {\n const journey: UserJourney | null = getUserJourney();\n if (!journey || journey.userJourney.length === 0) return false;\n\n const lastVisit: TouchPoint = journey.userJourney[journey.userJourney.length - 1];\n lastVisit.type = type;\n\n sessionStorage.setItem('userJourney', JSON.stringify(journey));\n return true;\n } catch (error: unknown) {\n console.error('Error updating page type:', error);\n return false;\n }\n}\n\n// Helper function to get journey statistics\nfunction getJourneyStats(): JourneyStats | null {\n const journey: UserJourney | null = getUserJourney();\n if (!journey || journey.userJourney.length === 0) return null;\n\n const firstVisit: TouchPoint = journey.userJourney[0];\n const lastVisit: TouchPoint = journey.userJourney[journey.userJourney.length - 1];\n\n const sessionDuration: number = new Date(lastVisit.time).getTime() - new Date(firstVisit.time).getTime();\n\n return {\n totalPages: journey.userJourney.length,\n sessionDuration: Math.floor(sessionDuration / 1000),\n firstPage: firstVisit.page,\n lastPage: lastVisit.page\n };\n}\n\n// Helper function to get form data\nfunction getFormData(): FormDetails | null {\n const journey = getUserJourney();\n return journey ? journey.formDetails : null;\n}\n\n// Helper function to get specific form field value\nfunction getFormFieldValue(fieldName: keyof FormDetails): string | null {\n const journey = getUserJourney();\n if (!journey) return null;\n\n return journey.formDetails[fieldName] || null;\n}\n\n// Helper function to manually update form data\nfunction setFormData(fieldName: keyof FormDetails, value: string): boolean {\n try {\n const journey = getUserJourney();\n if (!journey) return false;\n\n journey.formDetails[fieldName] = value;\n\n // Save updated journey\n sessionStorage.setItem('userJourney', JSON.stringify(journey));\n return true;\n } catch (error) {\n console.error('Error setting form data:', error);\n return false;\n }\n}\n\n// Helper function to set form ID and name\nfunction setFormDetails(formId: string, formName: string): boolean {\n try {\n const journey = getUserJourney();\n if (!journey) return false;\n\n journey.formDetails.formId = formId;\n journey.formDetails.formName = formName;\n\n // Save updated journey\n sessionStorage.setItem('userJourney', JSON.stringify(journey));\n return true;\n } catch (error) {\n console.error('Error setting form details:', error);\n return false;\n }\n}\n\n// Helper function to reinitialize form tracking (useful for dynamic content)\nfunction reinitializeFormTracking(): void {\n initializeFormTracking();\n}\n\n// Auto-execute on page load\ndocument.addEventListener('DOMContentLoaded', (): void => {\n trackUserJourney();\n});\n\n// Also execute immediately if DOM is already loaded\nif (document.readyState === 'loading') {\n document.addEventListener('DOMContentLoaded', (): void => {\n trackUserJourney();\n });\n} else {\n trackUserJourney();\n}\n\n// Make functions globally accessible\ndeclare global {\n interface Window {\n trackUserJourney: () => Promise<UserJourney | null>;\n getUserJourney: () => UserJourney | null;\n clearUserJourney: () => void;\n updatePageType: (type: string) => boolean;\n updatePageCategories: (categories: string[]) => boolean;\n getJourneyStats: () => JourneyStats | null;\n getFormData: () => FormDetails | null;\n getFormFieldValue: (fieldName: keyof FormDetails) => string | null;\n setFormData: (fieldName: keyof FormDetails, value: string) => boolean;\n setFormDetails: (formId: string, formName: string) => boolean;\n reinitializeFormTracking: () => void;\n }\n}\n\n// Attach functions to window object for global access\nwindow.trackUserJourney = trackUserJourney;\nwindow.getUserJourney = getUserJourney;\nwindow.clearUserJourney = clearUserJourney;\nwindow.updatePageType = updatePageType;\nwindow.updatePageCategories = updatePageCategories;\nwindow.getJourneyStats = getJourneyStats;\nwindow.getFormData = getFormData;\nwindow.getFormFieldValue = getFormFieldValue;\nwindow.setFormData = setFormData;\nwindow.setFormDetails = setFormDetails;\nwindow.reinitializeFormTracking = reinitializeFormTracking;\n\n// Export functions for module usage\nexport {\n trackUserJourney,\n getUserJourney,\n clearUserJourney,\n updatePageType,\n updatePageCategories,\n getJourneyStats,\n getFormData,\n getFormFieldValue,\n setFormData,\n setFormDetails,\n reinitializeFormTracking\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", "// userJourney.ts - Main tracking functionality with form details\nimport {\n UTMParameters,\n TouchPoint,\n UserJourney,\n DeviceCategory,\n UTMVisibility,\n JourneyStats,\n FormDetails\n} from '../utils/types/user-journey';\n\nexport { };\n\nasync function trackUserJourney(): Promise<UserJourney | null> {\n const STORAGE_KEY: string = 'userJourney';\n const SESSION_TIMEOUT: number = 30 * 60 * 1000; // 30 minutes\n\n // Helper function to get device category\n function getDeviceCategory(): DeviceCategory {\n const userAgent: string = navigator.userAgent;\n if (/tablet|ipad|playbook|silk/i.test(userAgent)) return 'Tablet';\n if (/mobile|iphone|ipod|android|blackberry|opera|mini|windows\\sce|palm|smartphone|iemobile/i.test(userAgent)) return 'Mobile';\n return 'Desktop';\n }\n\n // Helper function to get browser\n function getBrowser(): string {\n const userAgent: string = navigator.userAgent;\n if (userAgent.includes('Chrome') && !userAgent.includes('Edg')) return 'Chrome';\n if (userAgent.includes('Firefox')) return 'Firefox';\n if (userAgent.includes('Safari') && !userAgent.includes('Chrome')) return 'Safari';\n if (userAgent.includes('Edg')) return 'Edge';\n if (userAgent.includes('Opera')) return 'Opera';\n return 'Unknown';\n }\n\n // Helper function to get device name from user agent\n function getDeviceName(): string {\n const userAgent: string = navigator.userAgent;\n \n // Mobile devices\n if (/iPhone/.test(userAgent)) {\n const match = userAgent.match(/iPhone\\s*([^;]*)/);\n return match ? `iPhone ${match[1].trim()}` : 'iPhone';\n }\n \n if (/iPad/.test(userAgent)) {\n const match = userAgent.match(/iPad\\s*([^;]*)/);\n return match ? `iPad ${match[1].trim()}` : 'iPad';\n }\n \n if (/Android/.test(userAgent)) {\n // Try to extract device model from Android user agent\n const modelMatch = userAgent.match(/;\\s*([^)]*)\\s*\\)/);\n if (modelMatch) {\n const deviceInfo = modelMatch[1].trim();\n // Clean up common Android device patterns\n const cleanDevice = deviceInfo\n .replace(/wv/g, '')\n .replace(/Build\\/.*$/g, '')\n .replace(/\\s+/g, ' ')\n .trim();\n return cleanDevice || 'Android Device';\n }\n return 'Android Device';\n }\n \n // Desktop/Laptop detection\n if (/Windows/.test(userAgent)) {\n if (/Windows NT 10/.test(userAgent)) return 'Windows 10/11 PC';\n if (/Windows NT 6\\.3/.test(userAgent)) return 'Windows 8.1 PC';\n if (/Windows NT 6\\.2/.test(userAgent)) return 'Windows 8 PC';\n if (/Windows NT 6\\.1/.test(userAgent)) return 'Windows 7 PC';\n return 'Windows PC';\n }\n \n if (/Macintosh/.test(userAgent)) {\n if (/Intel/.test(userAgent)) return 'Mac (Intel)';\n if (/Apple Silicon|ARM64/.test(userAgent)) return 'Mac (Apple Silicon)';\n return 'Mac';\n }\n \n if (/Linux/.test(userAgent)) {\n return 'Linux PC';\n }\n \n // Other mobile devices\n if (/BlackBerry/.test(userAgent)) return 'BlackBerry';\n if (/Windows Phone/.test(userAgent)) return 'Windows Phone';\n \n // Fallback to generic category\n const deviceCategory = getDeviceCategory();\n return deviceCategory.charAt(0).toUpperCase();\n }\n\n // Helper function to extract domain from referrer\n function extractDomainFromReferrer(referrer: string): string {\n if (!referrer) return 'Unknown';\n\n try {\n const url = new URL(referrer);\n const hostname = url.hostname;\n\n // Remove www. prefix if present\n const domain = hostname.replace(/^www\\./, '');\n\n // Extract the main domain name (remove TLD)\n const domainParts = domain.split('.');\n if (domainParts.length >= 2) {\n return domainParts[0];\n }\n\n return domain || 'Unknown';\n } catch (error) {\n return 'Unknown';\n }\n }\n\n // Helper function to get UTM parameters\n function getUTMParameters(isFirstVisit: boolean, firstVisitUTM?: UTMParameters): UTMParameters {\n const urlParams: URLSearchParams = new URLSearchParams(window.location.search);\n const hasCurrentUTM: boolean = urlParams.has('utm_source') || urlParams.has('utm_medium') || urlParams.has('utm_campaign');\n\n if (isFirstVisit || hasCurrentUTM) {\n // If UTM parameters are present in URL, use them\n if (hasCurrentUTM) {\n return {\n source: urlParams.get('utm_source') || '',\n medium: urlParams.get('utm_medium') || '',\n campaign: urlParams.get('utm_campaign') || ''\n };\n } else {\n // No UTM parameters in URL, use referrer-based defaults\n const referrerDomain = extractDomainFromReferrer(document.referrer);\n return {\n source: referrerDomain,\n medium: 'organic',\n campaign: 'unknown'\n };\n }\n } else {\n // Inherit from first visit\n return firstVisitUTM || {\n source: 'Unknown',\n medium: 'organic',\n campaign: 'unknown'\n };\n }\n }\n\n // Helper function to get page categories from global variable\n function getPageCategories(): string[] {\n try {\n // Check if global pageCategories variable exists and is an array\n if (typeof (window as any).pageCategories !== 'undefined' &&\n Array.isArray((window as any).pageCategories) &&\n (window as any).pageCategories.length > 0) {\n return (window as any).pageCategories;\n }\n\n // Return default if not available or empty\n return ['Not applicable'];\n } catch (error) {\n console.warn('Error accessing pageCategories:', error);\n return ['Not applicable'];\n }\n }\n\n function hasVisibleUTM(): boolean {\n const urlParams: URLSearchParams = new URLSearchParams(window.location.search);\n return urlParams.has('utm_source') || urlParams.has('utm_medium') || urlParams.has('utm_campaign');\n }\n\n // Helper function to get page type (customize as needed)\n function getPageType(url: string): string {\n const path: string = url.split('?')[0].toLowerCase();\n\n // Type configuration - easy to maintain and extend\n const typeConfig = {\n // Exact path matches (highest priority)\n exactMatches: {\n '/': 'Home',\n '/home': 'Home',\n '/blog': 'Blog listing',\n '/about-us': 'About us',\n '/contact-us': 'Contact',\n '/privacy-policy': 'Privacy policy',\n '/terms-of-service': 'Terms of service',\n '/careers': 'Careers',\n '/customer-stories': 'Customer stories listing',\n '/events': 'Events listing',\n '/infographics': 'Infographics listing',\n '/newsroom': 'Newsroom',\n '/releases': 'Releases listing',\n } as Record<string, string>,\n\n // Path pattern matches\n // These will match if the path starts with the pattern\n pathStartsWith: [\n { pattern: '/blog/', type: 'Blog' },\n { pattern: '/customer-stories/', type: 'Customer story' },\n { pattern: '/case-studies/', type: 'Case study' },\n { pattern: '/solutions/', type: 'Solution' },\n { pattern: '/events/', type: 'Event' },\n { pattern: '/news/', type: 'News' },\n { pattern: '/press-releases/', type: 'Press release' },\n { pattern: '/releases/', type: 'Release' },\n ]\n };\n\n // 1. Check exact matches first\n if (typeConfig.exactMatches[path]) {\n return typeConfig.exactMatches[path];\n }\n\n // 2. Check path starts with patterns\n for (const item of typeConfig.pathStartsWith) {\n if (path.startsWith(item.pattern)) {\n return item.type;\n }\n }\n\n // 3. Default fallback\n return 'Other';\n }\n\n // Check if session is still valid\n function isValidSession(journey: UserJourney): boolean {\n if (!journey.userJourney || journey.userJourney.length === 0) return false;\n\n const lastVisit: Date = new Date(journey.userJourney[journey.userJourney.length - 1].time);\n const now: Date = new Date();\n\n return (now.getTime() - lastVisit.getTime()) < SESSION_TIMEOUT;\n }\n\n // Add 200ms delay before executing the main logic\n return new Promise((resolve) => {\n setTimeout(() => {\n try {\n // Get existing journey from sessionStorage\n let journey: UserJourney | null = null;\n const storedData: string | null = sessionStorage.getItem(STORAGE_KEY);\n\n if (storedData) {\n const parsedData: UserJourney = JSON.parse(storedData);\n\n // Check if session is still valid\n if (isValidSession(parsedData)) {\n journey = parsedData;\n }\n }\n\n // Initialize new journey if none exists or session expired\n if (!journey) {\n journey = {\n userJourney: [],\n origin: window.location.hostname,\n deviceCategory: getDeviceCategory(),\n browser: getBrowser(),\n device: getDeviceName(),\n formDetails: {\n formId: '',\n formName: '',\n firstName: '',\n lastName: '',\n email: '',\n phone: ''\n }\n };\n }\n\n // Ensure formDetails exists for backward compatibility\n if (!journey.formDetails) {\n journey.formDetails = {\n formId: '',\n formName: '',\n firstName: '',\n lastName: '',\n email: '',\n phone: ''\n };\n }\n\n // Ensure device property exists for backward compatibility\n if (!journey.device) {\n journey.device = getDeviceName();\n }\n\n // At this point journey should never be null, but add safety check\n if (!journey) {\n console.error('Journey initialization failed');\n resolve(null);\n return;\n }\n\n // Get current page info\n const currentUrl: string = window.location.pathname;\n const currentTime: string = new Date().toISOString();\n\n // Check if this is the same page as the last visit (avoid duplicates)\n const lastVisit: TouchPoint | undefined = journey.userJourney[journey.userJourney.length - 1];\n if (lastVisit && lastVisit.page === currentUrl) {\n // Same page, just update the time\n lastVisit.time = currentTime;\n } else {\n // New page visit\n const isFirstVisit: boolean = journey.userJourney.length === 0;\n const firstVisitUTM: UTMParameters | undefined = isFirstVisit ? undefined : journey.userJourney[0].utm;\n\n const touchPoint: TouchPoint = {\n touchPoint: journey.userJourney.length + 1,\n page: currentUrl,\n title: document.title || 'Untitled',\n type: getPageType(currentUrl),\n category: getPageCategories(),\n time: currentTime,\n utmVisibility: hasVisibleUTM() ? 'visible' : 'hidden',\n utm: getUTMParameters(isFirstVisit, firstVisitUTM)\n };\n\n journey.userJourney.push(touchPoint);\n }\n\n // Save updated journey to sessionStorage\n sessionStorage.setItem(STORAGE_KEY, JSON.stringify(journey));\n\n // Initialize form tracking\n initializeFormTracking();\n\n // // Optional: Log for debugging\n // console.log('User journey updated:', journey);\n\n resolve(journey);\n\n } catch (error: unknown) {\n console.error('Error tracking user journey:', error);\n resolve(null);\n }\n }, 200); // 200ms delay\n });\n}\n\n// Form tracking functionality\nfunction initializeFormTracking(): void {\n // Remove existing event listeners to prevent duplicates\n const existingInputs = document.querySelectorAll('input[ph-form-field], textarea[ph-form-field], select[ph-form-field]');\n existingInputs.forEach(input => {\n input.removeEventListener('input', handleFormFieldChange);\n input.removeEventListener('change', handleFormFieldChange);\n });\n\n // Add event listeners to form fields\n const formFields = document.querySelectorAll('input[ph-form-field], textarea[ph-form-field], select[ph-form-field]');\n formFields.forEach(field => {\n field.addEventListener('input', handleFormFieldChange);\n field.addEventListener('change', handleFormFieldChange);\n });\n\n // Initialize form data structure\n initializeFormData();\n}\n\nfunction initializeFormData(): void {\n const journey = getUserJourney();\n if (!journey) return;\n\n // Find the form container\n const formContainer = document.querySelector('[ph-form-name]');\n if (!formContainer) return;\n\n const formName = formContainer.getAttribute('ph-form-name');\n const formId = formContainer.getAttribute('ph-form-id') || 'form-1'; // Default form ID\n\n if (!formName) return;\n\n // Initialize form details if not already set\n if (!journey.formDetails.formName) {\n journey.formDetails.formId = formId;\n journey.formDetails.formName = formName;\n }\n\n // Save updated journey\n sessionStorage.setItem('userJourney', JSON.stringify(journey));\n}\n\nfunction handleFormFieldChange(event: Event): void {\n const target = event.target as HTMLInputElement | HTMLTextAreaElement | HTMLSelectElement;\n const fieldName = target.getAttribute('ph-form-field');\n\n if (!fieldName) return;\n\n // Find the form container\n const formContainer = target.closest('[ph-form-name]');\n if (!formContainer) return;\n\n const formName = formContainer.getAttribute('ph-form-name');\n const formId = formContainer.getAttribute('ph-form-id') || 'form-1';\n\n if (!formName) return;\n\n // Update form data\n updateFormData(formName, formId, fieldName, target.value);\n}\n\nfunction updateFormData(formName: string, formId: string, fieldName: string, value: string): boolean {\n try {\n const journey = getUserJourney();\n if (!journey) return false;\n\n // Update form details\n journey.formDetails.formId = formId;\n journey.formDetails.formName = formName;\n\n // Update the specific field\n switch (fieldName) {\n case 'firstName':\n journey.formDetails.firstName = value;\n break;\n case 'lastName':\n journey.formDetails.lastName = value;\n break;\n case 'email':\n journey.formDetails.email = value;\n break;\n case 'phone':\n journey.formDetails.phone = value;\n break;\n default:\n console.warn(`Unknown field: ${fieldName}`);\n return false;\n }\n\n // Save updated journey\n sessionStorage.setItem('userJourney', JSON.stringify(journey));\n\n return true;\n } catch (error) {\n console.error('Error updating form data:', error);\n return false;\n }\n}\n\n// Helper function to get current journey data\nfunction getUserJourney(): UserJourney | null {\n try {\n const storedData: string | null = sessionStorage.getItem('userJourney');\n return storedData ? JSON.parse(storedData) as UserJourney : null;\n } catch (error: unknown) {\n console.error('Error getting user journey:', error);\n return null;\n }\n}\n\n// Helper function to clear journey data\nfunction clearUserJourney(): void {\n sessionStorage.removeItem('userJourney');\n}\n\n// Helper function to update page categories manually\nfunction updatePageCategories(categories: string[]): boolean {\n try {\n const journey: UserJourney | null = getUserJourney();\n if (!journey || journey.userJourney.length === 0) return false;\n\n const lastVisit: TouchPoint = journey.userJourney[journey.userJourney.length - 1];\n lastVisit.category = categories.length > 0 ? categories : ['Not applicable'];\n\n sessionStorage.setItem('userJourney', JSON.stringify(journey));\n return true;\n } catch (error: unknown) {\n console.error('Error updating page categories:', error);\n return false;\n }\n}\n\nfunction updatePageType(type: string): boolean {\n try {\n const journey: UserJourney | null = getUserJourney();\n if (!journey || journey.userJourney.length === 0) return false;\n\n const lastVisit: TouchPoint = journey.userJourney[journey.userJourney.length - 1];\n lastVisit.type = type;\n\n sessionStorage.setItem('userJourney', JSON.stringify(journey));\n return true;\n } catch (error: unknown) {\n console.error('Error updating page type:', error);\n return false;\n }\n}\n\n// Helper function to get journey statistics\nfunction getJourneyStats(): JourneyStats | null {\n const journey: UserJourney | null = getUserJourney();\n if (!journey || journey.userJourney.length === 0) return null;\n\n const firstVisit: TouchPoint = journey.userJourney[0];\n const lastVisit: TouchPoint = journey.userJourney[journey.userJourney.length - 1];\n\n const sessionDuration: number = new Date(lastVisit.time).getTime() - new Date(firstVisit.time).getTime();\n\n return {\n totalPages: journey.userJourney.length,\n sessionDuration: Math.floor(sessionDuration / 1000),\n firstPage: firstVisit.page,\n lastPage: lastVisit.page\n };\n}\n\n// Helper function to get form data\nfunction getFormData(): FormDetails | null {\n const journey = getUserJourney();\n return journey ? journey.formDetails : null;\n}\n\n// Helper function to get specific form field value\nfunction getFormFieldValue(fieldName: keyof FormDetails): string | null {\n const journey = getUserJourney();\n if (!journey) return null;\n\n return journey.formDetails[fieldName] || null;\n}\n\n// Helper function to manually update form data\nfunction setFormData(fieldName: keyof FormDetails, value: string): boolean {\n try {\n const journey = getUserJourney();\n if (!journey) return false;\n\n journey.formDetails[fieldName] = value;\n\n // Save updated journey\n sessionStorage.setItem('userJourney', JSON.stringify(journey));\n return true;\n } catch (error) {\n console.error('Error setting form data:', error);\n return false;\n }\n}\n\n// Helper function to set form ID and name\nfunction setFormDetails(formId: string, formName: string): boolean {\n try {\n const journey = getUserJourney();\n if (!journey) return false;\n\n journey.formDetails.formId = formId;\n journey.formDetails.formName = formName;\n\n // Save updated journey\n sessionStorage.setItem('userJourney', JSON.stringify(journey));\n return true;\n } catch (error) {\n console.error('Error setting form details:', error);\n return false;\n }\n}\n\n// Helper function to reinitialize form tracking (useful for dynamic content)\nfunction reinitializeFormTracking(): void {\n initializeFormTracking();\n}\n\n// Auto-execute on page load\ndocument.addEventListener('DOMContentLoaded', (): void => {\n trackUserJourney();\n});\n\n// Also execute immediately if DOM is already loaded\nif (document.readyState === 'loading') {\n document.addEventListener('DOMContentLoaded', (): void => {\n trackUserJourney();\n });\n} else {\n trackUserJourney();\n}\n\n// Make functions globally accessible\ndeclare global {\n interface Window {\n trackUserJourney: () => Promise<UserJourney | null>;\n getUserJourney: () => UserJourney | null;\n clearUserJourney: () => void;\n updatePageType: (type: string) => boolean;\n updatePageCategories: (categories: string[]) => boolean;\n getJourneyStats: () => JourneyStats | null;\n getFormData: () => FormDetails | null;\n getFormFieldValue: (fieldName: keyof FormDetails) => string | null;\n setFormData: (fieldName: keyof FormDetails, value: string) => boolean;\n setFormDetails: (formId: string, formName: string) => boolean;\n reinitializeFormTracking: () => void;\n }\n}\n\n// Attach functions to window object for global access\nwindow.trackUserJourney = trackUserJourney;\nwindow.getUserJourney = getUserJourney;\nwindow.clearUserJourney = clearUserJourney;\nwindow.updatePageType = updatePageType;\nwindow.updatePageCategories = updatePageCategories;\nwindow.getJourneyStats = getJourneyStats;\nwindow.getFormData = getFormData;\nwindow.getFormFieldValue = getFormFieldValue;\nwindow.setFormData = setFormData;\nwindow.setFormDetails = setFormDetails;\nwindow.reinitializeFormTracking = reinitializeFormTracking;\n\n// Export functions for module usage\nexport {\n trackUserJourney,\n getUserJourney,\n clearUserJourney,\n updatePageType,\n updatePageCategories,\n getJourneyStats,\n getFormData,\n getFormFieldValue,\n setFormData,\n setFormDetails,\n reinitializeFormTracking\n};"],
5
+ "mappings": "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",
6
6
  "names": []
7
7
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fynd-design-engineering/fynd-one-v2",
3
- "version": "3.1.2",
3
+ "version": "3.1.4",
4
4
  "description": "Updated CDN for fynd.com",
5
5
  "homepage": "https://github.com/Fynd-Design-Engineering/Fynd-Utils/blob/main/README.md",
6
6
  "license": "ISC",