From 2c9fbdf38a631867079e3dae652bcfd941753c7f Mon Sep 17 00:00:00 2001 From: Audric Ackermann Date: Thu, 6 Feb 2025 11:40:10 +1100 Subject: [PATCH 1/2] fix: bring back msg context menu even when legacy gr expired --- .../conversation/SessionConversation.tsx | 4 ++-- .../message-content/MessageContextMenu.tsx | 16 +++++++++------- .../message-item/GenericReadableMessage.tsx | 8 +------- .../message/message-item/Message.tsx | 1 + .../conversation/message/reactions/Reaction.tsx | 3 +-- .../overlay/message-info/OverlayMessageInfo.tsx | 11 ++++++++--- ts/interactions/messageInteractions.ts | 6 ++++-- ts/state/selectors/releasedFeatures.ts | 5 ----- 8 files changed, 26 insertions(+), 28 deletions(-) diff --git a/ts/components/conversation/SessionConversation.tsx b/ts/components/conversation/SessionConversation.tsx index 5063e703f0..e0623aba25 100644 --- a/ts/components/conversation/SessionConversation.tsx +++ b/ts/components/conversation/SessionConversation.tsx @@ -68,7 +68,7 @@ import { useSelectedIsPublic, useSelectedWeAreAdmin, } from '../../state/selectors/selectedConversation'; -import { useAreLegacyGroupsDeprecatedYet } from '../../state/selectors/releasedFeatures'; +import { useSelectedDisableLegacyGroupDeprecatedActions } from '../../hooks/useRefreshReleasedFeaturesTimestamp'; const DEFAULT_JPEG_QUALITY = 0.85; @@ -670,7 +670,7 @@ function OutdatedLegacyGroupBanner() { const selectedConversationKey = useSelectedConversationKey(); const isPrivate = useSelectedIsPrivate(); const isPublic = useSelectedIsPublic(); - const deprecatedLegacyGroups = useAreLegacyGroupsDeprecatedYet(); + const deprecatedLegacyGroups = useSelectedDisableLegacyGroupDeprecatedActions(); const isLegacyGroup = !isPrivate && !isPublic && selectedConversationKey && selectedConversationKey.startsWith('05'); diff --git a/ts/components/conversation/message/message-content/MessageContextMenu.tsx b/ts/components/conversation/message/message-content/MessageContextMenu.tsx index accc229a68..343c757f43 100644 --- a/ts/components/conversation/message/message-content/MessageContextMenu.tsx +++ b/ts/components/conversation/message/message-content/MessageContextMenu.tsx @@ -54,6 +54,7 @@ import { WithMessageId } from '../../../../session/types/with'; import { DeleteItem } from '../../../menu/items/DeleteMessage/DeleteMessageMenuItem'; import { RetryItem } from '../../../menu/items/RetrySend/RetrySendMenuItem'; import { showCopyAccountIdAction } from '../../../menu/items/CopyAccountId/guard'; +import { useSelectedDisableLegacyGroupDeprecatedActions } from '../../../../hooks/useRefreshReleasedFeaturesTimestamp'; export type MessageContextMenuSelectorProps = Pick< MessageRenderingProps, @@ -165,6 +166,7 @@ export const MessageContextMenu = (props: Props) => { const { messageId, contextMenuId, enableReactions } = props; const dispatch = useDispatch(); const { hideAll } = useContextMenu(); + const legacyGroupIsDeprecated = useSelectedDisableLegacyGroupDeprecatedActions(); const isSelectedBlocked = useSelectedIsBlocked(); const convoId = useSelectedConversationKey(); @@ -316,7 +318,7 @@ export const MessageContextMenu = (props: Props) => { return ( - {enableReactions && showEmojiPanel && ( + {enableReactions && !legacyGroupIsDeprecated && showEmojiPanel && ( { onVisibilityChange={onVisibilityChange} animation={getMenuAnimation()} > - {enableReactions && ( + {enableReactions && !legacyGroupIsDeprecated && ( // eslint-disable-next-line @typescript-eslint/no-misused-promises { {window.i18n('save')} ) : null} {window.i18n('copy')} - {(isSent || !isOutgoing) && ( + {(isSent || !isOutgoing) && !legacyGroupIsDeprecated && ( {window.i18n('reply')} )} { {sender && showCopyAccountIdAction({ isPrivate: true, pubkey: sender }) ? ( ) : null} - - {isDeletable ? ( + {!legacyGroupIsDeprecated && } + {isDeletable && !legacyGroupIsDeprecated ? ( ) : null} - - + {!legacyGroupIsDeprecated && } + {!legacyGroupIsDeprecated && } diff --git a/ts/components/conversation/message/message-item/GenericReadableMessage.tsx b/ts/components/conversation/message/message-item/GenericReadableMessage.tsx index f53ea150d6..c9930d13dc 100644 --- a/ts/components/conversation/message/message-item/GenericReadableMessage.tsx +++ b/ts/components/conversation/message/message-item/GenericReadableMessage.tsx @@ -13,7 +13,6 @@ import { getGenericReadableMessageSelectorProps } from '../../../../state/select import { MessageContentWithStatuses } from '../message-content/MessageContentWithStatus'; import { StyledMessageReactionsContainer } from '../message-content/MessageReactions'; import { useIsMessageSelectionMode } from '../../../../state/selectors/selectedConversation'; -import { useSelectedDisableLegacyGroupDeprecatedActions } from '../../../../hooks/useRefreshReleasedFeaturesTimestamp'; export type GenericReadableMessageSelectorProps = Pick< MessageRenderingProps, @@ -66,7 +65,6 @@ export const GenericReadableMessage = (props: Props) => { const { ctxMenuID, messageId } = props; const [enableReactions, setEnableReactions] = useState(true); - const legacyGroupIsDeprecated = useSelectedDisableLegacyGroupDeprecatedActions(); const msgProps = useSelector((state: StateType) => getGenericReadableMessageSelectorProps(state, props.messageId) @@ -85,9 +83,6 @@ export const GenericReadableMessage = (props: Props) => { const handleContextMenu = useCallback( (e: MouseEvent) => { - if (legacyGroupIsDeprecated) { - return; - } // this is quite dirty but considering that we want the context menu of the message to show on click on the attachment // and the context menu save attachment item to save the right attachment I did not find a better way for now. @@ -100,7 +95,6 @@ export const GenericReadableMessage = (props: Props) => { isString(attachmentIndexStr) && !isNil(toNumber(attachmentIndexStr)) ? toNumber(attachmentIndexStr) : 0; - if (enableContextMenu) { contextMenu.hideAll(); contextMenu.show({ @@ -113,7 +107,7 @@ export const GenericReadableMessage = (props: Props) => { } setIsRightClicked(enableContextMenu); }, - [ctxMenuID, multiSelectMode, msgProps?.isKickedFromGroup, legacyGroupIsDeprecated] + [ctxMenuID, multiSelectMode, msgProps?.isKickedFromGroup] ); useEffect(() => { diff --git a/ts/components/conversation/message/message-item/Message.tsx b/ts/components/conversation/message/message-item/Message.tsx index 40d5709a22..2c6016f9ec 100644 --- a/ts/components/conversation/message/message-item/Message.tsx +++ b/ts/components/conversation/message/message-item/Message.tsx @@ -10,6 +10,7 @@ type Props = { }; export const Message = (props: Props) => { + // FIXME this should probably just be something static per message. const ctxMenuID = `ctx-menu-message-${uuidv4()}`; return ; diff --git a/ts/components/conversation/message/reactions/Reaction.tsx b/ts/components/conversation/message/reactions/Reaction.tsx index d1c266e7d9..b4e1eee72d 100644 --- a/ts/components/conversation/message/reactions/Reaction.tsx +++ b/ts/components/conversation/message/reactions/Reaction.tsx @@ -81,7 +81,6 @@ export const Reaction = (props: ReactionProps) => { const rightOverlayMode = useRightOverlayMode(); const areDeprecatedLegacyGroupDisabled = useSelectedDisableLegacyGroupDeprecatedActions(); - const legacyGroupDeprecated = useSelectedDisableLegacyGroupDeprecatedActions(); const isMessageSelection = useIsMessageSelectionMode(); const reactionsMap = (reactions && Object.fromEntries(reactions)) || {}; const senders = reactionsMap[emoji]?.senders || []; @@ -110,7 +109,7 @@ export const Reaction = (props: ReactionProps) => { const handleReactionClick = () => { if (!isMessageSelection) { // Note: disable emoji clicks if the legacy group is deprecated (group is readonly) - if (onClick && !legacyGroupDeprecated) { + if (onClick && !areDeprecatedLegacyGroupDisabled) { onClick(emoji); } } diff --git a/ts/components/conversation/right-panel/overlay/message-info/OverlayMessageInfo.tsx b/ts/components/conversation/right-panel/overlay/message-info/OverlayMessageInfo.tsx index 4d90cf20f3..3589739990 100644 --- a/ts/components/conversation/right-panel/overlay/message-info/OverlayMessageInfo.tsx +++ b/ts/components/conversation/right-panel/overlay/message-info/OverlayMessageInfo.tsx @@ -52,6 +52,7 @@ import { AttachmentInfo, MessageInfo } from './components'; import { AttachmentCarousel } from './components/AttachmentCarousel'; import { ToastUtils } from '../../../../../session/utils'; import { showCopyAccountIdAction } from '../../../../menu/items/CopyAccountId/guard'; +import { useSelectedDisableLegacyGroupDeprecatedActions } from '../../../../../hooks/useRefreshReleasedFeaturesTimestamp'; // NOTE we override the default max-widths when in the detail isDetailView const StyledMessageBody = styled.div` @@ -196,6 +197,9 @@ type WithMessageIdOpt = { messageId: string }; */ function CopyMessageBodyButton({ messageId }: WithMessageIdOpt) { const messageBody = useMessageBody(messageId); + if (!messageBody) { + return null; + } return ( { const timestamp = useMessageTimestamp(messageId); const serverTimestamp = useMessageServerTimestamp(messageId); const sender = useMessageSender(messageId); + const legacyGroupIsDeprecated = useSelectedDisableLegacyGroupDeprecatedActions(); // we close the right panel when switching conversation so the convoId of that message is always the selectedConversationKey // is always the currently selected conversation @@ -363,9 +368,9 @@ export const OverlayMessageInfo = () => { {/* CopyMessageBodyButton is always shown so the PanelButtonGroup always has at least one item */} - + {!legacyGroupIsDeprecated && } - {hasErrors && direction === 'outgoing' && ( + {hasErrors && !legacyGroupIsDeprecated && direction === 'outgoing' && ( { }} /> )} - {isDeletable && ( + {isDeletable && !legacyGroupIsDeprecated && ( Date: Fri, 7 Feb 2025 10:14:09 +1100 Subject: [PATCH 2/2] fix: whitelist msg context actions for deprecated legacy group --- .../message-content/MessageContextMenu.tsx | 46 ++++++++++++++++--- 1 file changed, 39 insertions(+), 7 deletions(-) diff --git a/ts/components/conversation/message/message-content/MessageContextMenu.tsx b/ts/components/conversation/message/message-content/MessageContextMenu.tsx index 343c757f43..a7bf98929e 100644 --- a/ts/components/conversation/message/message-content/MessageContextMenu.tsx +++ b/ts/components/conversation/message/message-content/MessageContextMenu.tsx @@ -316,9 +316,41 @@ export const MessageContextMenu = (props: Props) => { return null; } + if (legacyGroupIsDeprecated) { + return ( + + + + {attachments?.length && attachments.every(m => !m.pending && m.path) ? ( + + {window.i18n('save')} + + ) : null} + {window.i18n('copy')} + { + void showMessageInfoOverlay({ messageId, dispatch }); + }} + > + + + {/* this is a message in the view, so always private */} + {sender && showCopyAccountIdAction({ isPrivate: true, pubkey: sender }) ? ( + + ) : null} + + + + ); + } + return ( - {enableReactions && !legacyGroupIsDeprecated && showEmojiPanel && ( + {enableReactions && showEmojiPanel && ( { onVisibilityChange={onVisibilityChange} animation={getMenuAnimation()} > - {enableReactions && !legacyGroupIsDeprecated && ( + {enableReactions && ( // eslint-disable-next-line @typescript-eslint/no-misused-promises { {window.i18n('save')} ) : null} {window.i18n('copy')} - {(isSent || !isOutgoing) && !legacyGroupIsDeprecated && ( + {(isSent || !isOutgoing) && ( {window.i18n('reply')} )} { {sender && showCopyAccountIdAction({ isPrivate: true, pubkey: sender }) ? ( ) : null} - {!legacyGroupIsDeprecated && } - {isDeletable && !legacyGroupIsDeprecated ? ( + + {isDeletable ? ( ) : null} - {!legacyGroupIsDeprecated && } - {!legacyGroupIsDeprecated && } + +