From a27ec8243bc5e6aa9fcff28c45e9a17b50379415 Mon Sep 17 00:00:00 2001 From: Alexander Zinchuk Date: Sat, 15 Apr 2023 13:51:28 +0200 Subject: [PATCH] Message: Fix quick reaction position (#2969) --- src/components/middle/message/Message.scss | 1 + src/components/middle/message/Message.tsx | 46 ++++++++++++------- .../middle/message/MessageMeta.scss | 2 - src/components/middle/message/MessageMeta.tsx | 5 +- .../middle/message/hooks/useOuterHandlers.ts | 19 ++++---- 5 files changed, 46 insertions(+), 27 deletions(-) diff --git a/src/components/middle/message/Message.scss b/src/components/middle/message/Message.scss index 047eed505..ed4ef440f 100644 --- a/src/components/middle/message/Message.scss +++ b/src/components/middle/message/Message.scss @@ -80,6 +80,7 @@ opacity: 0; transition: transform 0.2s ease-out, opacity 0.2s ease-out; transition-delay: 0.2s; + z-index: 1; &.visible { opacity: 1 !important; diff --git a/src/components/middle/message/Message.tsx b/src/components/middle/message/Message.tsx index ce5464293..7e516d2dd 100644 --- a/src/components/middle/message/Message.tsx +++ b/src/components/middle/message/Message.tsx @@ -263,6 +263,9 @@ type ReactionsPosition = 'inside' | 'outside' | 'none'; +type QuickReactionPosition = + 'in-content' + | 'in-meta'; const NBSP = '\u00A0'; // eslint-disable-next-line max-len @@ -371,7 +374,7 @@ const Message: FC = ({ // eslint-disable-next-line no-null/no-null const bottomMarkerRef = useRef(null); // eslint-disable-next-line no-null/no-null - const contentRef = useRef(null); + const quickReactionRef = useRef(null); const messageHeightRef = useRef(0); @@ -492,7 +495,7 @@ const Message: FC = ({ handleBeforeContextMenu, chatId, isContextMenuShown, - contentRef, + quickReactionRef, isOwn, isInDocumentGroupNotLast, ); @@ -641,6 +644,8 @@ const Message: FC = ({ reactionsPosition = 'none'; } + const quickReactionPosition: QuickReactionPosition = isCustomShape ? 'in-meta' : 'in-content'; + useEnsureMessage( isRepliesChat && message.replyToChatId ? message.replyToChatId : chatId, hasReply ? message.replyToMessageId : undefined, @@ -788,6 +793,25 @@ const Message: FC = ({ ); } + function renderQuickReactionButton() { + if (!defaultReaction) return undefined; + + return ( +
+ +
+ ); + } + function renderReactionsAndMeta() { const meta = ( = ({ outgoingStatus={outgoingStatus} signature={signature} withReactionOffset={reactionsPosition === 'inside'} + renderQuickReactionButton={ + withQuickReactionButton && quickReactionPosition === 'in-meta' ? renderQuickReactionButton : undefined + } availableReactions={availableReactions} isTranslated={Boolean(requestedTranslationLanguage ? currentTranslatedText : undefined)} onClick={handleMetaClick} @@ -1216,7 +1243,6 @@ const Message: FC = ({ className={buildClassName('message-content-wrapper', contentClassName.includes('text') && 'can-select-text')} >
= ({ {withAppendix && (
)} - {withQuickReactionButton && ( -
- -
- )} + {withQuickReactionButton && quickReactionPosition === 'in-content' && renderQuickReactionButton()}
{message.inlineButtons && ( diff --git a/src/components/middle/message/MessageMeta.scss b/src/components/middle/message/MessageMeta.scss index 6f3c67062..3c8267544 100644 --- a/src/components/middle/message/MessageMeta.scss +++ b/src/components/middle/message/MessageMeta.scss @@ -168,8 +168,6 @@ .Message:not(.own) { .custom-shape .with-subheader + .MessageMeta { - right: auto; - left: 13.25rem; bottom: 0.25rem; } } diff --git a/src/components/middle/message/MessageMeta.tsx b/src/components/middle/message/MessageMeta.tsx index 61bf03556..0a8546c0e 100644 --- a/src/components/middle/message/MessageMeta.tsx +++ b/src/components/middle/message/MessageMeta.tsx @@ -1,4 +1,4 @@ -import type { FC } from '../../../lib/teact/teact'; +import type { FC, TeactNode } from '../../../lib/teact/teact'; import React, { memo, useMemo } from '../../../lib/teact/teact'; import { getActions } from '../../../global'; @@ -31,6 +31,7 @@ type OwnProps = { isPinned?: boolean; onClick: (e: React.MouseEvent) => void; onTranslationClick: (e: React.MouseEvent) => void; + renderQuickReactionButton?: () => TeactNode | undefined; onOpenThread: NoneToVoidFunction; }; @@ -40,6 +41,7 @@ const MessageMeta: FC = ({ signature, withReactionOffset, repliesThreadInfo, + renderQuickReactionButton, noReplies, isTranslated, isPinned, @@ -140,6 +142,7 @@ const MessageMeta: FC = ({ {outgoingStatus && ( )} + {renderQuickReactionButton && renderQuickReactionButton()} ); }; diff --git a/src/components/middle/message/hooks/useOuterHandlers.ts b/src/components/middle/message/hooks/useOuterHandlers.ts index fc71a35d2..2d2330f5b 100644 --- a/src/components/middle/message/hooks/useOuterHandlers.ts +++ b/src/components/middle/message/hooks/useOuterHandlers.ts @@ -30,7 +30,7 @@ export default function useOuterHandlers( handleBeforeContextMenu: (e: React.MouseEvent) => void, chatId: string, isContextMenuShown: boolean, - contentRef: RefObject, + quickReactionRef: RefObject, isOwn: boolean, shouldHandleMouseLeave: boolean, ) { @@ -46,16 +46,18 @@ export default function useOuterHandlers( } function handleMouseMove(e: React.MouseEvent) { - const container = contentRef.current; - if (!container) return; + const quickReactionContainer = quickReactionRef.current; + if (!quickReactionContainer) return; const { clientX, clientY } = e; const { - x, width, y, height, - } = container.getBoundingClientRect(); + x: quickReactionX, width: quickReactionWidth, y: quickReactionY, height: quickReactionHeight, + } = quickReactionContainer.getBoundingClientRect(); + const x = quickReactionX + quickReactionWidth / 2; + const y = quickReactionY + quickReactionHeight / 2; - const isVisibleX = Math.abs((isOwn ? (clientX - x) : (x + width - clientX))) < QUICK_REACTION_AREA_WIDTH; - const isVisibleY = Math.abs(y + height - clientY) < QUICK_REACTION_AREA_HEIGHT; + const isVisibleX = Math.abs(x - clientX) < QUICK_REACTION_AREA_WIDTH; + const isVisibleY = Math.abs(y - clientY) < QUICK_REACTION_AREA_HEIGHT; if (isVisibleX && isVisibleY) { markQuickReactionVisible(); } else { @@ -63,7 +65,8 @@ export default function useOuterHandlers( } } - function handleSendQuickReaction() { + function handleSendQuickReaction(e: React.MouseEvent) { + e.stopPropagation(); sendDefaultReaction({ chatId, messageId,