Show:

File: app/components/exp-video-config/component.js

import Em from 'ember';
import layout from './template';

import ExpFrameBaseComponent from '../exp-frame-base/component';
import VideoRecord from '../../mixins/video-record';
import { LOOKIT_PREFERRED_DEVICES } from '../../services/video-recorder';
import { observer } from '@ember/object';

let {
    $
} = Em;

/**
 * @module exp-player
 * @submodule frames
 */

/**
Video configuration frame guiding user through making sure permissions are set
appropriately and microphone is working, with troubleshooting text. Almost all content is
hard-coded, to provide a general-purpose technical setup frame.

```json
"frames": {
    "video-config": {
        "kind": "exp-video-config",
        "troubleshootingIntro": "If you're having any trouble getting your webcam set up,
          please feel free to call the XYZ lab at (123) 456-7890 and we'd be glad to
          help you out!"
    }
}
```

@class Exp-video-config
@extends Exp-frame-base
@extends Video-record
*/

export default ExpFrameBaseComponent.extend(VideoRecord, {
    layout,
    showWarning: false,
    showWebcamPermWarning: false,
    checkedWebcamPermissions: false,
    micChecked: Em.computed.alias('recorder.micChecked'),
    hasCamAccess: Em.computed.alias('recorder.hasCamAccess'),

    populateDropdowns() {
        const micSelect = $('select#audioSource')[0];
        const camSelect = $('select#videoSource')[0];
        const selectors = [micSelect, camSelect];

        // Adapted from the example at https://github.com/webrtc/samples/blob/gh-pages/src/content/devices/input-output/js/main.js
        navigator.mediaDevices.enumerateDevices().then(function(deviceInfos) {
            selectors.forEach(select => {
                while (select.firstChild) {
                    select.removeChild(select.firstChild);
                }
                const blankOption = document.createElement('option');
                blankOption.text = 'select...';
                blankOption.value = 123;
                select.appendChild(blankOption);
            });
            for (let i = 0; i !== deviceInfos.length; ++i) {
                const deviceInfo = deviceInfos[i];
                const option = document.createElement('option');
                option.value = deviceInfo.deviceId;
                if (deviceInfo.kind === 'audioinput') {
                    option.text = deviceInfo.label || `Microphone ${micSelect.length + 1}`;
                    if (option.value == LOOKIT_PREFERRED_DEVICES.mic) {
                        option.selected = true;
                    }
                    micSelect.appendChild(option);
                } else if (deviceInfo.kind === 'videoinput') {
                    option.text = deviceInfo.label || `Camera ${camSelect.length + 1}`;
                    if (option.value == LOOKIT_PREFERRED_DEVICES.cam) {
                        option.selected = true;
                    }
                    camSelect.appendChild(option);
                }
            }
        });
    },

    reloadRecorder() {
        this.destroyRecorder();
        this.setupRecorder(this.$(this.get('recorderElement')));
    },

    actions: {

        checkAudioThenNext() {
            if (!this.get('checkedWebcamPermissions') || !this.get('micChecked') || !this.get('hasCamAccess')) {
                this.set('showWarning', true);
            } else {
                this.send('next');
            }
        },

        reloadRecorderButton() {
            this.set('showWarning', false);
            this.populateDropdowns();
            this.reloadRecorder();
        },

        reloadRecorderButtonAndRecordCheck() {
            this.send('reloadRecorderButton');
            this.set('checkedWebcamPermissions', true);
        },

        processSelectedMic() {
            var selectedMicId = $('select#audioSource')[0].value;
            if (selectedMicId) {
                LOOKIT_PREFERRED_DEVICES.mic = selectedMicId;
                this.reloadRecorder();
            }
        },

        processSelectedCam() {
            var selectedCamId = $('select#videoSource')[0].value;
            if (selectedCamId) {
                LOOKIT_PREFERRED_DEVICES.cam = selectedCamId;
                this.reloadRecorder();
            }
        }
    },

    /**
     * @property {Boolean} startRecordingAutomatically
     * @private
     */

    /**
     * @property {Boolean} showWaitForRecordingMessage
     * @private
     */

    /**
     * @property {Boolean} waitForRecordingMessage
     * @private
     */

    /**
     * @property {Boolean} waitForRecordingMessageColor
     * @private
     */

    /**
     * @property {Boolean} showWaitForUploadMessage
     * @private
     */

    /**
     * @property {Boolean} waitForUploadMessage
     * @private
     */

    /**
     * @property {String} waitForUploadMessageColor
     * @private
     */

    /**
     * @property {String} waitForWebcamImage
     * @private
     */

    /**
     * @property {String} waitForWebcamVideo
     * @private
     */

    frameSchemaProperties: {
        /**
        Text to show as the introduction to the troubleshooting tips section
        @property {String} troubleshootingIntro
        @default ""
        */
        troubleshootingIntro: {
            type: 'string',
            description: 'Text to show as introduction to troubleshooting tips section',
            default: ''
        }
    },

    type: 'exp-videoconfig',
    meta: {
        data: {
            type: 'object',
            properties: {}
        }
    },

    updateOptions: observer('hasCamAccess', function() {
        if (this.get('hasCamAccess')) {
            this.populateDropdowns();
        }
    }),

    didInsertElement() {
        this._super(...arguments);
        this.populateDropdowns();
    }
});