{"version":3,"sources":["webpack:///./app/javascript/packs/baseTracking.js"],"names":["initializeBaseTracking","wait","addedGA","gaTrackingCode","document","body","dataset","gaTracking","waitingOnGA","setInterval","i","s","o","g","r","a","m","window","q","push","arguments","l","Date","createElement","getElementsByTagName","async","src","parentNode","insertBefore","ga","create","location","pathname","search","clearInterval","fallbackActivityRecording","eventListening","trackGoogleAnalytics3","addedGA4","ga4MeasurementCode","ga4TrackingId","waitingOnGA4","script","concat","head","appendChild","google_tag_manager","gtag","dataLayer","trackGoogleAnalytics4","setTimeout","ArticleElement","getElementById","tokenMeta","querySelector","isBot","test","navigator","userAgent","innerWidth","randomNumber","Math","floor","random","checkUserLoggedIn","dataBody","article_id","articleId","referrer","user_agent","csrfToken","getAttribute","fetch","method","headers","JSON","stringify","credentials","trackPageView","timeOnSiteCounter","timeOnSiteInterval","error","console","trackFifteenSecondsOnPage","w","max","documentElement","clientWidth","h","clientHeight","innerHeight","screenW","screen","availWidth","screenH","availHeight","path","user_language","language","viewport_size","screen_resolution","document_title","title","document_encoding","characterSet","document_path","Accept","registerNowButt","onclick","InstantClick","on"],"mappings":"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","file":"js/baseTracking-e12fa5f13ab8be17ee4c.chunk.js","sourcesContent":["/*eslint-disable prefer-rest-params*/\n\nfunction 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\nwindow.InstantClick.on('change', () => {\n initializeBaseTracking();\n});\ninitializeBaseTracking();\n"],"sourceRoot":""}