sunguroku 5 лет назад
Родитель
Сommit
c1c552f1c4

+ 1 - 1
dashboard/src/App.tsx

@@ -7,7 +7,7 @@ type PropsType = {};
 
 type StateType = {};
 
-export default class App extends Component<PropsType, StateType> {
+export default class App extends Component<PropsType, StateType> {  
   render() {
     return (
       <ContextProvider>

+ 9 - 2
dashboard/src/index.html

@@ -2,11 +2,18 @@
 <html lang="en">
   <head>
     <title>Porter | Dashboard</title>
-
+    
+    <script>
+      !function(){var analytics=window.analytics=window.analytics||[];if(!analytics.initialize)if(analytics.invoked)window.console&&console.error&&console.error("Segment snippet included twice.");else{analytics.invoked=!0;analytics.methods=["trackSubmit","trackClick","trackLink","trackForm","pageview","identify","reset","group","track","ready","alias","debug","page","once","off","on","addSourceMiddleware","addIntegrationMiddleware","setAnonymousId","addDestinationMiddleware"];analytics.factory=function(e){return function(){var t=Array.prototype.slice.call(arguments);t.unshift(e);analytics.push(t);return analytics}};for(var e=0;e<analytics.methods.length;e++){var key=analytics.methods[e];analytics[key]=analytics.factory(key)}analytics.load=function(key,e){var t=document.createElement("script");t.type="text/javascript";t.async=!0;t.src="https://cdn.segment.com/analytics.js/v1/" + key + "/analytics.min.js";var n=document.getElementsByTagName("script")[0];n.parentNode.insertBefore(t,n);analytics._loadOptions=e};analytics._writeKey="ZKKaKBrAw9BGE8aF8XDoupd7Fi6ZyN5b";analytics.SNIPPET_VERSION="4.13.2";
+      analytics.load("<%= htmlWebpackPlugin.options.segmentKey %>");
+      analytics.page();
+      }}();
+    </script>
+    
     <link rel="icon" href="https://i.ibb.co/Xy0QK6P/dsquare.png" />
     <meta
       name="description"
-      content="Fully-managed remote dev environments for any team."
+      content="Kubernetes powered PaaS that runs in your own cloud."
     />
     <meta property="og:title" content="Porter" />
     <meta

+ 3 - 5
dashboard/src/index.tsx

@@ -1,11 +1,9 @@
 import * as React from "react";
 import * as ReactDOM from "react-dom";
 import App from "./App";
-import * as FullStory from "@fullstory/browser";
 
-FullStory.init({
-  orgId: process.env.FULLSTORY_ORG_ID,
-  devMode: process.env.NODE_ENV == "development",
-});
+declare global {
+  interface Window { analytics: any; }
+}
 
 ReactDOM.render(<App />, document.getElementById("output"));

+ 0 - 16
dashboard/src/main/home/Home.tsx

@@ -1,8 +1,6 @@
 import React, { Component } from "react";
 import { RouteComponentProps, withRouter } from "react-router";
-import posthog from "posthog-js";
 import styled from "styled-components";
-import * as FullStory from "@fullstory/browser";
 
 import api from "shared/api";
 import { Context } from "shared/Context";
@@ -199,9 +197,6 @@ class Home extends Component<PropsType, StateType> {
   };
 
   componentDidMount() {
-    let { user } = this.context;
-    FullStory.identify(user.email);
-
     // Handle redirect from DO
     let queryString = window.location.search;
     let urlParams = new URLSearchParams(queryString);
@@ -219,19 +214,8 @@ class Home extends Component<PropsType, StateType> {
       this.checkDO();
     }
 
-    // initialize posthog on non-localhosts. Gracefully fail when env vars are not set.
     this.setState({ ghRedirect: urlParams.get("gh_oauth") !== null });
     urlParams.delete("gh_oauth");
-
-    window.location.href.indexOf("localhost") === -1 &&
-      posthog.init(process.env.POSTHOG_API_KEY || "placeholder", {
-        api_host: process.env.POSTHOG_HOST || "placeholder",
-        loaded: function (posthog: any) {
-          posthog.identify(user.userId);
-          posthog.people.set({ email: user.email });
-        },
-      });
-
     this.getProjects(defaultProjectId);
   }
 

+ 6 - 0
dashboard/src/main/home/cluster-dashboard/chart/Chart.tsx

@@ -42,6 +42,12 @@ export default class Chart extends Component<PropsType, StateType> {
     return `${time} on ${date}`;
   };
 
+  componentDidMount() {
+    window.analytics.track('Opened Chart', {
+      chart: this.props.chart.chart.metadata.name
+    })
+  }
+
   render() {
     let { chart, setCurrentChart } = this.props;
 

+ 10 - 3
dashboard/src/main/home/cluster-dashboard/expanded-chart/ExpandedChart.tsx

@@ -234,8 +234,6 @@ export default class ExpandedChart extends Component<PropsType, StateType> {
       ...values,
     });
 
-    console.log("VALUES YAML", valuesYaml)
-
     this.setState({ saveValuesStatus: "loading" });
     this.refreshChart();
     api
@@ -257,10 +255,19 @@ export default class ExpandedChart extends Component<PropsType, StateType> {
           saveValuesStatus: "successful",
           forceRefreshRevisions: true,
         });
+
+        window.analytics.track('Chart Upgraded', {
+          chart: this.props.currentChart.name,
+          values: valuesYaml,
+        })
       })
       .catch((err) => {
         this.setState({ saveValuesStatus: "error" });
-        console.log(err);
+        window.analytics.track('Failed to Upgrade Chart', {
+          chart: this.props.currentChart.name,
+          values: valuesYaml,
+          error: err,
+        })
       });
   };
 

