diff --git a/src/components/views/messages/MessageActionBar.js b/src/components/views/messages/MessageActionBar.js index dc579afd4b..fc146d282d 100644 --- a/src/components/views/messages/MessageActionBar.js +++ b/src/components/views/messages/MessageActionBar.js @@ -69,10 +69,6 @@ export default class MessageActionBar extends React.PureComponent { const MessageContextMenu = sdk.getComponent('context_menus.MessageContextMenu'); const buttonRect = ev.target.getBoundingClientRect(); - // The window X and Y offsets are to adjust position when zoomed in to page - const x = buttonRect.right + window.pageXOffset; - const y = buttonRect.bottom + window.pageYOffset; - const { getTile, getReplyThread } = this.props; const tile = getTile && getTile(); const replyThread = getReplyThread && getReplyThread(); @@ -82,12 +78,9 @@ export default class MessageActionBar extends React.PureComponent { e2eInfoCallback = () => this.onCryptoClicked(); } - createMenu(MessageContextMenu, { + const menuOptions = { mxEvent: this.props.mxEvent, chevronFace: "none", - // Align the right edge of the menu to the right edge of the button - right: window.innerWidth - x, - top: y, permalinkCreator: this.props.permalinkCreator, eventTileOps: tile && tile.getEventTileOps ? tile.getEventTileOps() : undefined, collapseReplyThread: replyThread && replyThread.canCollapse() ? replyThread.collapse : undefined, @@ -95,7 +88,23 @@ export default class MessageActionBar extends React.PureComponent { onFinished: () => { this.onFocusChange(false); }, - }); + }; + + // The window X and Y offsets are to adjust position when zoomed in to page + const buttonRight = buttonRect.right + window.pageXOffset; + const buttonBottom = buttonRect.bottom + window.pageYOffset; + const buttonTop = buttonRect.top + window.pageYOffset; + // Align the right edge of the menu to the right edge of the button + menuOptions.right = window.innerWidth - buttonRight; + // Align the menu vertically on whichever side of the button has more + // space available. + if (buttonBottom < window.innerHeight / 2) { + menuOptions.top = buttonBottom; + } else { + menuOptions.bottom = window.innerHeight - buttonTop; + } + + createMenu(MessageContextMenu, menuOptions); this.onFocusChange(true); }