diff --git a/services/web/app/src/infrastructure/ExpressLocals.mjs b/services/web/app/src/infrastructure/ExpressLocals.mjs index a49e218d91..8c9adbad27 100644 --- a/services/web/app/src/infrastructure/ExpressLocals.mjs +++ b/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, cioWriteKey: Settings.analytics?.cio?.writeKey, cioSiteId: Settings.analytics?.cio?.siteId, + linkedInInsightsPartnerId: Settings.analytics?.linkedIn?.partnerId, } next() }) diff --git a/services/web/app/views/_linkedin_insight.pug b/services/web/app/views/_linkedin_insight.pug new file mode 100644 index 0000000000..9e967258bc --- /dev/null +++ b/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) diff --git a/services/web/frontend/js/infrastructure/linkedin-insight.ts b/services/web/frontend/js/infrastructure/linkedin-insight.ts new file mode 100644 index 0000000000..784df3f92c --- /dev/null +++ b/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' + ) +} diff --git a/services/web/types/exposed-settings.ts b/services/web/types/exposed-settings.ts index f9d929d13a..4412a1b848 100644 --- a/services/web/types/exposed-settings.ts +++ b/services/web/types/exposed-settings.ts @@ -50,4 +50,5 @@ export type ExposedSettings = { labsEnabled: boolean wikiEnabled?: boolean templatesEnabled?: boolean + linkedInInsightsPartnerId?: string } diff --git a/services/web/types/window.ts b/services/web/types/window.ts index 2bd0557c6f..3ee0453389 100644 --- a/services/web/types/window.ts +++ b/services/web/types/window.ts @@ -29,5 +29,9 @@ declare global { propensity?: (propensityId?: string) => void olLoadGA?: () => void grecaptcha?: ReCaptchaInstance + _linkedin_data_partner_ids?: string[] + lintrk?: ((a: string, b?: unknown) => void) & { + q: Array<[string, unknown?]> + } } } diff --git a/services/web/webpack.config.js b/services/web/webpack.config.js index 97c3418a27..f11c055fdc 100644 --- a/services/web/webpack.config.js +++ b/services/web/webpack.config.js @@ -22,6 +22,7 @@ const entryPoints = { marketing: './frontend/js/marketing.ts', 'main-style': './frontend/stylesheets/main-style.scss', tracking: './frontend/js/infrastructure/tracking.ts', + 'linkedin-insight': './frontend/js/infrastructure/linkedin-insight.ts', } // Add entrypoints for each "page"