stadtwerke/innungsapp/apps/admin/instrumentation-client.ts

110 lines
3.1 KiB
TypeScript

const POSTHOG_KEY = process.env.NEXT_PUBLIC_POSTHOG_KEY
const POSTHOG_HOST = process.env.NEXT_PUBLIC_POSTHOG_HOST ?? 'https://eu.i.posthog.com'
const COOKIE_CONSENT_KEY = 'innungsapp_cookie_consent'
const COOKIE_CONSENT_EVENT = 'innungsapp:cookie-consent-granted'
export {}
type PostHogApi = {
__SV?: number
init?: (token: string, config: Record<string, unknown>) => void
capture?: (event: string, properties?: Record<string, unknown>) => void
opt_in_capturing?: () => void
opt_out_capturing?: () => void
}
declare global {
interface Window {
posthog?: PostHogApi
__innungsappPosthogInitialized?: boolean
}
}
function ensurePosthogSnippetLoaded() {
const w = window as any
if (w.posthog?.__SV) return
;(function loadSnippet(doc: Document, ph: any) {
const base: any = Array.isArray(ph) ? ph : []
if (base.__SV) return
w.posthog = base
base._i = base._i || []
base.init = function init(token: string, config: Record<string, unknown>, name?: string) {
const target = name ? (base[name] = base[name] || []) : base
const setMethod = (obj: any, method: string) => {
obj[method] = function methodStub(...args: unknown[]) {
obj.push([method, ...args])
}
}
const methods = [
'capture',
'identify',
'alias',
'group',
'set_config',
'reset',
'register',
'register_once',
'unregister',
'opt_in_capturing',
'opt_out_capturing',
'has_opted_in_capturing',
'has_opted_out_capturing',
'isFeatureEnabled',
'reloadFeatureFlags',
]
methods.forEach((method) => setMethod(target, method))
target.people = target.people || []
const peopleMethods = ['set', 'set_once', 'unset', 'increment', 'append', 'union', 'track_charge', 'clear_charges', 'delete_user']
peopleMethods.forEach((method) => setMethod(target.people, method))
const script = doc.createElement('script')
script.type = 'text/javascript'
script.async = true
script.src = `${(config.api_host as string).replace('.i.posthog.com', '-assets.i.posthog.com')}/static/array.js`
const firstScript = doc.getElementsByTagName('script')[0]
if (firstScript?.parentNode) {
firstScript.parentNode.insertBefore(script, firstScript)
} else {
doc.head.appendChild(script)
}
base._i.push([token, config, name])
}
base.__SV = 1
})(document, w.posthog || [])
}
function initPosthog() {
if (typeof window === 'undefined' || !POSTHOG_KEY) return
if (window.__innungsappPosthogInitialized) return
ensurePosthogSnippetLoaded()
window.posthog?.init?.(POSTHOG_KEY, {
api_host: POSTHOG_HOST,
defaults: '2026-01-30',
autocapture: false,
capture_pageview: false,
respect_dnt: true,
})
window.__innungsappPosthogInitialized = true
}
if (typeof window !== 'undefined' && POSTHOG_KEY) {
const consent = window.localStorage.getItem(COOKIE_CONSENT_KEY)
if (consent === 'accepted') {
initPosthog()
}
window.addEventListener(COOKIE_CONSENT_EVENT, initPosthog)
}