src/provider/VideoProvider.js

goog.module('gep.provider.VideoProvider');

const AutoResetProvider = goog.require('gep.provider.AutoResetProvider');

const {Event,EventType,EventTarget} = goog.require('goog.events');

/**
 * This provider (singleton) controls the creation of the Vimeo video player instances and controls them.
 * @extends {EventTarget}
 */
class VideoProvider extends EventTarget
{
    constructor()
    {
        super();

        /**
         * Reference to AutoResetProvider to monitor and control the automatic reset of the page when the user is inactive for a specified period of time.
         * @type {AutoResetProvider}
         * @private
         */
        this.autoResetProvider_ = AutoResetProvider.getInstance();

        /**
         * List of Vimeo video player instances
         * @type {Map<string,Vimeo.Player>}
         * @private
         */
        this.players_ = new Map();

        /**
         * Defines whether a video is currently playing.
         * @type {boolean}
         * @private
         */
        this.videoIsPlaying_ = false;
    }

    /**
     * Creates a Vimeo video player instance and creates the necessary listeners to control the video.
     * @param {string} key
     * @param {Element} container
     * @param {Object=} options
     * @return {Vimeo.Player}
     */
    createPlayer(key, container, options = null)
    {
        let player = new Vimeo.Player(container, options);
        player.on('play', () => {
            this.dispatchEvent(new Event(EventType.PLAY));
            this.videoIsPlaying_ = true;
            this.autoResetProvider_.cancel();
        });
        player.on('pause', () => {
            this.dispatchEvent(new Event(EventType.PAUSE));
            this.videoIsPlaying_ = false;
            this.autoResetProvider_.start();
        });
        player.on('ended', () => {
            this.dispatchEvent(new Event(EventType.PAUSE));
            this.videoIsPlaying_ = false;
            this.autoResetProvider_.start();
        });
        this.players_.set(key, player);
        return player;
    }

    /**
     * Returns an instance from the list of Vimeo videos after the searched list key
     * @param {string} key
     * @return {Vimeo.Player}
     */
    getPlayer(key)
    {
        if(this.players_.has(key))
            return this.players_.get(key);
        return null;
    }

    /**
     * Destroys an instance from the list of Vimeo videos after the searched key
     * @param {string} key
     */
    deletePlayer(key)
    {
        if(this.players_.has(key))
        {
            this.players_.get(key).destroy().catch((error) => {console.warn(error);});
            this.players_.delete(key);
        }
    }

    /**
     * Pauses all videos
     */
    pauseAllPlayers()
    {
        this.players_.forEach((player) => {
            player.pause();
        });
        this.dispatchEvent(new Event(EventType.PAUSE));
    }

    /**
     * Getter
     * @return {boolean}
     */
    get videoIsPlaying()
    {
        return this.videoIsPlaying_;
    }
}

goog.addSingletonGetter(VideoProvider);

exports = VideoProvider;