diff --git a/src/components/views/elements/DNDTagTile.js b/src/components/views/elements/DNDTagTile.js index 7aa642986b..67572d4508 100644 --- a/src/components/views/elements/DNDTagTile.js +++ b/src/components/views/elements/DNDTagTile.js @@ -19,8 +19,22 @@ import TagTile from './TagTile'; import React from 'react'; import { Draggable } from 'react-beautiful-dnd'; +import { ContextMenu, toRightOf, useContextMenu } from "../../structures/ContextMenu"; +import * as sdk from '../../../index'; export default function DNDTagTile(props) { + const [menuDisplayed, handle, openMenu, closeMenu] = useContextMenu(); + + let contextMenu = null; + if (menuDisplayed && handle.current) { + const elementRect = handle.current.getBoundingClientRect(); + const TagTileContextMenu = sdk.getComponent('context_menus.TagTileContextMenu'); + contextMenu = ( + + + + ); + } return
- { (provided, snapshot) => ( -
-
- -
- { provided.placeholder } + {(provided, snapshot) => ( +
+
- ) } + )} + {contextMenu}
; } diff --git a/src/components/views/elements/TagTile.js b/src/components/views/elements/TagTile.js index 2f182c261e..d8983ac2ea 100644 --- a/src/components/views/elements/TagTile.js +++ b/src/components/views/elements/TagTile.js @@ -16,7 +16,7 @@ See the License for the specific language governing permissions and limitations under the License. */ -import React, {createRef} from 'react'; +import React from 'react'; import PropTypes from 'prop-types'; import createReactClass from 'create-react-class'; import classNames from 'classnames'; @@ -28,7 +28,6 @@ import * as FormattingUtils from '../../../utils/FormattingUtils'; import FlairStore from '../../../stores/FlairStore'; import GroupStore from '../../../stores/GroupStore'; import TagOrderStore from '../../../stores/TagOrderStore'; -import {ContextMenu, toRightOf} from "../../structures/ContextMenu"; import MatrixClientContext from "../../../contexts/MatrixClientContext"; // A class for a child of TagPanel (possibly wrapped in a DNDTagTile) that represents @@ -43,6 +42,9 @@ export default createReactClass({ // A string tag such as "m.favourite" or a group ID such as "+groupid:domain.bla" // For now, only group IDs are handled. tag: PropTypes.string, + contextMenuButtonRef: PropTypes.object, + openMenu: PropTypes.func, + menuDisplayed: PropTypes.bool, }, statics: { @@ -55,14 +57,10 @@ export default createReactClass({ hover: false, // The profile data of the group if this.props.tag is a group ID profile: null, - // Whether or not the context menu is open - menuDisplayed: false, }; }, componentDidMount() { - this._contextMenuButton = createRef(); - this.unmounted = false; if (this.props.tag[0] === '+') { FlairStore.addListener('updateGroupProfile', this._onFlairStoreUpdated); @@ -86,7 +84,7 @@ export default createReactClass({ this.props.tag, ).then((profile) => { if (this.unmounted) return; - this.setState({profile}); + this.setState({ profile }); }).catch((err) => { console.warn('Could not fetch group profile for ' + this.props.tag, err); }); @@ -113,28 +111,19 @@ export default createReactClass({ }, onMouseOver: function() { - this.setState({hover: true}); + this.setState({ hover: true }); }, onMouseOut: function() { - this.setState({hover: false}); + this.setState({ hover: false }); }, openMenu: function(e) { // Prevent the TagTile onClick event firing as well e.stopPropagation(); e.preventDefault(); - - this.setState({ - menuDisplayed: true, - hover: false, - }); - }, - - closeMenu: function() { - this.setState({ - menuDisplayed: false, - }); + this.setState({ hover: false }); + this.props.openMenu(); }, render: function() { @@ -154,7 +143,7 @@ export default createReactClass({ const badge = TagOrderStore.getGroupBadge(this.props.tag); let badgeElement; - if (badge && !this.state.hover) { + if (badge && !this.state.hover && !this.props.menuDisplayed) { const badgeClasses = classNames({ "mx_TagTile_badge": true, "mx_TagTile_badgeHighlight": badge.highlight, @@ -163,39 +152,34 @@ export default createReactClass({ } // FIXME: this ought to use AccessibleButton for a11y but that causes onMouseOut/onMouseOver to fire too much - const contextButton = this.state.hover || this.state.menuDisplayed ? -
- { "\u00B7\u00B7\u00B7" } -
:
; - - let contextMenu; - if (this.state.menuDisplayed) { - const elementRect = this._contextMenuButton.current.getBoundingClientRect(); - const TagTileContextMenu = sdk.getComponent('context_menus.TagTileContextMenu'); - contextMenu = ( - - - - ); - } + const contextButton = this.state.hover || this.props.menuDisplayed ? +
+ {"\u00B7\u00B7\u00B7"} +
:
; const AccessibleTooltipButton = sdk.getComponent("elements.AccessibleTooltipButton"); - return - -
- - { contextButton } - { badgeElement } -
-
- { contextMenu } -
; + return +
+ + {contextButton} + {badgeElement} +
+
; }, });