feat(editor, core): Integrate PostHog (#3865)

* Integrate PostHog - Part 1: Groundwork (#3753)

* Integrate PostHog - Part 2: Event capture (#3779)

* Integrate PostHog - Part 3: Session recordings (#3789)

* Integrate PostHog - Part 4: Experiments (#3825)

* Finalize PostHog integration (#3866)

* 📦 Update `package-lock.json`

* 🐛 Account for absent PH hooks file

*  Create new env `EXTERNAL_FRONTEND_HOOKS_FILES`

*  Adjust env used for injecting PostHog

* 🐛 Switch to semicolon delimiter

*  Simplify to `externalFrontendHookPath`

* Refactor FE hooks flow (#3884)

* Add env var for session recordings

* inject frontend hooks even when telemetry is off

* allow multiple hooks files

* cr

* 🐛 Handle missing ref errors

* 🔥 Remove outdated `continue`

* 🎨 Change one-liners to blocks

* 📦 Update `package-lock.json`

Co-authored-by: Ahsan Virani <ahsan.virani@gmail.com>
This commit is contained in:
Iván Ovejero
2022-08-19 15:35:39 +02:00
committed by GitHub
parent 2b4f5c6c78
commit 43e054f5ab
37 changed files with 676 additions and 217 deletions

View File

@@ -4,20 +4,23 @@
<script lang="ts">
import Vue from 'vue';
import mixins from 'vue-typed-mixins';
import { mapGetters } from 'vuex';
import { externalHooks } from './mixins/externalHooks';
export default Vue.extend({
export default mixins(externalHooks).extend({
name: 'Telemetry',
data() {
return {
initialised: false,
isTelemetryInitialized: false,
};
},
computed: {
...mapGetters('settings', ['telemetry']),
...mapGetters('users', ['currentUserId']),
isTelemeteryEnabledOnRoute(): boolean {
...mapGetters(['instanceId']),
isTelemetryEnabledOnRoute(): boolean {
return this.$route.meta && this.$route.meta.telemetry ? !this.$route.meta.telemetry.disabled: true;
},
},
@@ -26,17 +29,24 @@ export default Vue.extend({
},
methods: {
init() {
if (this.initialised || !this.isTelemeteryEnabledOnRoute) {
if (this.isTelemetryInitialized || !this.isTelemetryEnabledOnRoute) return;
const telemetrySettings = this.telemetry;
if (!telemetrySettings || !telemetrySettings.enabled) {
return;
}
const opts = this.telemetry;
if (opts && opts.enabled) {
this.initialised = true;
const instanceId = this.$store.getters.instanceId;
const userId = this.$store.getters['users/currentUserId'];
const logLevel = this.$store.getters['settings/logLevel'];
this.$telemetry.init(opts, { instanceId, logLevel, userId, store: this.$store });
}
this.$telemetry.init(
telemetrySettings,
{
instanceId: this.instanceId,
userId: this.currentUserId,
store: this.$store,
},
);
this.isTelemetryInitialized = true;
},
},
watch: {
@@ -44,10 +54,13 @@ export default Vue.extend({
this.init();
},
currentUserId(userId) {
const instanceId = this.$store.getters.instanceId;
this.$telemetry.identify(instanceId, userId);
this.$telemetry.identify(this.instanceId, userId);
this.$externalHooks().run('telemetry.currentUserIdChanged', {
instanceId: this.instanceId,
userId,
});
},
isTelemeteryEnabledOnRoute(enabled) {
isTelemetryEnabledOnRoute(enabled) {
if (enabled) {
this.init();
}