mirror of
https://gitcode.com/GitHub_Trending/ji/jitsi-meet.git
synced 2025-12-30 11:22:31 +00:00
Instead of going through the Avatar object, call the getAvatarURL directly so that the code flows consistently use the participant representation within redux.
184 lines
5.0 KiB
JavaScript
184 lines
5.0 KiB
JavaScript
import Button from '@atlaskit/button';
|
|
import React, { Component } from 'react';
|
|
import { connect } from 'react-redux';
|
|
|
|
import { translate } from '../../base/i18n';
|
|
import { getAvatarURL, getParticipants } from '../../base/participants';
|
|
import { openInviteDialog } from '../../invite';
|
|
|
|
import ContactListItem from './ContactListItem';
|
|
|
|
const { PropTypes } = React;
|
|
|
|
declare var interfaceConfig: Object;
|
|
|
|
/**
|
|
* React component for showing a list of current conference participants, the
|
|
* current conference lock state, and a button to open the invite dialog.
|
|
*
|
|
* @extends Component
|
|
*/
|
|
class ContactListPanel extends Component {
|
|
/**
|
|
* Default values for {@code ContactListPanel} component's properties.
|
|
*
|
|
* @static
|
|
*/
|
|
static propTypes = {
|
|
/**
|
|
* Whether or not the conference is currently locked with a password.
|
|
*/
|
|
_locked: PropTypes.bool,
|
|
|
|
/**
|
|
* The participants to show in the contact list.
|
|
*/
|
|
_participants: PropTypes.array,
|
|
|
|
/**
|
|
* Invoked to open an invite dialog.
|
|
*/
|
|
dispatch: PropTypes.func,
|
|
|
|
/**
|
|
* Invoked to obtain translated strings.
|
|
*/
|
|
t: PropTypes.func
|
|
};
|
|
|
|
/**
|
|
* Initializes a new {@code ContactListPanel} instance.
|
|
*
|
|
* @param {Object} props - The read-only properties with which the new
|
|
* instance is to be initialized.
|
|
*/
|
|
constructor(props) {
|
|
super(props);
|
|
|
|
// Bind event handler so it is only bound once for every instance.
|
|
this._onOpenInviteDialog = this._onOpenInviteDialog.bind(this);
|
|
}
|
|
|
|
/**
|
|
* Implements React's {@link Component#render()}.
|
|
*
|
|
* @inheritdoc
|
|
*/
|
|
render() {
|
|
const { _locked, _participants, t } = this.props;
|
|
|
|
return (
|
|
<div className = 'contact-list-panel'>
|
|
<div className = 'title'>
|
|
{ t('contactlist', { pcount: _participants.length }) }
|
|
</div>
|
|
<div className = 'sideToolbarBlock first'>
|
|
<Button
|
|
appearance = 'primary'
|
|
className = 'contact-list-panel-invite-button'
|
|
id = 'addParticipantsBtn'
|
|
onClick = { this._onOpenInviteDialog }
|
|
type = 'button'>
|
|
{ t('addParticipants') }
|
|
</Button>
|
|
<div>
|
|
{ _locked
|
|
? this._renderLockedMessage()
|
|
: this._renderUnlockedMessage() }
|
|
</div>
|
|
</div>
|
|
<ul id = 'contacts'>
|
|
{ this._renderContacts() }
|
|
</ul>
|
|
</div>
|
|
);
|
|
}
|
|
|
|
/**
|
|
* Dispatches an action to open an invite dialog.
|
|
*
|
|
* @private
|
|
* @returns {void}
|
|
*/
|
|
_onOpenInviteDialog() {
|
|
this.props.dispatch(openInviteDialog());
|
|
}
|
|
|
|
/**
|
|
* Renders React Elements for displaying information about each participant
|
|
* in the contact list.
|
|
*
|
|
* @private
|
|
* @returns {ReactElement[]}
|
|
*/
|
|
_renderContacts() {
|
|
return this.props._participants.map(participant => {
|
|
const { id, name } = participant;
|
|
|
|
return (
|
|
<ContactListItem
|
|
avatarURI = { interfaceConfig.SHOW_CONTACTLIST_AVATARS
|
|
? getAvatarURL(participant) : null }
|
|
id = { id }
|
|
key = { id }
|
|
name = { name } />
|
|
);
|
|
});
|
|
}
|
|
|
|
/**
|
|
* Renders a React Element for informing the conference is currently locked.
|
|
*
|
|
* @private
|
|
* @returns {ReactElement}
|
|
*/
|
|
_renderLockedMessage() {
|
|
return (
|
|
<p
|
|
className = 'form-control__hint form-control_full-width'
|
|
id = 'contactListroomLocked'>
|
|
<span className = 'icon-security-locked' />
|
|
<span>{ this.props.t('roomLocked') }</span>
|
|
</p>
|
|
);
|
|
}
|
|
|
|
/**
|
|
* Renders a React Element for informing the conference is currently not
|
|
* locked.
|
|
*
|
|
* @private
|
|
* @returns {ReactElement}
|
|
*/
|
|
_renderUnlockedMessage() {
|
|
return (
|
|
<p
|
|
className = 'form-control__hint form-control_full-width'
|
|
id = 'contactListroomUnlocked'>
|
|
<span className = 'icon-security' />
|
|
<span>{ this.props.t('roomUnlocked') }</span>
|
|
</p>
|
|
);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Maps (parts of) the Redux state to the associated {@code ContactListPanel}'s
|
|
* props.
|
|
*
|
|
* @param {Object} state - The Redux state.
|
|
* @private
|
|
* @returns {{
|
|
* _locked: boolean,
|
|
* _participants: Array
|
|
* }}
|
|
*/
|
|
function _mapStateToProps(state) {
|
|
return {
|
|
_locked: state['features/base/conference'].locked,
|
|
_participants: getParticipants(state)
|
|
};
|
|
}
|
|
|
|
export default translate(connect(_mapStateToProps)(ContactListPanel));
|