Переглянути джерело

Merge pull request #421 from transloadit/feature/is-supproted

webcam,dashboard: Add `isSupported()` API for providers
Artur Paikin 7 роки тому
батько
коміт
c2accaa0fe
2 змінених файлів з 31 додано та 13 видалено
  1. 10 1
      src/plugins/Dashboard/index.js
  2. 21 12
      src/plugins/Webcam/index.js

+ 10 - 1
src/plugins/Dashboard/index.js

@@ -311,8 +311,17 @@ module.exports = class DashboardUI extends Plugin {
       })
     }
 
+    const isSupported = (target) => {
+      const plugin = this.core.getPlugin(target.id)
+      // If the plugin does not provide a `supported` check, assume the plugin works everywhere.
+      if (typeof plugin.isSupported !== 'function') {
+        return true
+      }
+      return plugin.isSupported()
+    }
+
     const acquirers = pluginState.targets
-      .filter(target => target.type === 'acquirer')
+      .filter(target => target.type === 'acquirer' && isSupported(target))
       .map(attachRenderFunctionToTarget)
 
     const progressindicators = pluginState.targets

+ 21 - 12
src/plugins/Webcam/index.js

@@ -16,7 +16,7 @@ function getMediaDevices () {
     return navigator.mediaDevices
   }
 
-  let getUserMedia = navigator.mozGetUserMedia || navigator.webkitGetUserMedia
+  const getUserMedia = navigator.mozGetUserMedia || navigator.webkitGetUserMedia
   if (!getUserMedia) {
     return null
   }
@@ -94,25 +94,34 @@ module.exports = class Webcam extends Plugin {
     }
   }
 
-  start () {
-    if (!this.mediaDevices) {
-      return Promise.reject(new Error('Webcam access not supported'))
-    }
-
-    this.webcamActive = true
+  isSupported () {
+    return !!this.mediaDevices
+  }
 
+  getConstraints () {
     const acceptsAudio = this.opts.modes.indexOf('video-audio') !== -1 ||
       this.opts.modes.indexOf('audio-only') !== -1
     const acceptsVideo = this.opts.modes.indexOf('video-audio') !== -1 ||
       this.opts.modes.indexOf('video-only') !== -1 ||
       this.opts.modes.indexOf('picture') !== -1
 
+    return {
+      audio: acceptsAudio,
+      video: acceptsVideo
+    }
+  }
+
+  start () {
+    if (!this.isSupported()) {
+      return Promise.reject(new Error('Webcam access not supported'))
+    }
+
+    this.webcamActive = true
+
+    const constraints = this.getConstraints()
+
     // ask user for access to their camera
-    return this.mediaDevices
-      .getUserMedia({
-        audio: acceptsAudio,
-        video: acceptsVideo
-      })
+    return this.mediaDevices.getUserMedia(constraints)
       .then((stream) => {
         this.stream = stream
         this.streamSrc = URL.createObjectURL(this.stream)