From f7a5aa32831b923b448d239925b538a0713d622b Mon Sep 17 00:00:00 2001
From: Marshall Quander <marshall@quander.me>
Date: Mon, 16 Jul 2018 22:25:05 -0700
Subject: [PATCH] Don't use redundant device detection packages

We already use the A-Frame utilities for this elsewhere, anyway.
---
 package.json                          |  2 --
 src/react-components/entry-buttons.js | 13 +++++--------
 src/react-components/ui-root.js       | 15 +++++----------
 src/utils/disable-ios-zoom.js         |  5 +----
 src/utils/vr-caps-detect.js           |  7 ++-----
 yarn.lock                             |  8 --------
 6 files changed, 13 insertions(+), 37 deletions(-)

diff --git a/package.json b/package.json
index e001174a0..2961d685c 100644
--- a/package.json
+++ b/package.json
@@ -35,11 +35,9 @@
     "copy-to-clipboard": "^3.0.8",
     "copy-webpack-plugin": "^4.5.1",
     "detect-browser": "^2.1.0",
-    "device-detect": "^1.0.7",
     "event-target-shim": "^3.0.1",
     "form-urlencoded": "^2.0.4",
     "jsonschema": "^1.2.2",
-    "mobile-detect": "^1.4.1",
     "moment": "^2.22.0",
     "moment-timezone": "^0.5.14",
     "moving-average": "^1.0.0",
diff --git a/src/react-components/entry-buttons.js b/src/react-components/entry-buttons.js
index f2551df70..d2bddfd90 100644
--- a/src/react-components/entry-buttons.js
+++ b/src/react-components/entry-buttons.js
@@ -1,7 +1,6 @@
 import React from "react";
 import { FormattedMessage } from "react-intl";
 import PropTypes from "prop-types";
-import MobileDetect from "mobile-detect";
 
 import MobileScreenEntryImg from "../assets/images/mobile_screen_entry.svg";
 import DesktopScreenEntryImg from "../assets/images/desktop_screen_entry.svg";
@@ -10,8 +9,6 @@ import GearVREntryImg from "../assets/images/gearvr_entry.svg";
 import DaydreamEntryImg from "../assets/images/daydream_entry.svg";
 import DeviceEntryImg from "../assets/images/device_entry.svg";
 
-const mobiledetect = new MobileDetect(navigator.userAgent);
-
 const EntryButton = props => (
   <button className="entry-button" onClick={props.onClick}>
     <img src={props.iconSrc} className="entry-button__icon" />
@@ -45,9 +42,9 @@ EntryButton.propTypes = {
 export const TwoDEntryButton = props => {
   const entryButtonProps = {
     ...props,
-    iconSrc: mobiledetect.mobile() ? MobileScreenEntryImg : DesktopScreenEntryImg,
+    iconSrc: AFRAME.utils.device.isMobile() ? MobileScreenEntryImg : DesktopScreenEntryImg,
     prefixMessageId: "entry.screen-prefix",
-    mediumMessageId: mobiledetect.mobile() ? "entry.mobile-screen" : "entry.desktop-screen"
+    mediumMessageId: AFRAME.utils.device.isMobile() ? "entry.mobile-screen" : "entry.desktop-screen"
   };
 
   return <EntryButton {...entryButtonProps} />;
@@ -59,7 +56,7 @@ export const GenericEntryButton = props => {
     iconSrc: GenericVREntryImg,
     prefixMessageId: "entry.generic-prefix",
     mediumMessageId: "entry.generic-medium",
-    subtitle: mobiledetect.mobile() ? null : "entry.generic-subtitle-desktop"
+    subtitle: AFRAME.utils.device.isMobile() ? null : "entry.generic-subtitle-desktop"
   };
 
   return <EntryButton {...entryButtonProps} />;
@@ -102,13 +99,13 @@ export const DeviceEntryButton = props => {
   const entryButtonProps = {
     ...props,
     iconSrc: DeviceEntryImg,
-    prefixMessageId: mobiledetect.mobile() ? "entry.device-prefix-mobile" : "entry.device-prefix-desktop",
+    prefixMessageId: AFRAME.utils.device.isMobile() ? "entry.device-prefix-mobile" : "entry.device-prefix-desktop",
     mediumMessageId: "entry.device-medium"
   };
 
   entryButtonProps.subtitle = entryButtonProps.isInHMD
     ? "entry.device-subtitle-vr"
-    : mobiledetect.mobile() ? "entry.device-subtitle-mobile" : "entry.device-subtitle-desktop";
+    : AFRAME.utils.device.isMobile() ? "entry.device-subtitle-mobile" : "entry.device-subtitle-desktop";
 
   return <EntryButton {...entryButtonProps} />;
 };
diff --git a/src/react-components/ui-root.js b/src/react-components/ui-root.js
index c0733064a..ce6358cb8 100644
--- a/src/react-components/ui-root.js
+++ b/src/react-components/ui-root.js
@@ -3,7 +3,6 @@ import PropTypes from "prop-types";
 import classNames from "classnames";
 import { VR_DEVICE_AVAILABILITY } from "../utils/vr-caps-detect";
 import queryString from "query-string";
-import MobileDetect from "mobile-detect";
 import { IntlProvider, FormattedMessage, addLocaleData } from "react-intl";
 import en from "react-intl/locale-data/en";
 import MovingAverage from "moving-average";
@@ -27,8 +26,6 @@ import Footer from "./footer";
 import FontAwesomeIcon from "@fortawesome/react-fontawesome";
 import faQuestion from "@fortawesome/fontawesome-free-solid/faQuestion";
 
-const mobiledetect = new MobileDetect(navigator.userAgent);
-
 addLocaleData([...en]);
 
 const ENTRY_STEPS = {
@@ -456,7 +453,7 @@ class UIRoot extends Component {
   };
 
   shouldShowHmdMicWarning = () => {
-    if (mobiledetect.mobile()) return false;
+    if (AFRAME.utils.device.isMobile()) return false;
     if (!this.state.enterInVR) return false;
     if (!this.hasHmdMicrophone()) return false;
 
@@ -484,7 +481,7 @@ class UIRoot extends Component {
   };
 
   onAudioReadyButton = () => {
-    if (mobiledetect.mobile() && !this.state.enterInVR && screenfull.enabled) {
+    if (AFRAME.utils.device.isMobile() && !this.state.enterInVR && screenfull.enabled) {
       screenfull.request();
     }
 
@@ -613,7 +610,7 @@ class UIRoot extends Component {
     // Only show this in desktop firefox since other browsers/platforms will ignore the "screen" media constraint and
     // will attempt to share your webcam instead!
     const screenSharingCheckbox = this.props.enableScreenSharing &&
-      !mobiledetect.mobile() &&
+      !AFRAME.utils.device.isMobile() &&
       /firefox/i.test(navigator.userAgent) && (
         <label className="entry-panel__screen-sharing">
           <input
@@ -699,7 +696,7 @@ class UIRoot extends Component {
       clip: `rect(${maxLevelHeight - Math.floor(this.state.micLevel * maxLevelHeight)}px, 111px, 111px, 0px)`
     };
     const speakerClip = { clip: `rect(${this.state.tonePlaying ? 0 : maxLevelHeight}px, 111px, 111px, 0px)` };
-
+    const subtitleId = AFRAME.utils.device.isMobile() ? "audio.subtitle-mobile" : "audio.subtitle-desktop";
     const audioSetupPanel =
       this.state.entryStep === ENTRY_STEPS.audio_setup ? (
         <div className="audio-setup-panel">
@@ -708,9 +705,7 @@ class UIRoot extends Component {
               <FormattedMessage id="audio.title" />
             </div>
             <div className="audio-setup-panel__subtitle">
-              {(mobiledetect.mobile() || this.state.enterInVR) && (
-                <FormattedMessage id={mobiledetect.mobile() ? "audio.subtitle-mobile" : "audio.subtitle-desktop"} />
-              )}
+              {(AFRAME.utils.device.isMobile() || this.state.enterInVR) && <FormattedMessage id={subtitleId} />}
             </div>
             <div className="audio-setup-panel__levels">
               <div className="audio-setup-panel__levels__icon">
diff --git a/src/utils/disable-ios-zoom.js b/src/utils/disable-ios-zoom.js
index c2d17104a..b80639e5b 100644
--- a/src/utils/disable-ios-zoom.js
+++ b/src/utils/disable-ios-zoom.js
@@ -1,8 +1,5 @@
-import MobileDetect from "mobile-detect";
-const mobiledetect = new MobileDetect(navigator.userAgent);
-
 export function disableiOSZoom() {
-  if (!mobiledetect.is("iPhone") && !mobiledetect.is("iPad")) return;
+  if (!AFRAME.utils.device.isIOS()) return;
 
   let lastTouchAtMs = 0;
 
diff --git a/src/utils/vr-caps-detect.js b/src/utils/vr-caps-detect.js
index 8953f12a8..de3c29143 100644
--- a/src/utils/vr-caps-detect.js
+++ b/src/utils/vr-caps-detect.js
@@ -1,9 +1,6 @@
 const { detect } = require("detect-browser");
-import MobileDetect from "mobile-detect";
 
 const browser = detect();
-const deviceDetect = require("device-detect")();
-const mobiledetect = new MobileDetect(navigator.userAgent);
 
 // Precision on device detection is fuzzy -- we can sometimes know if a device is definitely
 // available, or definitely *not* available, and assume it may be available otherwise.
@@ -55,7 +52,7 @@ export async function getAvailableVREntryTypes() {
   const isWebVRCapableBrowser = window.hasNativeWebVRImplementation;
 
   const isDaydreamCapableBrowser = !!(isWebVRCapableBrowser && browser.name === "chrome" && !isSamsungBrowser);
-  const isIDevice = ["iPhone", "iPad", "iPod"].indexOf(deviceDetect.device) > -1;
+  const isIDevice = AFRAME.utils.device.isIOS();
   const isFirefoxBrowser = browser.name === "firefox";
   const isUIWebView = typeof navigator.mediaDevices === "undefined";
 
@@ -67,7 +64,7 @@ export async function getAvailableVREntryTypes() {
     ? VR_DEVICE_AVAILABILITY.no
     : isIDevice && isUIWebView ? VR_DEVICE_AVAILABILITY.maybe : VR_DEVICE_AVAILABILITY.yes;
 
-  let generic = mobiledetect.mobile() ? VR_DEVICE_AVAILABILITY.no : VR_DEVICE_AVAILABILITY.maybe;
+  let generic = AFRAME.utils.device.isMobile() ? VR_DEVICE_AVAILABILITY.no : VR_DEVICE_AVAILABILITY.maybe;
   let cardboard = VR_DEVICE_AVAILABILITY.no;
 
   // We only consider GearVR support as "maybe" and never "yes". The only browser
diff --git a/yarn.lock b/yarn.lock
index 7ccb0efec..939764a43 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -2627,10 +2627,6 @@ detective@^5.0.2:
     defined "^1.0.0"
     minimist "^1.1.1"
 
-device-detect@^1.0.7:
-  version "1.0.7"
-  resolved "https://registry.yarnpkg.com/device-detect/-/device-detect-1.0.7.tgz#d4f1aa2fc3afbbc7d4b4dc182b9822dffc50a708"
-
 diff@^2.1.2:
   version "2.2.3"
   resolved "https://registry.yarnpkg.com/diff/-/diff-2.2.3.tgz#60eafd0d28ee906e4e8ff0a52c1229521033bf99"
@@ -5366,10 +5362,6 @@ mkdirp@0.5.x, "mkdirp@>=0.5 0", mkdirp@^0.5.0, mkdirp@^0.5.1, mkdirp@~0.5.0, mkd
   dependencies:
     minimist "0.0.8"
 
-mobile-detect@^1.4.1:
-  version "1.4.1"
-  resolved "https://registry.yarnpkg.com/mobile-detect/-/mobile-detect-1.4.1.tgz#f4b67c49bb84bf0437f72e3067deb1c60ad7b23c"
-
 module-deps@^4.0.8:
   version "4.1.1"
   resolved "https://registry.yarnpkg.com/module-deps/-/module-deps-4.1.1.tgz#23215833f1da13fd606ccb8087b44852dcb821fd"
-- 
GitLab