// Copyright (c) 2016-present Mattermost, Inc. All Rights Reserved. // See License.txt for license information. import * as Utils from 'utils/utils.jsx'; import UserStore from 'stores/user_store.jsx'; import WebrtcStore from 'stores/webrtc_store.jsx'; import TeamStore from 'stores/team_store.jsx'; import * as GlobalActions from 'actions/global_actions.jsx'; import * as WebrtcActions from 'actions/webrtc_actions.jsx'; import {openDirectChannelToUser} from 'actions/channel_actions.jsx'; import Constants from 'utils/constants.jsx'; const UserStatuses = Constants.UserStatuses; const PreReleaseFeatures = Constants.PRE_RELEASE_FEATURES; import {Popover, OverlayTrigger, Tooltip} from 'react-bootstrap'; import {FormattedMessage} from 'react-intl'; import {browserHistory} from 'react-router/es6'; import React from 'react'; export default class ProfilePopover extends React.Component { constructor(props) { super(props); this.initWebrtc = this.initWebrtc.bind(this); this.handleShowDirectChannel = this.handleShowDirectChannel.bind(this); this.generateImage = this.generateImage.bind(this); this.generateFullname = this.generateFullname.bind(this); this.generatePosition = this.generatePosition.bind(this); this.generateWebrtc = this.generateWebrtc.bind(this); this.generateEmail = this.generateEmail.bind(this); this.generateDirectMessage = this.generateDirectMessage.bind(this); this.state = { currentUserId: UserStore.getCurrentId(), loadingDMChannel: -1 }; } shouldComponentUpdate(nextProps) { if (!Utils.areObjectsEqual(nextProps.user, this.props.user)) { return true; } if (nextProps.src !== this.props.src) { return true; } if (nextProps.status !== this.props.status) { return true; } if (nextProps.isBusy !== this.props.isBusy) { return true; } // React-Bootstrap Forwarded Props from OverlayTrigger to Popover if (nextProps.arrowOffsetLeft !== this.props.arrowOffsetLeft) { return true; } if (nextProps.arrowOffsetTop !== this.props.arrowOffsetTop) { return true; } if (nextProps.positionLeft !== this.props.positionLeft) { return true; } if (nextProps.positionTop !== this.props.positionTop) { return true; } return false; } handleShowDirectChannel(e) { e.preventDefault(); if (!this.props.user) { return; } const user = this.props.user; if (this.state.loadingDMChannel !== -1) { return; } this.setState({loadingDMChannel: user.id}); openDirectChannelToUser( user.id, (channel) => { if (Utils.isMobile()) { GlobalActions.emitCloseRightHandSide(); } this.setState({loadingDMChannel: -1}); if (this.props.hide) { this.props.hide(); } browserHistory.push(TeamStore.getCurrentTeamRelativeUrl() + '/channels/' + channel.name); } ); } initWebrtc() { if (this.props.status !== UserStatuses.OFFLINE && !WebrtcStore.isBusy()) { GlobalActions.emitCloseRightHandSide(); WebrtcActions.initWebrtc(this.props.user.id, true); } } generateImage(src) { return ( ); } generateFullname() { const fullname = Utils.getFullName(this.props.user); if (fullname) { return ( {fullname}} >
{fullname}
); } return ''; } generatePosition() { if (this.props.user.hasOwnProperty('position')) { const position = this.props.user.position.substring(0, Constants.MAX_POSITION_LENGTH); return ( {position}} >
{position}
); } return ''; } generateWebrtc() { const userMedia = navigator.getUserMedia || navigator.webkitGetUserMedia || navigator.mozGetUserMedia; const webrtcEnabled = global.mm_config.EnableWebrtc === 'true' && userMedia && Utils.isFeatureEnabled(PreReleaseFeatures.WEBRTC_PREVIEW); if (webrtcEnabled && this.props.user.id !== this.state.currentUserId) { const isOnline = this.props.status !== UserStatuses.OFFLINE; let webrtcMessage; if (isOnline && !this.props.isBusy) { webrtcMessage = ( ); } else if (this.props.isBusy) { webrtcMessage = ( ); } else { webrtcMessage = ( ); } return (
this.initWebrtc()} disabled={!isOnline} > {webrtcMessage}
); } return ''; } generateEmail() { const email = this.props.user.hasOwnProperty('email') ? this.props.user.email : ''; const showEmail = (global.window.mm_config.ShowEmailAddress === 'true' || UserStore.isSystemAdminForCurrentUser() || this.props.user === UserStore.getCurrentUser()); if (email !== '' && showEmail) { return (
{email}
); } return ''; } generateDirectMessage() { if (this.props.user.id !== UserStore.getCurrentId()) { return (
); } return ''; } render() { return ( {this.generateImage(this.props.src)} {this.generateFullname()} {this.generatePosition()} {this.generateEmail()} {this.generateDirectMessage()} {this.generateWebrtc()} ); } } ProfilePopover.propTypes = Object.assign({ src: React.PropTypes.string.isRequired, user: React.PropTypes.object.isRequired, status: React.PropTypes.string, isBusy: React.PropTypes.bool, hide: React.PropTypes.func }, Popover.propTypes); delete ProfilePopover.propTypes.id;