Merge pull request #6793 from matrix-org/palid/fix/19012
Fix emoji picker and stickerpicker not appearing correctly when openedpull/21833/head
						commit
						74e4cc9680
					
				| 
						 | 
				
			
			@ -322,10 +322,16 @@ export class ContextMenu extends React.PureComponent<IProps, IState> {
 | 
			
		|||
 | 
			
		||||
        const menuClasses = classNames({
 | 
			
		||||
            'mx_ContextualMenu': true,
 | 
			
		||||
            'mx_ContextualMenu_left': !hasChevron && position.left,
 | 
			
		||||
            'mx_ContextualMenu_right': !hasChevron && position.right,
 | 
			
		||||
            'mx_ContextualMenu_top': !hasChevron && position.top,
 | 
			
		||||
            'mx_ContextualMenu_bottom': !hasChevron && position.bottom,
 | 
			
		||||
            /**
 | 
			
		||||
             * In some cases we may get the number of 0, which still means that we're supposed to properly
 | 
			
		||||
             * add the specific position class, but as it was falsy things didn't work as intended.
 | 
			
		||||
             * In addition, defensively check for counter cases where we may get more than one value,
 | 
			
		||||
             * even if we shouldn't.
 | 
			
		||||
             */
 | 
			
		||||
            'mx_ContextualMenu_left': !hasChevron && position.left !== undefined && !position.right,
 | 
			
		||||
            'mx_ContextualMenu_right': !hasChevron && position.right !== undefined && !position.left,
 | 
			
		||||
            'mx_ContextualMenu_top': !hasChevron && position.top !== undefined && !position.bottom,
 | 
			
		||||
            'mx_ContextualMenu_bottom': !hasChevron && position.bottom !== undefined && !position.top,
 | 
			
		||||
            'mx_ContextualMenu_withChevron_left': chevronFace === ChevronFace.Left,
 | 
			
		||||
            'mx_ContextualMenu_withChevron_right': chevronFace === ChevronFace.Right,
 | 
			
		||||
            'mx_ContextualMenu_withChevron_top': chevronFace === ChevronFace.Top,
 | 
			
		||||
| 
						 | 
				
			
			@ -404,17 +410,27 @@ export class ContextMenu extends React.PureComponent<IProps, IState> {
 | 
			
		|||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
export type ToRightOf = {
 | 
			
		||||
    left: number;
 | 
			
		||||
    top: number;
 | 
			
		||||
    chevronOffset: number;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
// Placement method for <ContextMenu /> to position context menu to right of elementRect with chevronOffset
 | 
			
		||||
export const toRightOf = (elementRect: Pick<DOMRect, "right" | "top" | "height">, chevronOffset = 12) => {
 | 
			
		||||
export const toRightOf = (elementRect: Pick<DOMRect, "right" | "top" | "height">, chevronOffset = 12): ToRightOf => {
 | 
			
		||||
    const left = elementRect.right + window.pageXOffset + 3;
 | 
			
		||||
    let top = elementRect.top + (elementRect.height / 2) + window.pageYOffset;
 | 
			
		||||
    top -= chevronOffset + 8; // where 8 is half the height of the chevron
 | 
			
		||||
    return { left, top, chevronOffset };
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
export type AboveLeftOf = IPosition & {
 | 
			
		||||
    chevronFace: ChevronFace;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
// Placement method for <ContextMenu /> to position context menu right-aligned and flowing to the left of elementRect,
 | 
			
		||||
// and either above or below: wherever there is more space (maybe this should be aboveOrBelowLeftOf?)
 | 
			
		||||
export const aboveLeftOf = (elementRect: DOMRect, chevronFace = ChevronFace.None, vPadding = 0) => {
 | 
			
		||||
export const aboveLeftOf = (elementRect: DOMRect, chevronFace = ChevronFace.None, vPadding = 0): AboveLeftOf => {
 | 
			
		||||
    const menuOptions: IPosition & { chevronFace: ChevronFace } = { chevronFace };
 | 
			
		||||
 | 
			
		||||
    const buttonRight = elementRect.right + window.pageXOffset;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -32,6 +32,7 @@ import {
 | 
			
		|||
    ContextMenu,
 | 
			
		||||
    useContextMenu,
 | 
			
		||||
    MenuItem,
 | 
			
		||||
    AboveLeftOf,
 | 
			
		||||
} from "../../structures/ContextMenu";
 | 
			
		||||
import AccessibleTooltipButton from "../elements/AccessibleTooltipButton";
 | 
			
		||||
import ReplyPreview from "./ReplyPreview";
 | 
			
		||||
| 
						 | 
				
			
			@ -511,7 +512,7 @@ export default class MessageComposer extends React.Component<IProps, IState> {
 | 
			
		|||
                null,
 | 
			
		||||
        ];
 | 
			
		||||
 | 
			
		||||
        let menuPosition;
 | 
			
		||||
        let menuPosition: AboveLeftOf | undefined;
 | 
			
		||||
        if (this.ref.current) {
 | 
			
		||||
            const contentRect = this.ref.current.getBoundingClientRect();
 | 
			
		||||
            menuPosition = aboveLeftOf(contentRect);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue