Просмотр исходного кода

Merge pull request #30471 from overleaf/ii-linkedin-insight-tag

[web] Add Linkedin Insight tag

GitOrigin-RevId: f01e1908ad945a5db10343a04ee50104efa32c3c
ilkin-overleaf 9 месяцев назад
Родитель
Сommit
7931c7b3eb

+ 1 - 0
services/web/app/src/infrastructure/ExpressLocals.mjs

@@ -390,6 +390,7 @@ export default async function (webRouter, privateApiRouter, publicApiRouter) {
         Settings.overleaf != null || Settings.templates?.user_id != null,
         Settings.overleaf != null || Settings.templates?.user_id != null,
       cioWriteKey: Settings.analytics?.cio?.writeKey,
       cioWriteKey: Settings.analytics?.cio?.writeKey,
       cioSiteId: Settings.analytics?.cio?.siteId,
       cioSiteId: Settings.analytics?.cio?.siteId,
+      linkedInInsightsPartnerId: Settings.analytics?.linkedIn?.partnerId,
     }
     }
     next()
     next()
   })
   })

+ 3 - 0
services/web/app/views/_linkedin_insight.pug

@@ -0,0 +1,3 @@
+if typeof suppressAnalytics == 'undefined'
+	each file in entrypointScripts('linkedin-insight')
+		script(type='text/javascript' nonce=scriptNonce src=file defer=deferScripts)

+ 32 - 0
services/web/frontend/js/infrastructure/linkedin-insight.ts

@@ -0,0 +1,32 @@
+import getMeta from '@/utils/meta'
+import {
+  createTrackingLoader,
+  insertScript,
+} from '@/infrastructure/tracking-loader'
+
+const loadLinkedInInsightScript = (linkedInInsightsPartnerId: string) => {
+  window._linkedin_data_partner_ids = window._linkedin_data_partner_ids || []
+  window._linkedin_data_partner_ids.push(linkedInInsightsPartnerId)
+
+  if (!window.lintrk) {
+    window.lintrk = Object.assign(
+      (a: string, b?: unknown) => {
+        window.lintrk!.q.push([a, b])
+      },
+      { q: [] }
+    )
+  }
+  insertScript({
+    src: 'https://snap.licdn.com/li.lms-analytics/insight.min.js',
+    async: true,
+  })
+}
+
+const { linkedInInsightsPartnerId } = getMeta('ol-ExposedSettings')
+
+if (linkedInInsightsPartnerId) {
+  createTrackingLoader(
+    () => loadLinkedInInsightScript(linkedInInsightsPartnerId),
+    'LinkedIn Insight'
+  )
+}

+ 1 - 0
services/web/types/exposed-settings.ts

@@ -50,4 +50,5 @@ export type ExposedSettings = {
   labsEnabled: boolean
   labsEnabled: boolean
   wikiEnabled?: boolean
   wikiEnabled?: boolean
   templatesEnabled?: boolean
   templatesEnabled?: boolean
+  linkedInInsightsPartnerId?: string
 }
 }

+ 4 - 0
services/web/types/window.ts

@@ -29,5 +29,9 @@ declare global {
     propensity?: (propensityId?: string) => void
     propensity?: (propensityId?: string) => void
     olLoadGA?: () => void
     olLoadGA?: () => void
     grecaptcha?: ReCaptchaInstance
     grecaptcha?: ReCaptchaInstance
+    _linkedin_data_partner_ids?: string[]
+    lintrk?: ((a: string, b?: unknown) => void) & {
+      q: Array<[string, unknown?]>
+    }
   }
   }
 }
 }

+ 1 - 0
services/web/webpack.config.js

@@ -22,6 +22,7 @@ const entryPoints = {
   marketing: './frontend/js/marketing.ts',
   marketing: './frontend/js/marketing.ts',
   'main-style': './frontend/stylesheets/main-style.scss',
   'main-style': './frontend/stylesheets/main-style.scss',
   tracking: './frontend/js/infrastructure/tracking.ts',
   tracking: './frontend/js/infrastructure/tracking.ts',
+  'linkedin-insight': './frontend/js/infrastructure/linkedin-insight.ts',
 }
 }
 
 
 // Add entrypoints for each "page"
 // Add entrypoints for each "page"