// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved. // See License.txt for license information. import ProfilePicture from 'components/profile_picture.jsx'; import TeamStore from 'stores/team_store.jsx'; import UserStore from 'stores/user_store.jsx'; import ChannelStore from 'stores/channel_store.jsx'; import TeamMembersModal from 'components/team_members_modal.jsx'; import ChannelMembersModal from 'components/channel_members_modal.jsx'; import ChannelInviteModal from 'components/channel_invite_modal'; import {openDirectChannelToUser} from 'actions/channel_actions.jsx'; import {Client4} from 'mattermost-redux/client'; import * as Utils from 'utils/utils.jsx'; import Constants from 'utils/constants.jsx'; import {canManageMembers} from 'utils/channel_utils.jsx'; import $ from 'jquery'; import PropTypes from 'prop-types'; import React from 'react'; import {Tooltip, OverlayTrigger, Popover, Overlay} from 'react-bootstrap'; import {FormattedMessage} from 'react-intl'; import {browserHistory} from 'react-router/es6'; export default class PopoverListMembers extends React.Component { static propTypes = { channel: PropTypes.object.isRequired, members: PropTypes.array.isRequired, memberCount: PropTypes.number, actions: PropTypes.shape({ getProfilesInChannel: PropTypes.func.isRequired }).isRequired } constructor(props) { super(props); this.showMembersModal = this.showMembersModal.bind(this); this.handleShowDirectChannel = this.handleShowDirectChannel.bind(this); this.closePopover = this.closePopover.bind(this); this.state = { showPopover: false, showTeamMembersModal: false, showChannelMembersModal: false, showChannelInviteModal: false }; } componentDidUpdate() { $('.member-list__popover .popover-content .more-modal__body').perfectScrollbar(); } handleShowDirectChannel(teammate, e) { e.preventDefault(); openDirectChannelToUser( teammate.id, (channel, channelAlreadyExisted) => { browserHistory.push(TeamStore.getCurrentTeamRelativeUrl() + '/channels/' + channel.name); if (channelAlreadyExisted) { this.closePopover(); } }, () => { this.closePopover(); } ); } closePopover() { this.setState({showPopover: false}); } showMembersModal(e) { e.preventDefault(); this.setState({ showPopover: false, showChannelMembersModal: true }); } render() { let popoverButton; const popoverHtml = []; const members = this.props.members; const teamMembers = UserStore.getProfilesUsernameMap(); const currentUserId = UserStore.getCurrentId(); const isSystemAdmin = UserStore.isSystemAdminForCurrentUser(); const isTeamAdmin = TeamStore.isTeamAdminForCurrentTeam(); const isChannelAdmin = ChannelStore.isChannelAdminForCurrentChannel(); const membersIcon = Constants.MEMBERS_ICON_SVG; if (members && teamMembers) { members.sort((a, b) => { const aName = Utils.displayEntireName(a.id); const bName = Utils.displayEntireName(b.id); return aName.localeCompare(bName); }); members.forEach((m, i) => { let messageIcon = ''; if (currentUserId !== m.id && this.props.channel.type !== Constants.DM_CHANNEl) { messageIcon = Constants.MESSAGE_ICON_SVG; } let name = ''; if (teamMembers[m.username]) { name = Utils.displayUsernameForUser(teamMembers[m.username]); } if (name) { popoverHtml.push(
this.handleShowDirectChannel(m, e)} key={'popover-member-' + i} >
{name}
); } }); if (this.props.channel.type !== Constants.GM_CHANNEL) { let membersName = ( ); const manageMembers = canManageMembers(this.props.channel, isChannelAdmin, isTeamAdmin, isSystemAdmin); const isDefaultChannel = ChannelStore.isDefault(this.props.channel); if ((manageMembers === false && isDefaultChannel === false) || isDefaultChannel) { membersName = ( ); } popoverButton = (
); } } const count = this.props.memberCount; let countText = '-'; if (count > 0) { countText = count.toString(); } const title = ( ); let channelMembersModal; if (this.state.showChannelMembersModal) { channelMembersModal = ( this.setState({showChannelMembersModal: false})} showInviteModal={() => this.setState({showChannelInviteModal: true})} channel={this.props.channel} /> ); } let teamMembersModal; if (this.state.showTeamMembersModal) { teamMembersModal = ( this.setState({showTeamMembersModal: false})} isAdmin={isTeamAdmin || isSystemAdmin} /> ); } let channelInviteModal; if (this.state.showChannelInviteModal) { channelInviteModal = ( this.setState({showChannelInviteModal: false})} channel={this.props.channel} /> ); } const channelMembersTooltip = ( ); return (
{ this.setState({popoverTarget: e.target, showPopover: !this.state.showPopover}); this.props.actions.getProfilesInChannel(this.props.channel.id, 0); }} > {countText}
this.state.popoverTarget} placement='bottom' >
{title}
{popoverHtml}
{popoverButton}
{channelMembersModal} {teamMembersModal} {channelInviteModal}
); } }