{"version":3,"sources":["webpack:///./app/javascript/packs/baseTracking.js"],"names":["fallbackActivityRecording","tokenMeta","document","querySelector","csrfToken","getAttribute","w","Math","max","documentElement","clientWidth","window","innerWidth","h","clientHeight","innerHeight","screenW","screen","availWidth","screenH","availHeight","dataBody","path","location","pathname","search","user_language","navigator","language","referrer","user_agent","userAgent","viewport_size","screen_resolution","document_title","title","document_encoding","characterSet","document_path","fetch","method","headers","Accept","body","JSON","stringify","credentials","eventListening","registerNowButt","getElementById","onclick","ga","checkUserLoggedIn","wait","addedGA","gaTrackingCode","dataset","gaTracking","waitingOnGA","setInterval","i","s","o","g","r","a","m","q","push","arguments","l","Date","createElement","getElementsByTagName","async","src","parentNode","insertBefore","create","clearInterval","trackGoogleAnalytics3","addedGA4","ga4MeasurementCode","ga4TrackingId","waitingOnGA4","script","head","appendChild","google_tag_manager","gtag","dataLayer","trackGoogleAnalytics4","setTimeout","ArticleElement","isBot","test","randomNumber","floor","random","article_id","articleId","trackPageView","timeOnSiteCounter","timeOnSiteInterval","error","console","trackFifteenSecondsOnPage"],"mappings":"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","file":"js/baseTracking-cc1b71685f0d9370e8ff.chunk.js","sourcesContent":["function initializeBaseTracking() {\n trackGoogleAnalytics3();\n trackGoogleAnalytics4();\n trackCustomImpressions();\n}\n \nfunction trackGoogleAnalytics3() {\n let wait = 0;\n let addedGA = false;\n const gaTrackingCode = document.body.dataset.gaTracking;\n if (gaTrackingCode) {\n const waitingOnGA = setInterval(() => {\n if (!addedGA) {\n (function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){\n (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),\n m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)\n })(window,document,'script','//www.google-analytics.com/analytics.js','ga');\n }\n addedGA = true;\n wait++;\n if (window.ga && ga.create) {\n ga('create', gaTrackingCode, 'auto');\n ga('set', 'anonymizeIp', true);\n ga('send', 'pageview', location.pathname + location.search);\n clearInterval(waitingOnGA);\n }\n if (wait > 85) {\n clearInterval(waitingOnGA);\n fallbackActivityRecording();\n }\n }, 25);\n eventListening();\n }\n}\n\nfunction trackGoogleAnalytics4() {\n let wait = 0;\n let addedGA4 = false;\n const ga4MeasurementCode = document.body.dataset.ga4TrackingId;\n if (ga4MeasurementCode) {\n const waitingOnGA4 = setInterval(() => {\n if (!addedGA4) {\n //Dynamically add the Google Analytics 4 script tag\n const script = document.createElement('script');\n script.src = `//www.googletagmanager.com/gtag/js?id=${ ga4MeasurementCode}`;\n script.async = true;\n document.head.appendChild(script);\n }\n addedGA4 = true;\n wait++;\n if (window.google_tag_manager) {\n //Define the gtag function and call it. Adapted from https://stackoverflow.com/questions/22716542/google-analytics-code-explanation %>\n window.dataLayer = window.dataLayer || [];\n // eslint-disable-next-line no-inner-declarations\n function gtag(){window.dataLayer.push(arguments);}\n\n window['gtag'] = window['gtag'] || function () {\n window.dataLayer.push(arguments)\n }\n\n gtag('js', new Date());\n gtag('config', ga4MeasurementCode, { 'anonymize_ip': true });\n clearInterval(waitingOnGA4);\n }\n if (wait > 85) {\n clearInterval(waitingOnGA4);\n //The gem we're using server-side (Staccato) is not yet compatible with the Google Analytics 4 tracking code.\n //More details: https://github.com/tpitale/staccato/issues/97 %>\n fallbackActivityRecording();\n }\n }, 25);\n eventListening();\n }\n}\n\n\nfunction fallbackActivityRecording() {\n const tokenMeta = document.querySelector(\"meta[name='csrf-token']\")\n if (!tokenMeta) {\n return\n }\n const csrfToken = tokenMeta.getAttribute('content')\n const w = Math.max(document.documentElement.clientWidth, window.innerWidth || 0);\n const h = Math.max(document.documentElement.clientHeight, window.innerHeight || 0);\n const screenW = window.screen.availWidth;\n const screenH = window.screen.availHeight;\n const dataBody = {\n path: location.pathname + location.search,\n user_language: navigator.language,\n referrer: document.referrer,\n user_agent: navigator.userAgent,\n viewport_size: `${h }x${ w}`,\n screen_resolution: `${screenH }x${ screenW}`,\n document_title: document.title,\n document_encoding: document.characterSet,\n document_path: location.pathname + location.search,\n };\n window.fetch('/fallback_activity_recorder', {\n method: 'POST',\n headers: {\n Accept: 'application/json',\n 'X-CSRF-Token': csrfToken,\n },\n body: JSON.stringify(dataBody),\n credentials: 'same-origin'\n });\n}\n\nfunction eventListening(){\n const registerNowButt = document.getElementById(\"cta-comment-register-now-link\");\n if (registerNowButt) {\n registerNowButt.onclick = function(){\n ga('send', 'event', 'click', 'register-now-click', null, null);\n }\n }\n}\n\n// eslint-disable-next-line no-unused-vars\nfunction ga4eventListening(){\n const registerNowButt = document.getElementById(\"cta-comment-register-now-link\");\n if (registerNowButt) {\n registerNowButt.onclick = function(){\n gtag('event', 'register-now-click' );\n }\n }\n}\n\nfunction checkUserLoggedIn() {\n const {body} = document;\n if (!body) {\n return false;\n }\n\n return body.getAttribute('data-user-status') === 'logged-in';\n}\n\nfunction trackCustomImpressions() {\n setTimeout(()=> {\n const ArticleElement = document.getElementById('article-body') || document.getElementById('comment-article-indicator');\n const tokenMeta = document.querySelector(\"meta[name='csrf-token']\")\n const isBot = /bot|google|baidu|bing|msn|duckduckbot|teoma|slurp|yandex/i.test(navigator.userAgent) // is crawler\n // eslint-disable-next-line no-unused-vars\n const windowBigEnough = window.innerWidth > 1023\n\n // page view\n if (ArticleElement && tokenMeta && !isBot) {\n // See https://github.com/forem/forem/blob/main/app/controllers/page_views_controller.rb\n //\n // If you change the 10, you should look at the PageViewsController as well.\n const randomNumber = Math.floor(Math.random() * 10); // 1 in 10; Only track 1 in 10 impressions\n if (!checkUserLoggedIn() && randomNumber != 1) {\n return;\n }\n const dataBody = {\n article_id: ArticleElement.dataset.articleId,\n referrer: document.referrer,\n user_agent: navigator.userAgent,\n };\n const csrfToken = tokenMeta.getAttribute('content');\n trackPageView(dataBody, csrfToken);\n let timeOnSiteCounter = 0;\n const timeOnSiteInterval = setInterval(()=> {\n timeOnSiteCounter++\n const ArticleElement = document.getElementById('article-body') || document.getElementById('comment-article-indicator');\n if (ArticleElement && checkUserLoggedIn()) {\n trackFifteenSecondsOnPage(ArticleElement.dataset.articleId, csrfToken);\n } else {\n clearInterval(timeOnSiteInterval);\n }\n if ( timeOnSiteCounter > 118 ) {\n clearInterval(timeOnSiteInterval);\n }\n }, 15000)\n }\n\n }, 1800)\n}\n\nfunction trackPageView(dataBody, csrfToken) {\n window.fetch('/page_views', {\n method: 'POST',\n headers: {\n 'X-CSRF-Token': csrfToken,\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify(dataBody),\n credentials: 'same-origin',\n })\n}\n\nfunction trackFifteenSecondsOnPage(articleId, csrfToken) {\n window.fetch(`/page_views/${ articleId}`, {\n method: 'PATCH',\n headers: {\n 'X-CSRF-Token': csrfToken,\n 'Content-Type': 'application/json',\n },\n credentials: 'same-origin',\n }).catch((error) => console.error(error))\n}\n\ninitializeBaseTracking();"],"sourceRoot":""}