| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145 | // @flow
import React from 'react';
import { View } from 'react-native';
import { connect } from 'react-redux';
import {
    isNarrowAspectRatio,
    makeAspectRatioAware
} from '../../base/responsive-ui';
import { FILMSTRIP_SIZE, isFilmstripVisible } from '../../filmstrip';
import { HANGUP_BUTTON_SIZE } from '../../toolbox';
import AbstractNotificationsContainer, {
    _abstractMapStateToProps,
    type Props as AbstractProps
} from './AbstractNotificationsContainer';
import Notification from './Notification';
import styles from './styles';
type Props = AbstractProps & {
    /**
     * True if the {@code Filmstrip} is visible, false otherwise.
     */
    _filmstripVisible: boolean,
    /**
     * True if the {@ćode Toolbox} is visible, false otherwise.
     */
    _toolboxVisible: boolean
};
/**
 * The margin of the container to be kept from other components.
 */
const CONTAINER_MARGIN = 10;
/**
 * Implements a React {@link Component} which displays notifications and handles
 * automatic dismissmal after a notification is shown for a defined timeout
 * period.
 *
 * @extends {Component}
 */
class NotificationsContainer extends AbstractNotificationsContainer<Props> {
    /**
     * Implements React's {@link Component#render()}.
     *
     * @inheritdoc
     * @returns {ReactElement}
     */
    render() {
        const { _notifications } = this.props;
        if (!_notifications || !_notifications.length) {
            return null;
        }
        return (
            <View
                pointerEvents = 'box-none'
                style = { styles.notificationOverlay }>
                <View
                    pointerEvents = 'box-none'
                    style = { [
                        styles.notificationContainer,
                        this._getContainerStyle()
                    ] }>
                    {
                        _notifications.map(notification => {
                            const { props, uid } = notification;
                            return (
                                <Notification
                                    { ...props }
                                    key = { uid }
                                    onDismissed = { this._onDismissed }
                                    uid = { uid } />
                            );
                        })
                    }
                </View>
            </View>
        );
    }
    /**
     * Generates a style object that is to be used for the notification
     * container.
     *
     * @private
     * @returns {?Object}
     */
    _getContainerStyle() {
        const { _filmstripVisible, _toolboxVisible } = this.props;
        // The filmstrip only affects the position if we're on a narrow view.
        const _narrow = isNarrowAspectRatio(this);
        let bottom = 0;
        let right = 0;
        // The container needs additional distance from bottom when the
        // filmstrip or the toolbox is visible.
        _filmstripVisible && !_narrow && (right += FILMSTRIP_SIZE);
        _filmstripVisible && _narrow && (bottom += FILMSTRIP_SIZE);
        _toolboxVisible && (bottom += HANGUP_BUTTON_SIZE);
        bottom += CONTAINER_MARGIN;
        return {
            bottom,
            right
        };
    }
    _onDismissed: number => void;
}
/**
 * Maps (parts of) the Redux state to the associated NotificationsContainer's
 * props.
 *
 * @param {Object} state - The Redux state.
 * @private
 * @returns {{
 *     _filmstripVisible: boolean,
 *     _notifications: Array,
 *     _showNotifications: boolean,
 *     _toolboxVisible: boolean
 * }}
 */
export function _mapStateToProps(state: Object) {
    return {
        ..._abstractMapStateToProps(state),
        _filmstripVisible: isFilmstripVisible(state),
        _toolboxVisible: state['features/toolbox'].visible
    };
}
export default connect(_mapStateToProps)(
    makeAspectRatioAware(NotificationsContainer));
 |