From 4ea78e4834d8dc61f3459157cd8a8ad68cc35dfa Mon Sep 17 00:00:00 2001
From: Brian Peiris <brianpeiris@gmail.com>
Date: Mon, 16 Apr 2018 09:44:50 -0700
Subject: [PATCH] regenerate name with random number if it hasn't been changed

---
 src/hub.js                                  |  9 +++++++--
 src/react-components/profile-entry-panel.js | 13 ++++++-------
 src/storage/store.js                        |  5 +++--
 src/utils/identity.js                       |  8 +++++---
 4 files changed, 21 insertions(+), 14 deletions(-)

diff --git a/src/hub.js b/src/hub.js
index 89c03be30..abc6f3928 100644
--- a/src/hub.js
+++ b/src/hub.js
@@ -90,7 +90,7 @@ import { inGameActions, config as inputConfig } from "./input-mappings";
 import registerTelemetry from "./telemetry";
 import Store from "./storage/store";
 
-import { generateDefaultProfile } from "./utils/identity.js";
+import { generateDefaultProfile, generateRandomName } from "./utils/identity.js";
 import { getAvailableVREntryTypes } from "./utils/vr-caps-detect.js";
 import ConcurrentLoadDetector from "./utils/concurrent-load-detector.js";
 
@@ -117,6 +117,11 @@ concurrentLoadDetector.start();
 // Always layer in any new default profile bits
 store.update({ profile: { ...generateDefaultProfile(), ...(store.state.profile || {}) } });
 
+// Regenerate name to encourage users to change it.
+if (!store.state.profile.has_changed_name) {
+  store.update({ profile: { display_name: generateRandomName() } });
+}
+
 async function exitScene() {
   hubChannel.disconnect();
   const scene = document.querySelector("a-scene");
@@ -226,7 +231,7 @@ function mountUI(scene) {
   const forcedVREntryType = qs.vr_entry_type || null;
   const enableScreenSharing = qsTruthy("enable_screen_sharing");
   const htmlPrefix = document.body.dataset.htmlPrefix || "";
-  const showProfileEntry = !store.state.profile.has_saved_profile;
+  const showProfileEntry = !store.state.profile.has_changed_name;
 
   // TODO: Refactor to avoid using return value
   /* eslint-disable react/no-render-return-value */
diff --git a/src/react-components/profile-entry-panel.js b/src/react-components/profile-entry-panel.js
index af1c7382f..0322c551f 100644
--- a/src/react-components/profile-entry-panel.js
+++ b/src/react-components/profile-entry-panel.js
@@ -14,10 +14,8 @@ class ProfileEntryPanel extends Component {
 
   constructor(props) {
     super(props);
-    this.state = {
-      display_name: this.props.store.state.profile.display_name,
-      avatar_id: this.props.store.state.profile.avatar_id
-    };
+    const { display_name, avatar_id } = this.props.store.state.profile;
+    this.state = { display_name, avatar_id };
     this.props.store.addEventListener("statechanged", this.storeUpdated);
   }
 
@@ -28,11 +26,12 @@ class ProfileEntryPanel extends Component {
 
   saveStateAndFinish = e => {
     e.preventDefault();
+    const { has_changed_name, display_name } = this.props.store.state.profile;
+    const hasChangedName = !has_changed_name && this.state.display_name !== display_name;
     this.props.store.update({
       profile: {
-        has_saved_profile: true,
-        display_name: this.state.display_name,
-        avatar_id: this.state.avatar_id
+        has_changed_name: hasChangedName,
+        ...this.state
       }
     });
     this.props.finished();
diff --git a/src/storage/store.js b/src/storage/store.js
index 2c79a0660..299ff0c40 100644
--- a/src/storage/store.js
+++ b/src/storage/store.js
@@ -1,5 +1,6 @@
 import uuid from "uuid/v4";
 import { Validator } from "jsonschema";
+import { merge } from "lodash";
 
 const LOCAL_STORE_KEY = "___mozilla_duck";
 const STORE_STATE_CACHE_KEY = Symbol();
@@ -16,7 +17,7 @@ export const SCHEMA = {
       type: "object",
       additionalProperties: false,
       properties: {
-        has_saved_profile: { type: "boolean" },
+        has_changed_name: { type: "boolean" },
         display_name: { type: "string", pattern: "^[A-Za-z0-9-]{3,32}$" },
         avatar_id: { type: "string" }
       }
@@ -57,7 +58,7 @@ export default class Store extends EventTarget {
       throw new Error("Store id is immutable.");
     }
 
-    const finalState = { ...this.state, ...newState };
+    const finalState = merge(this.state, newState);
     const isValid = validator.validate(finalState, SCHEMA).valid;
 
     if (!isValid) {
diff --git a/src/utils/identity.js b/src/utils/identity.js
index e4d79896c..4443ffb01 100644
--- a/src/utils/identity.js
+++ b/src/utils/identity.js
@@ -167,13 +167,15 @@ function selectRandom(arr) {
   return arr[Math.floor(Math.random() * arr.length)];
 }
 
+export function generateRandomName() {
+  return `${selectRandom(names)}-${Math.floor(10000 + Math.random() * 10000)}`;
+}
+
 export const avatarIds = avatars.map(av => av.id);
 
 export function generateDefaultProfile() {
-  const name = selectRandom(names);
   return {
-    has_saved_profile: false,
-    display_name: name.replace(/^./, name[0].toUpperCase()),
+    has_changed_name: false,
     avatar_id: selectRandom(avatarIds)
   };
 }
-- 
GitLab