| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112 |
- import React, { Component } from 'react';
- import { WithTranslation } from 'react-i18next';
- import { connect } from 'react-redux';
-
- import { IReduxState, IStore } from '../../../app/types';
- import { CHAT_ENABLED } from '../../../base/flags/constants';
- import { getFeatureFlag } from '../../../base/flags/functions';
- import { translate } from '../../../base/i18n/functions';
- import { IconMessage } from '../../../base/icons/svg';
- import { getParticipantById } from '../../../base/participants/functions';
- import { IParticipant } from '../../../base/participants/types';
- import ContextMenuItem from '../../../base/ui/components/web/ContextMenuItem';
- import { openChat } from '../../../chat/actions.web';
- import { NOTIFY_CLICK_MODE } from '../../../toolbox/constants';
- import { isButtonEnabled } from '../../../toolbox/functions.web';
- import { IButtonProps } from '../../types';
-
- interface IProps extends IButtonProps, WithTranslation {
-
- /**
- * True if the private chat functionality is disabled, hence the button is not visible.
- */
- _hidden: boolean;
-
- /**
- * The participant to send the message to.
- */
- _participant?: IParticipant;
-
- /**
- * Redux dispatch function.
- */
- dispatch: IStore['dispatch'];
- }
-
- /**
- * A custom implementation of the PrivateMessageButton specialized for
- * the web version of the remote video menu. When the web platform starts to use
- * the {@code AbstractButton} component for the remote video menu, we can get rid
- * of this component and use the generic button in the chat feature.
- */
- class PrivateMessageMenuButton extends Component<IProps> {
- /**
- * Instantiates a new Component instance.
- *
- * @inheritdoc
- */
- constructor(props: IProps) {
- super(props);
-
- this._onClick = this._onClick.bind(this);
- }
-
- /**
- * Implements React's {@link Component#render()}.
- *
- * @inheritdoc
- * @returns {ReactElement}
- */
- render() {
- const { _hidden, t } = this.props;
-
- if (_hidden) {
- return null;
- }
-
- return (
- <ContextMenuItem
- accessibilityLabel = { t('toolbar.accessibilityLabel.privateMessage') }
- icon = { IconMessage }
- onClick = { this._onClick }
- text = { t('toolbar.privateMessage') } />
- );
- }
-
- /**
- * Callback to be invoked on pressing the button.
- *
- * @param {React.MouseEvent|undefined} e - The click event.
- * @returns {void}
- */
- _onClick() {
- const { _participant, dispatch, notifyClick, notifyMode } = this.props;
-
- notifyClick?.();
- if (notifyMode === NOTIFY_CLICK_MODE.PREVENT_AND_NOTIFY) {
- return;
- }
- dispatch(openChat(_participant));
- }
- }
-
- /**
- * Maps part of the Redux store to the props of this component.
- *
- * @param {Object} state - The Redux state.
- * @param {IProps} ownProps - The own props of the component.
- * @returns {IProps}
- */
- function _mapStateToProps(state: IReduxState, ownProps: any) {
- const enabled = getFeatureFlag(state, CHAT_ENABLED, true);
- const { visible = enabled } = ownProps;
-
- return {
- _participant: getParticipantById(state, ownProps.participantID),
- visible,
- _hidden: typeof interfaceConfig !== 'undefined'
- && (interfaceConfig.DISABLE_PRIVATE_MESSAGES || !isButtonEnabled('chat', state))
- };
- }
-
- export default translate(connect(_mapStateToProps)(PrivateMessageMenuButton));
|