Prechádzať zdrojové kódy

resolve merge conflicts

Alexander Belanger 5 rokov pred
rodič
commit
15cbc18377

+ 1 - 0
.github/workflows/production.yaml

@@ -31,6 +31,7 @@ jobs:
           FEEDBACK_ENDPOINT=${{secrets.FEEDBACK_ENDPOINT}}
           POSTHOG_API_KEY=${{secrets.POSTHOG_API_KEY}}
           POSTHOG_HOST=${{secrets.POSTHOG_HOST}}
+          SEGMENT_PUBLIC_KEY=${{secrets.SEGMENT_PUBLIC_KEY}}
           EOL
       - name: Build
         run: |

+ 1 - 0
.github/workflows/staging.yaml

@@ -31,6 +31,7 @@ jobs:
           FEEDBACK_ENDPOINT=${{secrets.FEEDBACK_ENDPOINT}}
           POSTHOG_API_KEY=${{secrets.POSTHOG_API_KEY}}
           POSTHOG_HOST=${{secrets.POSTHOG_HOST}}
+          SEGMENT_PUBLIC_KEY=${{secrets.SEGMENT_PUBLIC_KEY}}
           EOL
       - name: Build
         run: |

+ 2 - 0
.prettierignore

@@ -0,0 +1,2 @@
+build
+node_modules

+ 0 - 18
dashboard/package-lock.json

@@ -181,11 +181,6 @@
       "resolved": "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.7.5.tgz",
       "integrity": "sha512-OWORNpfjMsSSUBVrRBVGECkhWcULOAJz9ZW8uK9qgxD+87M7jHRcvh/A96XXNhXTLmKcoYSQtBEX7lHMO7YRwg=="
     },
-    "@fullstory/browser": {
-      "version": "1.4.6",
-      "resolved": "https://registry.npmjs.org/@fullstory/browser/-/browser-1.4.6.tgz",
-      "integrity": "sha512-tvm7zVsK3Zn2QW76+4dkmOGGhwkb+Srqm4tQExsJJzw5bhDaYiqNtOvmqiZ5Jp423yCREcqtEHZVSyVXkiWbvw=="
-    },
     "@jest/types": {
       "version": "24.9.0",
       "resolved": "https://registry.npmjs.org/@jest/types/-/types-24.9.0.tgz",
@@ -3312,11 +3307,6 @@
         "websocket-driver": ">=0.5.1"
       }
     },
-    "fflate": {
-      "version": "0.4.8",
-      "resolved": "https://registry.npmjs.org/fflate/-/fflate-0.4.8.tgz",
-      "integrity": "sha512-FJqqoDBR00Mdj9ppamLa/Y7vxm+PRmNWA67N846RvsoYVMKB4q3y/de5PA7gUmRMYK/8CMz2GDZQmCRN1wBcWA=="
-    },
     "figgy-pudding": {
       "version": "3.5.2",
       "resolved": "https://registry.npmjs.org/figgy-pudding/-/figgy-pudding-3.5.2.tgz",
@@ -5818,14 +5808,6 @@
       "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.1.0.tgz",
       "integrity": "sha512-97DXOFbQJhk71ne5/Mt6cOu6yxsSfM0QGQyl0L25Gca4yGWEGJaig7l7gbCX623VqTBNGLRLaVUCnNkcedlRSQ=="
     },
-    "posthog-js": {
-      "version": "1.8.5",
-      "resolved": "https://registry.npmjs.org/posthog-js/-/posthog-js-1.8.5.tgz",
-      "integrity": "sha512-YwKejadn4GAjqbA3cvpmou2As3P0nMSt76kySRmfH/XmM00YDs8o4WFrorWHJvDAbln46CXIzAzfgS71sZ+gXw==",
-      "requires": {
-        "fflate": "^0.4.1"
-      }
-    },
     "prettier": {
       "version": "2.2.1",
       "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.2.1.tgz",

+ 0 - 2
dashboard/package.json

@@ -3,7 +3,6 @@
   "version": "0.1.0",
   "private": true,
   "dependencies": {
-    "@fullstory/browser": "^1.4.5",
     "@material-ui/core": "^4.11.3",
     "@types/d3-array": "^2.9.0",
     "@types/d3-time-format": "^3.0.0",
@@ -32,7 +31,6 @@
     "js-yaml": "^3.14.0",
     "lodash": "^4.17.20",
     "markdown-to-jsx": "^7.0.1",
-    "posthog-js": "^1.8.5",
     "qs": "^6.9.4",
     "random-words": "^1.1.1",
     "react": "^16.13.1",

+ 65 - 1
dashboard/src/index.html

@@ -3,10 +3,74 @@
   <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

+ 5 - 5
dashboard/src/index.tsx

@@ -1,11 +1,11 @@
 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.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,
+        });
       });
   };
 

+ 11 - 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";
@@ -148,27 +147,23 @@ class LaunchTemplate extends Component<PropsType, StateType> {
           // 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,
+          }, 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,
         });
-        */
       });
   };
 
@@ -256,9 +251,10 @@ class LaunchTemplate extends Component<PropsType, StateType> {
         });
         /*
         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) {
@@ -270,9 +266,10 @@ 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,
           });

+ 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),
     ],

+ 0 - 12
package-lock.json

@@ -1,12 +0,0 @@
-{
-  "requires": true,
-  "lockfileVersion": 1,
-  "dependencies": {
-    "prettier": {
-      "version": "2.2.1",
-      "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.2.1.tgz",
-      "integrity": "sha512-PqyhM2yCjg/oKkFPtTGUojv7gnZAoG80ttl45O6x2Ug/rMJw4wcc9k6aaf2hibP7BGVCCM33gZoGjyvt9mm16Q==",
-      "dev": true
-    }
-  }
-}