{"version":3,"file":"useTrackingEvents.CYDLSO2_.mjs","names":["useState","useMemo","useCallback","useCallback"],"sources":["https:/framerusercontent.com/modules/6UtPpKQ4XWQbVUZ8TCXH/PjHKReg11cggnAzUENNW/useFetch.js","https:/framerusercontent.com/modules/LFJmKXjJwAL6XDUC01sq/p4TaERjQTBRIn4mnvXuH/tracking_events_interface.js","https:/framerusercontent.com/modules/3RVLDDvAjT1jQK3DlrJ8/258oLwWvqXluZonjP6yG/cookie.js","https:/framerusercontent.com/modules/WGRPj0DRKGHX8wtCSACn/KJ6D2P7EwHPu7pgUb1Ca/param_storage_utils.js","https:/framerusercontent.com/modules/RoyLn3Rsr2xd0OGTHlbC/SructT94zoGoR7NxapnN/tracking_utils.js","https:/framerusercontent.com/modules/dl6NF18IBVaCIEqMYmbC/O0M93NFU55bqV1pyFvpI/useTrackingEvents.js"],"sourcesContent":["import{useCallback,useMemo,useState}from\"react\";export function useFetch({urlPath,method}){const[data,setData]=useState(null);const[status,setStatus]=useState(\"uninitialized\");const rootUrl=useMemo(()=>{if(typeof window===\"undefined\"){return;}const hostname=window.location.hostname;const isProd=hostname.includes(\"www.rocketloans.com\");if(isProd){return\"https://www.rocketloans.com/api\";}return\"https://qa2.rockloans.com/api\";},[]);const trigger=useCallback(async payload=>{const fullUrl=`${rootUrl}${urlPath}`;const body=payload?JSON.stringify(payload):undefined;try{const results=await fetch(fullUrl,{method,headers:{...payload&&{\"Content-Type\":\"application/json\"},Accept:\"application/json\"},body});if(results.ok){const resultsData=await results.json();setData(resultsData);setStatus(\"success\");return resultsData;}throw new Error(`Error when fetching`);}catch(err){console.error(`${err}`);throw new Error(`${err}`);}},[rootUrl,method,urlPath]);return{data,trigger,status};}\nexport const __FramerMetadata__ = {\"exports\":{\"useFetch\":{\"type\":\"function\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"__FramerMetadata__\":{\"type\":\"variable\"}}}\n//# sourceMappingURL=./useFetch.map","export const EXPERIMENT_NAMES={rocketLoansReimagined:\"Homepage_Reimagined\",calculatorBanner:\"Calculator_banner\"};\nexport const __FramerMetadata__ = {\"exports\":{\"EventContext\":{\"type\":\"tsType\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"EXPERIMENT_NAMES\":{\"type\":\"variable\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"ExperimentName\":{\"type\":\"tsType\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"EventPageContext\":{\"type\":\"tsType\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"FramerEvent\":{\"type\":\"tsType\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"EventRequestInterface\":{\"type\":\"tsType\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"ApplicationEventProperties\":{\"type\":\"tsType\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"ApplicationEvents\":{\"type\":\"tsType\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"__FramerMetadata__\":{\"type\":\"variable\"}}}\n//# sourceMappingURL=./tracking_events_interface.map","/**\n * Retrieves the value of a cookie by name.\n *\n * @param name - The name of the cookie to retrieve\n * @returns The cookie value as a string, or null if the cookie is not found\n */export const getCookie=name=>{if(typeof document===\"undefined\"){return null;}const encodedName=encodeURIComponent(name);// Split on semicolons with optional surrounding whitespace.\n// RFC 6265 mandates \"; \" but some user agents may omit the space.\nconst cookies=document.cookie.split(/;\\s*/);// Match against the encoded name to stay consistent with setCookie's encoding\nconst targetCookie=cookies.find(row=>row.startsWith(`${encodedName}=`));if(!targetCookie){return null;}// Extract everything after \"name=\" to preserve \"=\" characters within the value\nconst value=targetCookie.substring(encodedName.length+1);return decodeURIComponent(value);};/**\n * Sets a cookie with the given name, value, and options.\n *\n * @param name - The name of the cookie to set\n * @param value - The value to assign to the cookie\n * @param options - Optional cookie attributes (expires, path, domain, sameSite, secure)\n */export const setCookie=(name,value,options={})=>{if(typeof document===\"undefined\"){return;}// Encode name and value to safely handle special characters (e.g. spaces, semicolons)\nlet cookieString=`${encodeURIComponent(name)}=${encodeURIComponent(value)}`;// Convert TTL (milliseconds from now) to an absolute UTC expiration date.\n// If omitted, the cookie becomes a session cookie and is deleted when the browser closes.\nif(options.expires!==undefined){const date=new Date(Date.now()+options.expires);cookieString+=`; expires=${date.toUTCString()}`;}// Restrict cookie to a specific path (e.g. \"/\" for site-wide).\n// If omitted, defaults to the path of the current document URL.\nif(options.path){cookieString+=`; path=${options.path}`;}// Scope cookie to a specific domain (e.g. \".example.com\" for subdomains).\n// If omitted, defaults to the exact host of the current URL — the cookie\n// will NOT be sent to subdomains (e.g. a cookie set on \"example.com\"\n// won't be available on \"sub.example.com\").\nif(options.domain){cookieString+=`; domain=${options.domain}`;}// Control cross-site request behavior: \"strict\", \"lax\", or \"none\".\n// If omitted, most modern browsers default to \"lax\".\nif(options.sameSite){cookieString+=`; SameSite=${options.sameSite}`;}// Ensure cookie is only sent over HTTPS connections.\n// Required when SameSite is \"none\".\nif(options.secure){cookieString+=`; Secure`;}// Writing to document.cookie sets/updates a single cookie (does not overwrite others)\ndocument.cookie=cookieString;};/**\n * Deletes a cookie by setting its expiration to the past.\n *\n * @param name - The name of the cookie to delete\n * @param options - Optional path and domain to match the cookie being deleted\n */export const deleteCookie=(name,options={})=>{setCookie(name,\"\",{...options,expires:-1});};\nexport const __FramerMetadata__ = {\"exports\":{\"getCookie\":{\"type\":\"variable\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"setCookie\":{\"type\":\"variable\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"CookieOptions\":{\"type\":\"tsType\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"deleteCookie\":{\"type\":\"variable\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"__FramerMetadata__\":{\"type\":\"variable\"}}}\n//# sourceMappingURL=./cookie.map","export function findSearchPartner(referrer){const partners=[\"google\",\"bing\",\"yahoo\",\"ask\"];for(let i=0;i<partners.length;i++){if(referrer.indexOf(partners[i])>=0){return partners[i];}}return\"\";}export const ALLOWED_PARAM_KEYS=[\"r\",\"p\",\"c\",\"m\",\"keyword\",\"adposition\",\"creative\",\"device\",\"location\",\"matchtype\",\"network\",\"placement\",\"target\"];export const REFERRER_KEY=\"referrer\";export function getExperimentCookieName(experimentName){return`experiment_${experimentName}`;}\nexport const __FramerMetadata__ = {\"exports\":{\"AllowedParamKey\":{\"type\":\"tsType\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"LocalStorageValue\":{\"type\":\"tsType\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"findSearchPartner\":{\"type\":\"function\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"REFERRER_KEY\":{\"type\":\"variable\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"ALLOWED_PARAM_KEYS\":{\"type\":\"variable\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"getExperimentCookieName\":{\"type\":\"function\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"__FramerMetadata__\":{\"type\":\"variable\"}}}\n//# sourceMappingURL=./param_storage_utils.map","import{getCookie}from\"https://framerusercontent.com/modules/3RVLDDvAjT1jQK3DlrJ8/258oLwWvqXluZonjP6yG/cookie.js\";import{getExperimentCookieName}from\"https://framerusercontent.com/modules/WGRPj0DRKGHX8wtCSACn/KJ6D2P7EwHPu7pgUb1Ca/param_storage_utils.js\";/**\n * @description Get properties for a page view event\n */export function getPageViewProperties(){const params=new URLSearchParams(window.location.search);return{page_path:window.location.pathname,page_domain:window.location.hostname,page_url:window.location.href,referrer:document.referrer,utm_campaign:params.get(\"utm_campaign\")||null,utm_content:params.get(\"utm_content\")||null,utm_medium:params.get(\"utm_medium\")||null,utm_source:params.get(\"utm_source\")||null,utm_term:params.get(\"utm_term\")||null,utm_audience:params.get(\"utm_audience\")||null};}/**\n * @description Get the page context object, sent in all event requests in context.page\n */export function getPageContext(){return{pathname:window.location.pathname,referrer:document.referrer,search:window.location.search,title:document.title,url:window.location.href};}/**\n * @description Get a context object for any event\n */export function getEventContext(){const pageContext=getPageContext();return{timestamp:String(new Date().getTime()),page:pageContext};}/**\n * @description Send a click event to FullStory\n */export function sendFullstoryButtonClickEvent(button_name){const buttonName=button_name.toUpperCase();if(window.FS){window.FS(\"trackEvent\",{name:buttonName,properties:{event_name:\"CLICK\",page:{path:window.location.pathname}}});}else{console.log(\"FULLSTORY: SDK is not available.\");}}/**\n * Gets an experiment cookie\n * Eg: \"experiment_Homepage_Reimagined=/a/home\" results in\n *    treatment = \"/a/home\"\n *    experiment_id = \"Homepage_Reimagined\"\n */export function getExperimentCookie(experimentName){// Get the experiment's cookie name given the experimentName\n// eg: \"experiment_Homepage_Reimagined\"\nconst targetCookieName=getExperimentCookieName(experimentName);// The cookie value will be the experiment's treatment. Eg: \"/a/home\"\nconst targetCookieValue=getCookie(targetCookieName);// If the cookie is not found, return null\nif(!targetCookieValue){return null;}return{treatment:targetCookieValue,experiment_id:experimentName};}\nexport const __FramerMetadata__ = {\"exports\":{\"sendFullstoryButtonClickEvent\":{\"type\":\"function\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"getEventContext\":{\"type\":\"function\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"getPageViewProperties\":{\"type\":\"function\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"getPageContext\":{\"type\":\"function\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"getExperimentCookie\":{\"type\":\"function\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"__FramerMetadata__\":{\"type\":\"variable\"}}}\n//# sourceMappingURL=./tracking_utils.map","import{useCallback,useEffect}from\"react\";import{useFetch}from\"https://framerusercontent.com/modules/6UtPpKQ4XWQbVUZ8TCXH/PjHKReg11cggnAzUENNW/useFetch.js\";import{EXPERIMENT_NAMES}from\"https://framerusercontent.com/modules/LFJmKXjJwAL6XDUC01sq/p4TaERjQTBRIn4mnvXuH/tracking_events_interface.js\";import{getEventContext,getExperimentCookie,getPageViewProperties,sendFullstoryButtonClickEvent}from\"https://framerusercontent.com/modules/RoyLn3Rsr2xd0OGTHlbC/SructT94zoGoR7NxapnN/tracking_utils.js\";/**\n * @description A hook used for initializing Amplitude in Framer, and communicates to the Apollo BFF for tracking events.\n *\n * It does the following:\n *\n * 1. Sets up a document framer:click event listener (which comes out of the box with Framer), with a callback for sending button_click events1.\n * 2. Calls Apollo's BFF `api/session-start` endpoint, which initializes the client session\n * 3. Automatically sends `page_view` events on page load\n * 4. Returns an object that can be used to apply a click event for code components\n */export function useTrackingEvents(){// Send a tracking event\nconst{trigger:triggerEvent}=useFetch({urlPath:\"/events\",method:\"POST\"});// Call 'session/start' to initialize the client session\nconst{trigger:triggerSessionStart}=useFetch({urlPath:\"/session/start\",method:\"POST\"});/**\n     * @description Send the event details to the Apollo BFF\n     */const handleTrackingEvent=useCallback(async args=>{const context=getEventContext();const payload={...args,context};try{await triggerEvent(payload);}catch(err){console.error(\"An error occurred when tracking event\",payload.event,err);}},[triggerEvent]);/**\n     * @description Send a click event to both FullStory and Amplitude\n     */const sendClickEvent=useCallback(async button_name=>{sendFullstoryButtonClickEvent(button_name);await handleTrackingEvent({event:\"button_clicked\",properties:{button_name}});},[handleTrackingEvent]);/**\n     * @description Listener event specifically for click events on framer pages\n     *\n     * This callback is added to the document's framer:click event listener. It is called when a Framer Button or Link has a \"Tracking\" value\n     */const buttonClickListener=useCallback(async event=>{const eventDetail=event.detail;const trackingId=eventDetail.trackingId;if(!trackingId){return;}// Framer enforces lower kebab-case for tracking IDs. The RL analytics naming convention for button names is snake_case\nconst buttonId=trackingId.replaceAll(\"-\",\"_\");await sendClickEvent(buttonId);},[sendClickEvent]);/**\n     * @description Send a button click event to both amplitude and FullStory\n     */const sendPageViewEvent=useCallback(async()=>{const pageViewProperties=getPageViewProperties();await handleTrackingEvent({event:\"page_viewed\",properties:pageViewProperties});},[handleTrackingEvent]);/**\n     * @description Conditionally send an event for \"be_experiment_cohort_joined\"\n     */const handleSendExperimentEvent=useCallback(async experimentName=>{const experimentCookie=getExperimentCookie(experimentName);// Only send the event if the experiment cookie's treatment is the current page\nif(experimentCookie?.treatment===window.location.pathname){await handleTrackingEvent({event:\"be_experiment_cohort_joined\",properties:experimentCookie});}},[handleTrackingEvent]);/**\n     * @description Calls /api/session/start to initialize client session\n     */const initializeSession=useCallback(async()=>{// Otherwise, calling /api/session-start will set it in a cookie\ntry{await triggerSessionStart({});}catch(err){// We shouldn't block calling events if initializing the session fails\nconsole.error(\"Error initializing client session\",err);}return true;},[triggerSessionStart]);/**\n     * @description Props to spread on links or buttons to hook into click events\n     */const clickEventTrackingProps=useCallback(button_name=>{return{onClick:()=>sendClickEvent(button_name)};},[sendClickEvent]);return{clickEventTrackingProps,initializeSession,sendPageViewEvent,handleSendExperimentEvent,buttonClickListener,sendClickEvent};}export function useInitTrackingEvents(){const{initializeSession,sendPageViewEvent,handleSendExperimentEvent,buttonClickListener}=useTrackingEvents();/**\n     * On page load, set up tracking\n     */useEffect(()=>{// Set up click listener\ndocument.addEventListener(\"framer:click\",buttonClickListener);// Handle client session and page view asynchronously\nasync function initializeTracking(){// Wait until session is initialized\nawait initializeSession();// Send a page view event only after session is initialized\nawait sendPageViewEvent();// Handling an experiment event. This can be commented out or adjusted as we enable/disable experiments\n// TODO: Comment this out when the Rocket Loans Reimagined experiment is done.\nawait handleSendExperimentEvent(EXPERIMENT_NAMES.calculatorBanner);}initializeTracking();return()=>{document.removeEventListener(\"framer:click\",buttonClickListener);};},[initializeSession,buttonClickListener,sendPageViewEvent,handleSendExperimentEvent]);}\nexport const __FramerMetadata__ = {\"exports\":{\"useTrackingEvents\":{\"type\":\"function\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"useInitTrackingEvents\":{\"type\":\"function\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"__FramerMetadata__\":{\"type\":\"variable\"}}}"],"mappings":"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"}