diff --git a/ts/components/menu/ConversationHeaderMenu.tsx b/ts/components/menu/ConversationHeaderMenu.tsx index bbc3f409c..db95f4bec 100644 --- a/ts/components/menu/ConversationHeaderMenu.tsx +++ b/ts/components/menu/ConversationHeaderMenu.tsx @@ -1,14 +1,8 @@ import React from 'react'; import { animation, Item, Menu, Submenu } from 'react-contexify'; import { useSelector } from 'react-redux'; -import { - setDisappearingMessagesByConvoId, - setNotificationForConvoId, -} from '../../interactions/conversationInteractions'; -import { - ConversationNotificationSetting, - ConversationNotificationSettingType, -} from '../../models/conversationAttributes'; +import { setDisappearingMessagesByConvoId } from '../../interactions/conversationInteractions'; +import { isSearching } from '../../state/selectors/search'; import { useSelectedConversationKey, useSelectedIsActive, @@ -18,10 +12,9 @@ import { useSelectedIsPrivate, useSelectedIsPrivateFriend, useSelectedIsPublic, - useSelectedNotificationSetting, } from '../../state/selectors/selectedConversation'; import { getTimerOptions } from '../../state/selectors/timerOptions'; -import { LocalizerKeys } from '../../types/LocalizerKeys'; +import { ContextConversationProvider } from '../leftpane/conversation-list-item/ConvoIdContext'; import { SessionContextMenuContainer } from '../SessionContextMenuContainer'; import { AddModeratorsMenuItem, @@ -29,21 +22,20 @@ import { BlockMenuItem, ChangeNicknameMenuItem, ClearNicknameMenuItem, - DeletePrivateContactMenuItem, + CopyMenuItem, DeleteGroupOrCommunityMenuItem, DeleteMessagesMenuItem, + DeletePrivateContactMenuItem, + DeletePrivateConversationMenuItem, InviteContactMenuItem, LeaveGroupMenuItem, MarkAllReadMenuItem, + NotificationForConvoMenuItem, RemoveModeratorsMenuItem, ShowUserDetailsMenuItem, UnbanMenuItem, UpdateGroupNameMenuItem, - DeletePrivateConversationMenuItem, - CopyMenuItem, } from './Menu'; -import { ContextConversationProvider } from '../leftpane/conversation-list-item/ConvoIdContext'; -import { isSearching } from '../../state/selectors/search'; export type PropsConversationHeaderMenu = { triggerId: string; @@ -145,71 +137,3 @@ const DisappearingMessageMenuItem = (): JSX.Element | null => { ); }; - -/** - * Only accessible through the triple dots menu on the conversation header. Not on the Conversation list item, because there is too much to check for before showing it - */ -const NotificationForConvoMenuItem = (): JSX.Element | null => { - const selectedConvoId = useSelectedConversationKey(); - - const currentNotificationSetting = useSelectedNotificationSetting(); - const isBlocked = useSelectedIsBlocked(); - const isActive = useSelectedIsActive(); - const isLeft = useSelectedIsLeft(); - const isKickedFromGroup = useSelectedIsKickedFromGroup(); - const isFriend = useSelectedIsPrivateFriend(); - const isPrivate = useSelectedIsPrivate(); - - if ( - !selectedConvoId || - isLeft || - isKickedFromGroup || - isBlocked || - !isActive || - (isPrivate && !isFriend) - ) { - return null; - } - - // const isRtlMode = isRtlBody();' - - // exclude mentions_only settings for private chats as this does not make much sense - const notificationForConvoOptions = ConversationNotificationSetting.filter(n => - isPrivate ? n !== 'mentions_only' : true - ).map((n: ConversationNotificationSettingType) => { - // do this separately so typescript's compiler likes it - const keyToUse: LocalizerKeys = - n === 'all' || !n - ? 'notificationForConvo_all' - : n === 'disabled' - ? 'notificationForConvo_disabled' - : 'notificationForConvo_mentions_only'; - return { value: n, name: window.i18n(keyToUse) }; - }); - - return ( - // Remove the && false to make context menu work with RTL support - - {(notificationForConvoOptions || []).map(item => { - const disabled = item.value === currentNotificationSetting; - - return ( - { - await setNotificationForConvoId(selectedConvoId, item.value); - }} - disabled={disabled} - > - {item.name} - - ); - })} - - ); - - return null; -}; diff --git a/ts/components/menu/ConversationListItemContextMenu.tsx b/ts/components/menu/ConversationListItemContextMenu.tsx index 8b407032c..13450c1a6 100644 --- a/ts/components/menu/ConversationListItemContextMenu.tsx +++ b/ts/components/menu/ConversationListItemContextMenu.tsx @@ -27,6 +27,7 @@ import { ShowUserDetailsMenuItem, UnbanMenuItem, DeletePrivateConversationMenuItem, + NotificationForConvoMenuItem, } from './Menu'; import { isSearching } from '../../state/selectors/search'; @@ -51,6 +52,8 @@ const ConversationListItemContextMenu = (props: PropsContextConversationItem) => {/* Generic actions */} + + {/* Read state actions */} diff --git a/ts/components/menu/Menu.tsx b/ts/components/menu/Menu.tsx index f9e277815..d1010df93 100644 --- a/ts/components/menu/Menu.tsx +++ b/ts/components/menu/Menu.tsx @@ -1,6 +1,6 @@ import React from 'react'; -import { Item } from 'react-contexify'; +import { Item, Submenu } from 'react-contexify'; import { useDispatch, useSelector } from 'react-redux'; import { useAvatarPath, @@ -25,6 +25,7 @@ import { declineConversationWithConfirm, deleteAllMessagesByConvoIdWithConfirmation, markAllReadByConvoId, + setNotificationForConvoId, showAddModeratorsByConvoId, showBanUserByConvoId, showInviteContactByConvoId, @@ -42,9 +43,23 @@ import { updateUserDetailsModal, } from '../../state/ducks/modalDialog'; import { getIsMessageSection } from '../../state/selectors/section'; -import { useSelectedConversationKey } from '../../state/selectors/selectedConversation'; +import { + useSelectedConversationKey, + useSelectedIsActive, + useSelectedIsBlocked, + useSelectedIsKickedFromGroup, + useSelectedIsLeft, + useSelectedIsPrivate, + useSelectedIsPrivateFriend, + useSelectedNotificationSetting, +} from '../../state/selectors/selectedConversation'; import { SessionButtonColor } from '../basic/SessionButton'; import { useConvoIdFromContext } from '../leftpane/conversation-list-item/ConvoIdContext'; +import { + ConversationNotificationSetting, + ConversationNotificationSettingType, +} from '../../models/conversationAttributes'; +import { LocalizerKeys } from '../../types/LocalizerKeys'; /** Menu items standardized */ @@ -539,3 +554,68 @@ export const DeclineAndBlockMsgRequestMenuItem = () => { } return null; }; + +export const NotificationForConvoMenuItem = (): JSX.Element | null => { + const selectedConvoId = useSelectedConversationKey(); + + const currentNotificationSetting = useSelectedNotificationSetting(); + const isBlocked = useSelectedIsBlocked(); + const isActive = useSelectedIsActive(); + const isLeft = useSelectedIsLeft(); + const isKickedFromGroup = useSelectedIsKickedFromGroup(); + const isFriend = useSelectedIsPrivateFriend(); + const isPrivate = useSelectedIsPrivate(); + + if ( + !selectedConvoId || + isLeft || + isKickedFromGroup || + isBlocked || + !isActive || + (isPrivate && !isFriend) + ) { + return null; + } + + // const isRtlMode = isRtlBody();' + + // exclude mentions_only settings for private chats as this does not make much sense + const notificationForConvoOptions = ConversationNotificationSetting.filter(n => + isPrivate ? n !== 'mentions_only' : true + ).map((n: ConversationNotificationSettingType) => { + // do this separately so typescript's compiler likes it + const keyToUse: LocalizerKeys = + n === 'all' || !n + ? 'notificationForConvo_all' + : n === 'disabled' + ? 'notificationForConvo_disabled' + : 'notificationForConvo_mentions_only'; + return { value: n, name: window.i18n(keyToUse) }; + }); + + return ( + // Remove the && false to make context menu work with RTL support + + {(notificationForConvoOptions || []).map(item => { + const disabled = item.value === currentNotificationSetting; + + return ( + { + await setNotificationForConvoId(selectedConvoId, item.value); + }} + disabled={disabled} + > + {item.name} + + ); + })} + + ); + + return null; +};