bdf27f6218
* fix(fe2): better resiliency for when mp cant be loaded * WIP mixpanel track calls * more resiliency improvements * added all clientside tracking calls * run finished event * minor adjustment * feat(automate): revert automationRunTriggerinAssociation * feat(automate): track manual run triggers * feat(automate): backend track automation run created events * fix(automate): manual trigger type gql schema fix * feat(automate): add source based filter to run trigger tracking * fix(automate): fix trigger mock * various minor adjustments * remove comment --------- Co-authored-by: Gergő Jedlicska <gergo@jedlicska.com>
83 lines
2.0 KiB
TypeScript
83 lines
2.0 KiB
TypeScript
/* eslint-disable camelcase */
|
|
import { LogicError } from '@speckle/ui-components'
|
|
import type { OverridedMixpanel } from 'mixpanel-browser'
|
|
import type { Merge } from 'type-fest'
|
|
|
|
/**
|
|
* mixpanel-browser only supports being ran on the client-side (hence the name)! So it's only going to be accessible
|
|
* in client-side execution branches
|
|
*/
|
|
|
|
type LimitedMixpanel = Merge<
|
|
Pick<
|
|
OverridedMixpanel,
|
|
'track' | 'init' | 'reset' | 'register' | 'identify' | 'people' | 'add_group'
|
|
>,
|
|
{
|
|
people: Pick<OverridedMixpanel['people'], 'set' | 'set_once'>
|
|
}
|
|
>
|
|
|
|
const fakeLimitedMixpanel = (): LimitedMixpanel => ({
|
|
init: noop as LimitedMixpanel['init'],
|
|
track: noop,
|
|
reset: noop,
|
|
register: noop,
|
|
identify: noop,
|
|
people: {
|
|
set: noop,
|
|
set_once: noop
|
|
},
|
|
add_group: noop
|
|
})
|
|
|
|
export default defineNuxtPlugin(async () => {
|
|
const {
|
|
public: { mixpanelApiHost, mixpanelTokenId, logCsrEmitProps }
|
|
} = useRuntimeConfig()
|
|
const logger = useLogger()
|
|
|
|
let mixpanel: LimitedMixpanel | undefined = undefined
|
|
|
|
try {
|
|
mixpanel = process.client ? (await import('mixpanel-browser')).default : undefined
|
|
if (process.server) {
|
|
mixpanel = {
|
|
...fakeLimitedMixpanel(),
|
|
track: () => {
|
|
throw new Error('mixpanel is not available on the server-side')
|
|
},
|
|
identify: () => {
|
|
throw new Error('mixpanel is not available on the server-side')
|
|
},
|
|
register: () => {
|
|
throw new Error('mixpanel is not available on the server-side')
|
|
}
|
|
}
|
|
}
|
|
} catch (e) {
|
|
logger.warn(e, 'Failed to load mixpanel')
|
|
}
|
|
|
|
if (!mixpanel) {
|
|
// Implement mocked version
|
|
mixpanel = fakeLimitedMixpanel()
|
|
}
|
|
|
|
// Init
|
|
mixpanel.init(mixpanelTokenId, {
|
|
// eslint-disable-next-line camelcase
|
|
api_host: mixpanelApiHost,
|
|
debug: !!process.dev && logCsrEmitProps
|
|
})
|
|
|
|
return {
|
|
provide: {
|
|
mixpanel: () => {
|
|
if (!mixpanel) throw new LogicError('Mixpanel unexpectedly not defined')
|
|
return mixpanel
|
|
}
|
|
}
|
|
}
|
|
})
|