+ 14 - 14
dashboard/src/main/home/launch/expanded-template/LaunchTemplate.tsx

@@ -1,7 +1,6 @@
 import React, { Component } from "react";
 import styled from "styled-components";
 import randomWords from "random-words";
-import posthog from "posthog-js";
 import _ from "lodash";
 import { Context } from "shared/Context";
 import api from "shared/api";
@@ -138,24 +137,23 @@ class LaunchTemplate extends Component<PropsType, StateType> {
 
         this.setState({ saveValuesStatus: "successful" }, () => {
           // redirect to dashboard
-          setTimeout(() => { this.props.history.push("cluster-dashboard")}, 1000);
-        });
-
-        posthog.capture("Deployed template", {
-          name: this.props.currentTemplate.name,
-          namespace: this.state.selectedNamespace,
-          values: values,
+          setTimeout(() => { this.props.history.push("cluster-dashboard")}, 500);
+          window.analytics.track('Deployed Add-on', {
+            name: this.props.currentTemplate.name,
+            namespace: this.state.selectedNamespace,
+            values: values,
+          })
         });
       })
       .catch((err) => {
         this.setState({ saveValuesStatus: "error" });
         setCurrentError(err.response.data.errors[0]);
-        posthog.capture("Failed to deploy template", {
+        window.analytics.track('Failed to Deploy Add-on', {
           name: this.props.currentTemplate.name,
           namespace: this.state.selectedNamespace,
           values: values,
           error: err,
-        });
+        })
       });
   };
 
@@ -248,11 +246,12 @@ class LaunchTemplate extends Component<PropsType, StateType> {
           setTimeout(() => { this.props.history.push("cluster-dashboard")}, 1000);
         });
         try {
-          posthog.capture("Deployed template", {
+          window.analytics.track('Deployed Application', {
             name: this.props.currentTemplate.name,
             namespace: this.state.selectedNamespace,
+            sourceType: this.state.sourceType,
             values: values,
-          });
+          })
         } catch (error) {
           console.log(error);
         }
@@ -261,12 +260,13 @@ class LaunchTemplate extends Component<PropsType, StateType> {
         this.setState({ saveValuesStatus: "error" });
 
         try {
-          posthog.capture("Failed to deploy template", {
+          window.analytics.track('Failed to Deploy Application', {
             name: this.props.currentTemplate.name,
             namespace: this.state.selectedNamespace,
+            sourceType: this.state.sourceType,
             values: values,
             error: err,
-          });
+          })
         } catch (error) {
           console.log(error);
         }

+ 3 - 3
dashboard/src/main/home/provisioner/ProvisionerLogs.tsx

@@ -2,7 +2,6 @@ import React, { Component } from "react";
 import styled from "styled-components";
 import { Context } from "shared/Context";
 import { InfraType } from "shared/types";
-import posthog from "posthog-js";
 import { RouteComponentProps, withRouter } from "react-router";
 
 import ansiparse from "shared/ansiparser";
@@ -138,8 +137,9 @@ class ProvisionerLogs extends Component<PropsType, StateType> {
       }
 
       if (err) {
-        posthog.capture("Provisioning Error", { error: err });
-
+        window.analytics.track('Provisioning Error', {
+          error: err,
+        })
         let e = ansiparse(err).map((el: any) => {
           return el.text;
         });

+ 7 - 0
dashboard/src/shared/Context.tsx

@@ -54,10 +54,17 @@ class ContextProvider extends Component {
     setProjects: (projects: ProjectType[]) => {
       projects.sort((a: any, b: any) => (a.name > b.name ? 1 : -1));
       this.setState({ projects });
+      window.analytics.identify(this.state.user.userid, {
+        projects,
+      });
     },
     user: null as any,
     setUser: (userId: number, email: string) => {
       this.setState({ user: { userId, email } });
+      window.analytics.identify(userId, {
+        email: email,
+        createdAt: Date.now(),
+      });
     },
     devOpsMode: true,
     setDevOpsMode: (devOpsMode: boolean) => {

+ 1 - 0
dashboard/webpack.config.js

@@ -59,6 +59,7 @@ module.exports = () => {
     plugins: [
       new HtmlWebpackPlugin({
         template: path.resolve(__dirname, "src", "index.html"),
+        segmentKey: `${process.env.SEGMENT_PUBLIC_KEY}`
       }),
       new webpack.DefinePlugin(envKeys),
     ],