ref(toolbar): kill Stateless Toolbar and Invite, Feedback, Profile buttons
This commit is contained in:
parent
008645568c
commit
1e69dc93d6
|
@ -1,113 +0,0 @@
|
||||||
// @flow
|
|
||||||
|
|
||||||
import Tooltip from '@atlaskit/tooltip';
|
|
||||||
import React, { Component } from 'react';
|
|
||||||
import { connect } from 'react-redux';
|
|
||||||
|
|
||||||
import { translate } from '../../base/i18n';
|
|
||||||
|
|
||||||
import { openFeedbackDialog } from '../actions';
|
|
||||||
|
|
||||||
/**
|
|
||||||
* The type of the React {@code Component} props of {@link FeedbackButton}.
|
|
||||||
*/
|
|
||||||
type Props = {
|
|
||||||
|
|
||||||
/**
|
|
||||||
* The JitsiConference for which the feedback will be about.
|
|
||||||
*
|
|
||||||
* FIXME define JitsiConference type
|
|
||||||
* @type {JitsiConference}
|
|
||||||
*/
|
|
||||||
_conference: Object,
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Redux store dispatch function.
|
|
||||||
*/
|
|
||||||
dispatch: Dispatch<*>,
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Invoked to obtain translated strings.
|
|
||||||
*/
|
|
||||||
t: Function,
|
|
||||||
|
|
||||||
/**
|
|
||||||
* From which side of the button the tooltip should appear from.
|
|
||||||
*/
|
|
||||||
tooltipPosition: string
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Implements a Web/React Component which renders a feedback button.
|
|
||||||
*/
|
|
||||||
class FeedbackButton extends Component<Props> {
|
|
||||||
_onClick: Function;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Initializes a new FeedbackButton instance.
|
|
||||||
*
|
|
||||||
* @param {Object} props - The read-only properties with which the new
|
|
||||||
* instance is to be initialized.
|
|
||||||
*/
|
|
||||||
constructor(props: Object) {
|
|
||||||
super(props);
|
|
||||||
|
|
||||||
// Bind event handlers so they are only bound once for every instance.
|
|
||||||
this._onClick = this._onClick.bind(this);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Implements React's {@link Component#render()}.
|
|
||||||
*
|
|
||||||
* @inheritdoc
|
|
||||||
* @returns {ReactElement}
|
|
||||||
*/
|
|
||||||
render() {
|
|
||||||
return (
|
|
||||||
<div id = 'feedbackButton'>
|
|
||||||
<Tooltip
|
|
||||||
description = { this.props.t('welcomepage.sendFeedback') }
|
|
||||||
position = { this.props.tooltipPosition } >
|
|
||||||
<a
|
|
||||||
className = 'button icon-feedback'
|
|
||||||
onClick = { this._onClick } />
|
|
||||||
</Tooltip>
|
|
||||||
</div>
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Dispatches an action to open a dialog requesting call feedback.
|
|
||||||
*
|
|
||||||
* @private
|
|
||||||
* @returns {void}
|
|
||||||
*/
|
|
||||||
_onClick() {
|
|
||||||
const { _conference, dispatch } = this.props;
|
|
||||||
|
|
||||||
dispatch(openFeedbackDialog(_conference));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Maps (parts of) the Redux state to the associated Conference's props.
|
|
||||||
*
|
|
||||||
* @param {Object} state - The Redux state.
|
|
||||||
* @private
|
|
||||||
* @returns {{
|
|
||||||
* _toolboxVisible: boolean
|
|
||||||
* }}
|
|
||||||
*/
|
|
||||||
function _mapStateToProps(state) {
|
|
||||||
return {
|
|
||||||
/**
|
|
||||||
* The JitsiConference for which the feedback will be about.
|
|
||||||
*
|
|
||||||
* @private
|
|
||||||
* @type {JitsiConference}
|
|
||||||
*/
|
|
||||||
_conference: state['features/base/conference'].conference
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
export default translate(connect(_mapStateToProps)(FeedbackButton));
|
|
|
@ -1,2 +1 @@
|
||||||
export { default as FeedbackButton } from './FeedbackButton';
|
|
||||||
export { default as FeedbackDialog } from './FeedbackDialog';
|
export { default as FeedbackDialog } from './FeedbackDialog';
|
||||||
|
|
|
@ -1 +0,0 @@
|
||||||
|
|
|
@ -1,147 +0,0 @@
|
||||||
/* @flow */
|
|
||||||
|
|
||||||
import PropTypes from 'prop-types';
|
|
||||||
import React, { Component } from 'react';
|
|
||||||
import { connect } from 'react-redux';
|
|
||||||
|
|
||||||
import {
|
|
||||||
createToolbarEvent,
|
|
||||||
sendAnalytics
|
|
||||||
} from '../../analytics';
|
|
||||||
import {
|
|
||||||
getAvatarURL,
|
|
||||||
getLocalParticipant
|
|
||||||
} from '../../base/participants';
|
|
||||||
import UIEvents from '../../../../service/UI/UIEvents';
|
|
||||||
|
|
||||||
import ToolbarButton from './ToolbarButton';
|
|
||||||
|
|
||||||
declare var APP: Object;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* The default configuration for the button.
|
|
||||||
*
|
|
||||||
* @type {Object}
|
|
||||||
*/
|
|
||||||
const DEFAULT_BUTTON_CONFIGURATION = {
|
|
||||||
buttonName: 'profile',
|
|
||||||
classNames: [ 'button' ],
|
|
||||||
enabled: true,
|
|
||||||
id: 'toolbar_button_profile',
|
|
||||||
tooltipKey: 'profile.setDisplayNameLabel'
|
|
||||||
};
|
|
||||||
|
|
||||||
/**
|
|
||||||
* React {@code Component} for the profile button.
|
|
||||||
*
|
|
||||||
* @extends Component
|
|
||||||
*/
|
|
||||||
class ProfileButton extends Component<*> {
|
|
||||||
_onClick: Function;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* {@code ProfileButton}'s property types.
|
|
||||||
*
|
|
||||||
* @static
|
|
||||||
*/
|
|
||||||
static propTypes = {
|
|
||||||
/**
|
|
||||||
* The redux representation of the local participant.
|
|
||||||
*/
|
|
||||||
_localParticipant: PropTypes.object,
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Whether the button support clicking or not.
|
|
||||||
*/
|
|
||||||
_unclickable: PropTypes.bool,
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Whether the side panel is opened or not.
|
|
||||||
*/
|
|
||||||
toggled: PropTypes.bool,
|
|
||||||
|
|
||||||
/**
|
|
||||||
* From which side tooltips should display. Will be re-used for
|
|
||||||
* displaying the inline dialog for video quality adjustment.
|
|
||||||
*/
|
|
||||||
tooltipPosition: PropTypes.string
|
|
||||||
};
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Initializes a new {@code ProfileButton} instance.
|
|
||||||
*
|
|
||||||
* @param {Object} props - The read-only properties with which the new
|
|
||||||
* instance is to be initialized.
|
|
||||||
*/
|
|
||||||
constructor(props) {
|
|
||||||
super(props);
|
|
||||||
|
|
||||||
// Bind event handlers so they are only bound once for every instance.
|
|
||||||
this._onClick = this._onClick.bind(this);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Implements React's {@link Component#render()}.
|
|
||||||
*
|
|
||||||
* @inheritdoc
|
|
||||||
* @returns {ReactElement}
|
|
||||||
*/
|
|
||||||
render() {
|
|
||||||
const {
|
|
||||||
_localParticipant,
|
|
||||||
_unclickable,
|
|
||||||
tooltipPosition,
|
|
||||||
toggled
|
|
||||||
} = this.props;
|
|
||||||
const buttonConfiguration = {
|
|
||||||
...DEFAULT_BUTTON_CONFIGURATION,
|
|
||||||
unclickable: _unclickable,
|
|
||||||
toggled
|
|
||||||
};
|
|
||||||
|
|
||||||
return (
|
|
||||||
<ToolbarButton
|
|
||||||
button = { buttonConfiguration }
|
|
||||||
onClick = { this._onClick }
|
|
||||||
tooltipPosition = { tooltipPosition }>
|
|
||||||
<img
|
|
||||||
id = 'avatar'
|
|
||||||
src = { getAvatarURL(_localParticipant) } />
|
|
||||||
</ToolbarButton>
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Click handler for the button.
|
|
||||||
*
|
|
||||||
* @returns {void}
|
|
||||||
*/
|
|
||||||
_onClick() {
|
|
||||||
if (!this.props._unclickable) {
|
|
||||||
// TODO: Include an 'enable' attribute, which specifies whether
|
|
||||||
// the profile panel was opened or closed.
|
|
||||||
sendAnalytics(createToolbarEvent('profile'));
|
|
||||||
APP.UI.emitEvent(UIEvents.TOGGLE_PROFILE);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Maps (parts of) the Redux state to the associated {@code ProfileButton}
|
|
||||||
* component's props.
|
|
||||||
*
|
|
||||||
* @param {Object} state - The Redux state.
|
|
||||||
* @private
|
|
||||||
* @returns {{
|
|
||||||
* _localParticipant: Object,
|
|
||||||
* _unclickable: boolean
|
|
||||||
* }}
|
|
||||||
*/
|
|
||||||
function _mapStateToProps(state) {
|
|
||||||
return {
|
|
||||||
_localParticipant: getLocalParticipant(state),
|
|
||||||
_unclickable: !state['features/base/jwt'].isGuest
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
export default connect(_mapStateToProps)(ProfileButton);
|
|
|
@ -1,65 +0,0 @@
|
||||||
/* @flow */
|
|
||||||
|
|
||||||
import PropTypes from 'prop-types';
|
|
||||||
import React, { Component } from 'react';
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Implements a toolbar in React/Web. It is a strip that contains a set of
|
|
||||||
* toolbar items such as buttons.
|
|
||||||
*
|
|
||||||
* @class StatelessToolbar
|
|
||||||
* @extends Component
|
|
||||||
*/
|
|
||||||
export default class StatelessToolbar extends Component<*> {
|
|
||||||
/**
|
|
||||||
* Base toolbar component's property types.
|
|
||||||
*
|
|
||||||
* @static
|
|
||||||
*/
|
|
||||||
static propTypes = {
|
|
||||||
/**
|
|
||||||
* Children of current React component.
|
|
||||||
*/
|
|
||||||
children: PropTypes.node,
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Toolbar's class name.
|
|
||||||
*/
|
|
||||||
className: PropTypes.string,
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Handler for mouse out event.
|
|
||||||
*/
|
|
||||||
onMouseOut: PropTypes.func,
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Handler for mouse over event.
|
|
||||||
*/
|
|
||||||
onMouseOver: PropTypes.func
|
|
||||||
};
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Implements React's {@link Component#render()}.
|
|
||||||
*
|
|
||||||
* @inheritdoc
|
|
||||||
* @returns {ReactElement}
|
|
||||||
*/
|
|
||||||
render(): React$Element<*> {
|
|
||||||
const {
|
|
||||||
className,
|
|
||||||
onMouseOut,
|
|
||||||
onMouseOver
|
|
||||||
} = this.props;
|
|
||||||
|
|
||||||
return (
|
|
||||||
<div
|
|
||||||
className = { `toolbar ${className}` }
|
|
||||||
onMouseOut = { onMouseOut }
|
|
||||||
onMouseOver = { onMouseOver }>
|
|
||||||
{
|
|
||||||
this.props.children
|
|
||||||
}
|
|
||||||
</div>
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,130 +0,0 @@
|
||||||
/* @flow */
|
|
||||||
|
|
||||||
import PropTypes from 'prop-types';
|
|
||||||
import React from 'react';
|
|
||||||
|
|
||||||
import AbstractToolbarButton from './AbstractToolbarButton';
|
|
||||||
|
|
||||||
type MapOfAttributes = { [key: string]: * };
|
|
||||||
|
|
||||||
|
|
||||||
/* eslint-disable flowtype/space-before-type-colon */
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Takes toolbar button props and maps them to HTML attributes to set.
|
|
||||||
*
|
|
||||||
* @param {Object} props - Props set to the React component.
|
|
||||||
* @returns {MapOfAttributes}
|
|
||||||
*/
|
|
||||||
function getButtonAttributesByProps(props: Object = {})
|
|
||||||
: MapOfAttributes {
|
|
||||||
// XXX Make sure to not modify props.classNames because that'd be bad
|
|
||||||
// practice.
|
|
||||||
const classNames = (props.classNames && [ ...props.classNames ]) || [];
|
|
||||||
|
|
||||||
props.toggled && classNames.push('toggled');
|
|
||||||
props.unclickable && classNames.push('unclickable');
|
|
||||||
|
|
||||||
const result: MapOfAttributes = {
|
|
||||||
className: classNames.join(' '),
|
|
||||||
'data-container': 'body',
|
|
||||||
'data-placement': 'bottom',
|
|
||||||
id: props.id
|
|
||||||
};
|
|
||||||
|
|
||||||
if (!props.enabled) {
|
|
||||||
result.disabled = 'disabled';
|
|
||||||
}
|
|
||||||
|
|
||||||
if (props.hidden) {
|
|
||||||
result.style = { display: 'none' };
|
|
||||||
}
|
|
||||||
|
|
||||||
if (props.tooltipText) {
|
|
||||||
result.content = props.tooltipText;
|
|
||||||
}
|
|
||||||
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* eslint-enable flowtype/space-before-type-colon */
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Represents a button in Toolbar on React.
|
|
||||||
*
|
|
||||||
* @class ToolbarButton
|
|
||||||
* @extends AbstractToolbarButton
|
|
||||||
*/
|
|
||||||
export default class StatelessToolbarButton extends AbstractToolbarButton {
|
|
||||||
_onClick: Function;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Toolbar button component's property types.
|
|
||||||
*
|
|
||||||
* @static
|
|
||||||
*/
|
|
||||||
static propTypes = {
|
|
||||||
...AbstractToolbarButton.propTypes,
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Object describing button.
|
|
||||||
*/
|
|
||||||
button: PropTypes.object.isRequired
|
|
||||||
};
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Initializes new ToolbarButton instance.
|
|
||||||
*
|
|
||||||
* @param {Object} props - The read-only properties with which the new
|
|
||||||
* instance is to be initialized.
|
|
||||||
*/
|
|
||||||
constructor(props: Object) {
|
|
||||||
super(props);
|
|
||||||
|
|
||||||
// Bind methods to save the context
|
|
||||||
this._onClick = this._onClick.bind(this);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Implements React's {@link Component#render()}.
|
|
||||||
*
|
|
||||||
* @inheritdoc
|
|
||||||
* @returns {ReactElement}
|
|
||||||
*/
|
|
||||||
render(): React$Element<*> {
|
|
||||||
const { button } = this.props;
|
|
||||||
const attributes = getButtonAttributesByProps(button);
|
|
||||||
|
|
||||||
return (
|
|
||||||
<div className = 'toolbar-button'>
|
|
||||||
<a
|
|
||||||
{ ...attributes }
|
|
||||||
onClick = { this._onClick }>
|
|
||||||
{ this.props.children }
|
|
||||||
</a>
|
|
||||||
</div>
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Wrapper on on click handler props for current button.
|
|
||||||
*
|
|
||||||
* @param {Event} event - Click event object.
|
|
||||||
* @returns {void}
|
|
||||||
* @private
|
|
||||||
*/
|
|
||||||
_onClick(event: Event): void {
|
|
||||||
const {
|
|
||||||
button,
|
|
||||||
onClick
|
|
||||||
} = this.props;
|
|
||||||
const {
|
|
||||||
enabled,
|
|
||||||
unclickable
|
|
||||||
} = button;
|
|
||||||
|
|
||||||
if (enabled && !unclickable && onClick) {
|
|
||||||
onClick(event);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
Loading…
Reference in New Issue