| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150 | // @flow
import React from 'react';
import { Icon } from '../../../icons';
import AbstractStatelessAvatar, { type Props as AbstractProps } from '../AbstractStatelessAvatar';
type Props = AbstractProps & {
    /**
     * External class name passed through props.
     */
    className?: string,
    /**
     * The default avatar URL if we want to override the app bundled one (e.g. AlwaysOnTop)
     */
    defaultAvatar?: string,
    /**
     * ID of the component to be rendered.
     */
    id?: string,
    /**
     * One of the expected status strings (e.g. 'available') to render a badge on the avatar, if necessary.
     */
    status?: ?string
};
/**
 * Implements a stateless avatar component that renders an avatar purely from what gets passed through
 * props.
 */
export default class StatelessAvatar extends AbstractStatelessAvatar<Props> {
    /**
     * Implements {@code Component#render}.
     *
     * @inheritdoc
     */
    render() {
        const { initials, url } = this.props;
        if (this._isIcon(url)) {
            return (
                <div
                    className = { `${this._getAvatarClassName()} ${this._getBadgeClassName()}` }
                    id = { this.props.id }
                    style = { this._getAvatarStyle(this.props.color) }>
                    <Icon
                        size = '50%'
                        src = { url } />
                </div>
            );
        }
        if (url) {
            return (
                <div className = { this._getBadgeClassName() }>
                    <img
                        className = { this._getAvatarClassName() }
                        id = { this.props.id }
                        onError = { this.props.onAvatarLoadError }
                        src = { url }
                        style = { this._getAvatarStyle() } />
                </div>
            );
        }
        if (initials) {
            return (
                <div
                    className = { `${this._getAvatarClassName()} ${this._getBadgeClassName()}` }
                    id = { this.props.id }
                    style = { this._getAvatarStyle(this.props.color) }>
                    <svg
                        className = 'avatar-svg'
                        viewBox = '0 0 100 100'
                        xmlns = 'http://www.w3.org/2000/svg'
                        xmlnsXlink = 'http://www.w3.org/1999/xlink'>
                        <foreignObject
                            height = '100%'
                            width = '100%'>
                            <span
                                className = 'avatar-foreign'>
                                { initials }
                            </span>
                        </foreignObject>
                    </svg>
                </div>
            );
        }
        // default avatar
        return (
            <div className = { this._getBadgeClassName() }>
                <img
                    className = { this._getAvatarClassName('defaultAvatar') }
                    id = { this.props.id }
                    src = { this.props.defaultAvatar || 'images/avatar.png' }
                    style = { this._getAvatarStyle() } />
            </div>
        );
    }
    /**
     * Constructs a style object to be used on the avatars.
     *
     * @param {string?} color - The desired background color.
     * @returns {Object}
     */
    _getAvatarStyle(color) {
        const { size } = this.props;
        return {
            backgroundColor: color || undefined,
            fontSize: size ? size * 0.5 : '180%',
            height: size || '100%',
            width: size || '100%'
        };
    }
    /**
     * Constructs a list of class names required for the avatar component.
     *
     * @param {string} additional - Any additional class to add.
     * @returns {string}
     */
    _getAvatarClassName(additional) {
        return `avatar ${additional || ''} ${this.props.className || ''}`;
    }
    /**
     * Generates a class name to render a badge on the avatar, if necessary.
     *
     * @returns {string}
     */
    _getBadgeClassName() {
        const { status } = this.props;
        if (status) {
            return `avatar-badge avatar-badge-${status}`;
        }
        return '';
    }
    _isIcon: (?string | ?Object) => boolean
}
 |