mirror of
https://github.com/lensapp/lens.git
synced 2025-05-20 05:10:56 +00:00
In-app survey extension (#1945)
* Initial in-app survey implementation Signed-off-by: Lauri Nevala <lauri.nevala@gmail.com> * Add surveyId fetching and store integration Signed-off-by: Lauri Nevala <lauri.nevala@gmail.com> * Add empty line Signed-off-by: Lauri Nevala <lauri.nevala@gmail.com> * Fix typos Signed-off-by: Lauri Nevala <lauri.nevala@gmail.com> * Use async version of machineId + refactoring Signed-off-by: Lauri Nevala <lauri.nevala@gmail.com> * Update preferences hint text Signed-off-by: Lauri Nevala <lauri.nevala@gmail.com> Co-authored-by: Jari Kolehmainen <jari.kolehmainen@gmail.com>
This commit is contained in:
1 parent
5287e7e528
commit
a0e24e0a4d
11 files changed
+8196
-1
No files matched your search
+3
@@ -0,0 +1,3 @@
|
||||
declare module "refiner-js" {
|
||||
export default function Refiner(key: string, value: string|object|number|Boolean|Array): void;
|
||||
}
|
||||
@@ -0,0 +1,27 @@
|
||||
import { Component } from "@k8slens/extensions";
|
||||
import React from "react";
|
||||
import { observer } from "mobx-react";
|
||||
import { SurveyPreferencesStore } from "./survey-preferences-store";
|
||||
|
||||
@observer
|
||||
export class SurveyPreferenceInput extends React.Component<{survey: SurveyPreferencesStore}, {}> {
|
||||
render() {
|
||||
const { survey } = this.props;
|
||||
|
||||
return (
|
||||
<Component.Checkbox
|
||||
label="Allow in-app surveys"
|
||||
value={survey.enabled}
|
||||
onChange={v => survey.enabled = v }
|
||||
/>
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
export class SurveyPreferenceHint extends React.Component {
|
||||
render() {
|
||||
return (
|
||||
<span>This will allow you to participate in surveys to improve the Lens experience.</span>
|
||||
);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,36 @@
|
||||
import { Store } from "@k8slens/extensions";
|
||||
import { observable, toJS, when } from "mobx";
|
||||
|
||||
export type SurveyPreferencesModel = {
|
||||
enabled: boolean;
|
||||
};
|
||||
|
||||
export class SurveyPreferencesStore extends Store.ExtensionStore<SurveyPreferencesModel> {
|
||||
|
||||
@observable enabled = true;
|
||||
|
||||
whenEnabled = when(() => this.enabled);
|
||||
|
||||
private constructor() {
|
||||
super({
|
||||
configName: "preferences-store",
|
||||
defaults: {
|
||||
enabled: true
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
protected fromStore({ enabled }: SurveyPreferencesModel): void {
|
||||
this.enabled = enabled;
|
||||
}
|
||||
|
||||
toJSON(): SurveyPreferencesModel {
|
||||
return toJS({
|
||||
enabled: this.enabled
|
||||
}, {
|
||||
recurseEverything: true
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
export const surveyPreferencesStore = SurveyPreferencesStore.getInstance<SurveyPreferencesStore>();
|
||||
@@ -0,0 +1,46 @@
|
||||
import { Util } from "@k8slens/extensions";
|
||||
import { machineId } from "node-machine-id";
|
||||
import Refiner from "refiner-js";
|
||||
import got from "got";
|
||||
import { surveyPreferencesStore } from "./survey-preferences-store";
|
||||
|
||||
type SurveyIdResponse = {
|
||||
surveyId: string;
|
||||
};
|
||||
export class Survey extends Util.Singleton {
|
||||
static readonly PROJECT_ID = "af468d00-4f8f-11eb-b01d-23b6562fef43";
|
||||
protected anonymousId: string;
|
||||
|
||||
private constructor() {
|
||||
super();
|
||||
}
|
||||
|
||||
async start() {
|
||||
await surveyPreferencesStore.whenEnabled;
|
||||
|
||||
const surveyId = await this.fetchSurveyId();
|
||||
|
||||
if (surveyId) {
|
||||
Refiner("setProject", Survey.PROJECT_ID);
|
||||
Refiner("identifyUser", {
|
||||
id: surveyId,
|
||||
});
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
async fetchSurveyId() {
|
||||
try {
|
||||
const surveyApi = process.env.SURVEY_API_URL || "https://survey.k8slens.dev";
|
||||
const anonymousId = await machineId();
|
||||
const { body } = await got(`${surveyApi}/api/survey-id?anonymousId=${anonymousId}`, { responseType: "json"});
|
||||
|
||||
return (body as SurveyIdResponse).surveyId;
|
||||
} catch(error) {
|
||||
return null;
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
export const survey = Survey.getInstance<Survey>();
|
||||
Reference in new issue
Block a user