| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152 | // @flow
import React, { Component } from 'react';
import Filmstrip from '../../../../../modules/UI/videolayout/Filmstrip';
import { getLocalParticipant } from '../../../base/participants';
import { connect } from '../../../base/redux';
import { getToolboxHeight } from '../../../toolbox/functions.web';
import VideoManager from './VideoManager';
import YoutubeVideoManager from './YoutubeVideoManager';
declare var interfaceConfig: Object;
type Props = {
    /**
     * The available client width
     */
    clientHeight: number,
    /**
     * The available client width
     */
    clientWidth: number,
    /**
     * Whether the (vertical) filmstrip is visible or not.
     */
    filmstripVisible: boolean,
    /**
     * Is the video shared by the local user.
     *
     * @private
     */
     isOwner: boolean,
    /**
     * The shared video url
     */
     videoUrl: string,
}
/**
 * Implements a React {@link Component} which represents the large video (a.k.a.
 * the conference participant who is on the local stage) on Web/React.
 *
 * @extends Component
 */
class SharedVideo extends Component<Props> {
    /**
     * Computes the width and the height of the component.
     *
     * @returns {{
     *  height: number,
     *  width: number
     * }}
     */
    getDimensions() {
        const { clientHeight, clientWidth, filmstripVisible } = this.props;
        let width;
        let height;
        if (interfaceConfig.VERTICAL_FILMSTRIP) {
            if (filmstripVisible) {
                width = `${clientWidth - Filmstrip.getVerticalFilmstripWidth()}px`;
            } else {
                width = `${clientWidth}px`;
            }
            height = `${clientHeight - getToolboxHeight()}px`;
        } else {
            if (filmstripVisible) {
                height = `${clientHeight - Filmstrip.getFilmstripHeight()}px`;
            } else {
                height = `${clientHeight}px`;
            }
            width = `${clientWidth}px`;
        }
        return {
            width,
            height
        };
    }
    /**
     * Retrieves the manager to be used for playing the shared video.
     *
     * @returns {Component}
     */
    getManager() {
        const { videoUrl } = this.props;
        if (!videoUrl) {
            return null;
        }
        if (videoUrl.match(/http/)) {
            return <VideoManager videoId = { videoUrl } />;
        }
        return <YoutubeVideoManager videoId = { videoUrl } />;
    }
    /**
     * Implements React's {@link Component#render()}.
     *
     * @inheritdoc
     * @returns {React$Element}
     */
    render() {
        const { isOwner } = this.props;
        const className = isOwner ? '' : 'disable-pointer';
        return (
            <div
                className = { className }
                id = 'sharedVideo'
                style = { this.getDimensions() }>
                {this.getManager()}
            </div>
        );
    }
}
/**
 * Maps (parts of) the Redux state to the associated LargeVideo props.
 *
 * @param {Object} state - The Redux state.
 * @private
 * @returns {Props}
 */
function _mapStateToProps(state) {
    const { ownerId, videoUrl } = state['features/shared-video'];
    const { clientHeight, clientWidth } = state['features/base/responsive-ui'];
    const { visible } = state['features/filmstrip'];
    const localParticipant = getLocalParticipant(state);
    return {
        clientHeight,
        clientWidth,
        filmstripVisible: visible,
        isOwner: ownerId === localParticipant?.id,
        videoUrl
    };
}
export default connect(_mapStateToProps)(SharedVideo);
 |