diff --git a/src/assets/localization/fallback.strings b/src/assets/localization/fallback.strings index cca1c1a6e..b1ba1a30d 100644 --- a/src/assets/localization/fallback.strings +++ b/src/assets/localization/fallback.strings @@ -1269,4 +1269,5 @@ "MenuBetaChangelog" = "Beta Changelog"; "MenuSwitchToK" = "Switch to K Version"; "MenuInstallApp" = "Install App"; -"RemoveEffect" = "Remove effect" +"RemoveEffect" = "Remove effect"; +"ReplyInPrivateMessage" = "Reply In Private Message"; diff --git a/src/components/middle/composer/ComposerEmbeddedMessage.tsx b/src/components/middle/composer/ComposerEmbeddedMessage.tsx index 37c324e32..04d435a5c 100644 --- a/src/components/middle/composer/ComposerEmbeddedMessage.tsx +++ b/src/components/middle/composer/ComposerEmbeddedMessage.tsx @@ -10,7 +10,7 @@ import type { import type { MessageListType } from '../../../global/types'; import type { ThreadId } from '../../../types/index'; -import { stripCustomEmoji } from '../../../global/helpers'; +import { isChatChannel, stripCustomEmoji } from '../../../global/helpers'; import { selectCanAnimateInterface, selectChat, @@ -32,6 +32,7 @@ import { getPeerColorClass } from '../../common/helpers/peerColor'; import useContextMenuHandlers from '../../../hooks/useContextMenuHandlers'; import useCurrentOrPrev from '../../../hooks/useCurrentOrPrev'; +import useLang from '../../../hooks/useLang'; import useLastCallback from '../../../hooks/useLastCallback'; import useMenuPosition from '../../../hooks/useMenuPosition'; import useOldLang from '../../../hooks/useOldLang'; @@ -62,6 +63,8 @@ type StateProps = { isInChangingRecipientMode?: boolean; shouldPreventComposerAnimation?: boolean; senderChat?: ApiChat; + isSenderChannel?: boolean; + currentUserId?: string; }; type OwnProps = { @@ -92,6 +95,9 @@ const ComposerEmbeddedMessage: FC = ({ isInChangingRecipientMode, shouldPreventComposerAnimation, senderChat, + chatId, + currentUserId, + isSenderChannel, }) => { const { resetDraftReplyInfo, @@ -99,6 +105,7 @@ const ComposerEmbeddedMessage: FC = ({ setEditingId, focusMessage, changeRecipient, + openChatOrTopicWithReplyInDraft, setForwardNoAuthors, setForwardNoCaptions, exitForwardMode, @@ -106,7 +113,8 @@ const ComposerEmbeddedMessage: FC = ({ } = getActions(); // eslint-disable-next-line no-null/no-null const ref = useRef(null); - const lang = useOldLang(); + const oldLang = useOldLang(); + const lang = useLang(); const isReplyToTopicStart = message?.content.action?.type === 'topicCreate'; const isShowingReply = replyInfo && !shouldForceShowEditing; @@ -180,6 +188,11 @@ const ComposerEmbeddedMessage: FC = ({ () => updateDraftReplyInfo({ quoteText: undefined }), )); const handleChangeReplyRecipientClick = useLastCallback(buildAutoCloseMenuItemHandler(changeRecipient)); + const handleReplyInSenderChat = useLastCallback(() => { + handleContextMenuClose(); + if (!sender) return; + openChatOrTopicWithReplyInDraft({ chatId: sender.id }); + }); const handleDoNotReplyClick = useLastCallback(buildAutoCloseMenuItemHandler(clearEmbedded)); const getTriggerElement = useLastCallback(() => ref.current); @@ -224,7 +237,7 @@ const ComposerEmbeddedMessage: FC = ({ }, [editingId, isForwarding, isShowingReply]); const customText = forwardedMessagesCount && forwardedMessagesCount > 1 - ? lang('ForwardedMessageCount', forwardedMessagesCount) + ? oldLang('ForwardedMessageCount', forwardedMessagesCount) : undefined; const strippedMessage = useMemo(() => { @@ -246,6 +259,8 @@ const ComposerEmbeddedMessage: FC = ({ return undefined; } + const canReplyInSenderChat = sender && !isSenderChannel && chatId !== sender.id && sender.id !== currentUserId; + return (
@@ -263,8 +278,8 @@ const ComposerEmbeddedMessage: FC = ({ message={strippedMessage} sender={!noAuthors ? sender : undefined} customText={customText} - title={(editingId && !isShowingReply) ? lang('EditMessage') - : noAuthors ? lang('HiddenSendersNameDescription') : undefined} + title={(editingId && !isShowingReply) ? oldLang('EditMessage') + : noAuthors ? oldLang('HiddenSendersNameDescription') : undefined} onClick={handleMessageClick} senderChat={senderChat} /> @@ -273,7 +288,7 @@ const ComposerEmbeddedMessage: FC = ({ round faded color="translucent" - ariaLabel={lang('Cancel')} + ariaLabel={oldLang('Cancel')} onClick={handleClearClick} > @@ -300,7 +315,7 @@ const ComposerEmbeddedMessage: FC = ({ noAuthors: false, })} > - {lang(forwardedMessagesCount > 1 ? 'ShowSenderNames' : 'ShowSendersName')} + {oldLang(forwardedMessagesCount > 1 ? 'ShowSenderNames' : 'ShowSendersName')} = ({ noAuthors: true, })} > - {lang(forwardedMessagesCount > 1 ? 'HideSenderNames' : 'HideSendersName')} + {oldLang(forwardedMessagesCount > 1 ? 'HideSenderNames' : 'HideSendersName')} {forwardsHaveCaptions && ( <> @@ -323,7 +338,7 @@ const ComposerEmbeddedMessage: FC = ({ noCaptions: false, })} > - {lang(forwardedMessagesCount > 1 ? 'Conversation.ForwardOptions.ShowCaption' : 'ShowCaption')} + {oldLang(forwardedMessagesCount > 1 ? 'Conversation.ForwardOptions.ShowCaption' : 'ShowCaption')} = ({ noCaptions: true, })} > - {lang(forwardedMessagesCount > 1 ? 'Conversation.ForwardOptions.HideCaption' : 'HideCaption')} + {oldLang(forwardedMessagesCount > 1 ? 'Conversation.ForwardOptions.HideCaption' : 'HideCaption')} )} - {lang('ForwardAnotherChat')} + {oldLang('ForwardAnotherChat')} )} @@ -349,21 +364,26 @@ const ComposerEmbeddedMessage: FC = ({ icon="show-message" onClick={handleShowMessageClick} > - {lang('Message.Context.Goto')} + {oldLang('Message.Context.Goto')} {isReplyWithQuote && ( - {lang('RemoveQuote')} + {oldLang('RemoveQuote')} + + )} + {canReplyInSenderChat && ( + + {lang('ReplyInPrivateMessage')} )} - {lang('ReplyToAnotherChat')} + {oldLang('ReplyToAnotherChat')} - {lang('DoNotReply')} + {oldLang('DoNotReply')} )} @@ -432,6 +452,9 @@ export default memo(withGlobal( } } + const chat = sender && selectChat(global, sender.id); + const isSenderChannel = chat && isChatChannel(chat); + const forwardsHaveCaptions = forwardedMessages?.some((forward) => ( forward?.content.text && Object.keys(forward.content).length > 1 )); @@ -457,6 +480,8 @@ export default memo(withGlobal( isInChangingRecipientMode: isModalShown, shouldPreventComposerAnimation, senderChat, + currentUserId: global.currentUserId, + isSenderChannel, }; }, )(ComposerEmbeddedMessage)); diff --git a/src/types/language.d.ts b/src/types/language.d.ts index db3e98940..985841aed 100644 --- a/src/types/language.d.ts +++ b/src/types/language.d.ts @@ -1512,6 +1512,7 @@ export interface LangPair { 'MenuSwitchToK': undefined; 'MenuInstallApp': undefined; 'RemoveEffect' : undefined; + 'ReplyInPrivateMessage': undefined; } export type LangKey = keyof LangPair;