EmbeddedMessage: Display forwards (#3914)

This commit is contained in:
Alexander Zinchuk 2023-10-27 12:49:46 +02:00
parent 9787a4dead
commit e898aa01a7
4 changed files with 30 additions and 4 deletions

View File

@ -69,13 +69,20 @@
font-size: calc(var(--message-text-size, 1rem) - 0.125rem); font-size: calc(var(--message-text-size, 1rem) - 0.125rem);
} }
.icon { .embedded-more {
font-size: 1.125rem; font-size: 1.125rem;
margin-inline-end: 0.125rem; margin-inline-end: 0.125rem;
line-height: 0.9375rem; line-height: 0.9375rem;
vertical-align: -0.1875rem; vertical-align: -0.1875rem;
} }
.embedded-origin-icon {
display: inline-block;
font-size: 0.75rem;
margin-inline: 0.125rem;
transform: translateY(1px);
}
.message-text { .message-text {
overflow: hidden; overflow: hidden;
margin-inline-start: 0.5rem; margin-inline-start: 0.5rem;

View File

@ -28,6 +28,7 @@ import useThumbnail from '../../hooks/useThumbnail';
import useMessageTranslation from '../middle/message/hooks/useMessageTranslation'; import useMessageTranslation from '../middle/message/hooks/useMessageTranslation';
import ActionMessage from '../middle/ActionMessage'; import ActionMessage from '../middle/ActionMessage';
import Icon from './Icon';
import MediaSpoiler from './MediaSpoiler'; import MediaSpoiler from './MediaSpoiler';
import MessageSummary from './MessageSummary'; import MessageSummary from './MessageSummary';
@ -37,6 +38,7 @@ type OwnProps = {
className?: string; className?: string;
message?: ApiMessage; message?: ApiMessage;
sender?: ApiPeer; sender?: ApiPeer;
forwardSender?: ApiPeer;
title?: string; title?: string;
customText?: string; customText?: string;
noUserColors?: boolean; noUserColors?: boolean;
@ -55,6 +57,7 @@ const EmbeddedMessage: FC<OwnProps> = ({
className, className,
message, message,
sender, sender,
forwardSender,
title, title,
customText, customText,
isProtected, isProtected,
@ -83,6 +86,9 @@ const EmbeddedMessage: FC<OwnProps> = ({
const lang = useLang(); const lang = useLang();
const senderTitle = sender ? getSenderTitle(lang, sender) : message?.forwardInfo?.hiddenUserName; const senderTitle = sender ? getSenderTitle(lang, sender) : message?.forwardInfo?.hiddenUserName;
const forwardSenderTitle = forwardSender ? getSenderTitle(lang, forwardSender)
: message?.forwardInfo?.hiddenUserName;
const areSendersSame = sender?.id === forwardSender?.id;
const { handleClick, handleMouseDown } = useFastClick(onClick); const { handleClick, handleMouseDown } = useFastClick(onClick);
@ -120,9 +126,17 @@ const EmbeddedMessage: FC<OwnProps> = ({
/> />
)} )}
</p> </p>
<div className="message-title" dir="auto">{renderText(senderTitle || title || NBSP)}</div> <div className="message-title" dir="auto">
{renderText(senderTitle || title || NBSP)}
{forwardSenderTitle && !areSendersSame && (
<>
<Icon name={forwardSender ? 'share-filled' : 'forward'} className="embedded-origin-icon" />
{renderText(forwardSenderTitle)}
</>
)}
</div>
</div> </div>
{hasContextMenu && <i className="embedded-more icon icon-more" />} {hasContextMenu && <Icon name="more" className="embedded-more" />}
</div> </div>
); );
}; };

View File

@ -207,6 +207,7 @@ type StateProps = {
shouldHideReply?: boolean; shouldHideReply?: boolean;
replyMessage?: ApiMessage; replyMessage?: ApiMessage;
replyMessageSender?: ApiPeer; replyMessageSender?: ApiPeer;
replyMessageForwardSender?: ApiPeer;
replyStory?: ApiTypeStory; replyStory?: ApiTypeStory;
storySender?: ApiUser; storySender?: ApiUser;
outgoingStatus?: ApiMessageOutgoingStatus; outgoingStatus?: ApiMessageOutgoingStatus;
@ -316,6 +317,7 @@ const Message: FC<OwnProps & StateProps> = ({
shouldHideReply, shouldHideReply,
replyMessage, replyMessage,
replyMessageSender, replyMessageSender,
replyMessageForwardSender,
replyStory, replyStory,
storySender, storySender,
outgoingStatus, outgoingStatus,
@ -943,6 +945,7 @@ const Message: FC<OwnProps & StateProps> = ({
noUserColors={isOwn || isChannel} noUserColors={isOwn || isChannel}
isProtected={isProtected} isProtected={isProtected}
sender={replyMessageSender} sender={replyMessageSender}
forwardSender={replyMessageForwardSender}
chatTranslations={chatTranslations} chatTranslations={chatTranslations}
requestedChatTranslationLanguage={requestedChatTranslationLanguage} requestedChatTranslationLanguage={requestedChatTranslationLanguage}
observeIntersectionForLoading={observeIntersectionForLoading} observeIntersectionForLoading={observeIntersectionForLoading}
@ -1461,6 +1464,7 @@ export default memo(withGlobal<OwnProps>(
? selectChatMessage(global, isRepliesChat && replyToChatId ? replyToChatId : chatId, replyToMessageId) ? selectChatMessage(global, isRepliesChat && replyToChatId ? replyToChatId : chatId, replyToMessageId)
: undefined; : undefined;
const replyMessageSender = replyMessage && selectReplySender(global, replyMessage, Boolean(forwardInfo)); const replyMessageSender = replyMessage && selectReplySender(global, replyMessage, Boolean(forwardInfo));
const replyMessageForwardSender = replyMessage && selectForwardedSender(global, replyMessage);
const isReplyToTopicStart = replyMessage?.content.action?.type === 'topicCreate'; const isReplyToTopicStart = replyMessage?.content.action?.type === 'topicCreate';
const replyStory = replyToStoryId && replyToStoryUserId const replyStory = replyToStoryId && replyToStoryUserId
? selectPeerStory(global, replyToStoryUserId, replyToStoryId) ? selectPeerStory(global, replyToStoryUserId, replyToStoryId)
@ -1534,6 +1538,7 @@ export default memo(withGlobal<OwnProps>(
isThreadTop, isThreadTop,
replyMessage, replyMessage,
replyMessageSender, replyMessageSender,
replyMessageForwardSender,
replyStory, replyStory,
storySender, storySender,
isInDocumentGroup, isInDocumentGroup,

View File

@ -459,7 +459,7 @@ export function selectForwardedSender<T extends GlobalState>(
if (forwardInfo.isChannelPost && forwardInfo.fromChatId) { if (forwardInfo.isChannelPost && forwardInfo.fromChatId) {
return selectChat(global, forwardInfo.fromChatId); return selectChat(global, forwardInfo.fromChatId);
} else if (forwardInfo.senderUserId) { } else if (forwardInfo.senderUserId) {
return selectUser(global, forwardInfo.senderUserId) || selectChat(global, forwardInfo.senderUserId); return selectPeer(global, forwardInfo.senderUserId);
} }
return undefined; return undefined;