From 39d4efa679c2d8ff1af201f330c6705f47bf0a16 Mon Sep 17 00:00:00 2001 From: Lauri Nevala Date: Fri, 20 Nov 2020 15:53:22 +0200 Subject: [PATCH] Refactoring Signed-off-by: Lauri Nevala --- extensions/telemetry/main.ts | 1 + extensions/telemetry/src/tracker.ts | 22 ++++++++++++++++++++++ src/extensions/extensions-store.ts | 17 ++++++++++++----- 3 files changed, 35 insertions(+), 5 deletions(-) diff --git a/extensions/telemetry/main.ts b/extensions/telemetry/main.ts index 0b6b13f568..15a5d68f9b 100644 --- a/extensions/telemetry/main.ts +++ b/extensions/telemetry/main.ts @@ -8,6 +8,7 @@ export default class TelemetryMainExtension extends LensMainExtension { console.log("telemetry main extension activated"); tracker.start(); tracker.reportPeriodically(); + tracker.watchExtensions(); await telemetryPreferencesStore.loadExtension(this); } diff --git a/extensions/telemetry/src/tracker.ts b/extensions/telemetry/src/tracker.ts index ede75832f1..d6fadf4ee4 100644 --- a/extensions/telemetry/src/tracker.ts +++ b/extensions/telemetry/src/tracker.ts @@ -3,6 +3,8 @@ import ua from "universal-analytics"; import Analytics from "analytics-node"; import { machineIdSync } from "node-machine-id"; import { telemetryPreferencesStore } from "./telemetry-preferences-store"; +import { reaction, IReactionDisposer } from "mobx"; +import { comparer } from "mobx"; export class Tracker extends Util.Singleton { static readonly GA_ID = "UA-159377374-1" @@ -18,6 +20,7 @@ export class Tracker extends Util.Singleton { protected userAgent: string; protected anonymousId: string; protected os: string + protected disposers: IReactionDisposer[] protected reportInterval: NodeJS.Timeout @@ -35,6 +38,7 @@ export class Tracker extends Util.Singleton { this.analytics = new Analytics(Tracker.SEGMENT_KEY, { flushAt: 1 }); this.visitor.set("dl", "https://telemetry.k8slens.dev"); this.visitor.set("ua", this.userAgent); + this.disposers = []; } start() { @@ -49,6 +53,21 @@ export class Tracker extends Util.Singleton { EventBus.appEventBus.addListener(handler); } + watchExtensions() { + let previousExtensions = App.getEnabledExtensions(); + this.disposers.push(reaction(() => App.getEnabledExtensions(), (currentExtensions) => { + const removedExtensions = previousExtensions.filter(x => !currentExtensions.includes(x)); + removedExtensions.forEach(ext => { + this.event("extension", "disable", { extension: ext }); + }); + const newExtensions = currentExtensions.filter(x => !previousExtensions.includes(x)); + newExtensions.forEach(ext => { + this.event("extension", "enable", { extension: ext }); + }) + previousExtensions = currentExtensions; + }, { equals: comparer.structural })); + } + reportPeriodically() { this.reportInterval = setInterval(() => { this.reportData(); @@ -66,6 +85,9 @@ export class Tracker extends Util.Singleton { if (this.reportInterval) { clearInterval(this.reportInterval); } + this.disposers.forEach(disposer => { + disposer(); + }); } protected async isTelemetryAllowed(): Promise { diff --git a/src/extensions/extensions-store.ts b/src/extensions/extensions-store.ts index 8f20416f97..5cae2e588b 100644 --- a/src/extensions/extensions-store.ts +++ b/src/extensions/extensions-store.ts @@ -1,7 +1,7 @@ import type { LensExtensionId } from "./lens-extension"; import type { ExtensionLoader } from "./extension-loader"; import { BaseStore } from "../common/base-store"; -import { action, observable, reaction, toJS } from "mobx"; +import { action, computed, observable, reaction, toJS } from "mobx"; export interface LensExtensionsStoreModel { extensions: Record; @@ -19,12 +19,19 @@ export class ExtensionsStore extends BaseStore { }); } - protected state = observable.map(); - - get enabledExtensions(): string[] { - return Array.from(this.state.toJS().values()).filter(ext => ext.enabled).map(ext => ext.name ); + @computed + get enabledExtensions() { + const extensions: string[] = []; + this.state.forEach((state, id) => { + if (state.enabled) { + extensions.push(state.name); + } + }) + return extensions; } + protected state = observable.map(); + protected getState(extensionLoader: ExtensionLoader) { const state: Record = {}; return Array.from(extensionLoader.userExtensions).reduce((state, [extId, ext]) => {