From fda6ca315cbf00cd2c4cc1853b365ab68f9f2493 Mon Sep 17 00:00:00 2001 From: Audric Ackermann Date: Thu, 1 Feb 2024 15:58:59 +1100 Subject: [PATCH] fix: allow contacts without didApproveMe to be invited to group --- ts/components/dialog/InviteContactsDialog.tsx | 6 +-- .../leftpane/overlay/OverlayClosedGroup.tsx | 8 ++-- ts/models/conversation.ts | 1 + ts/state/selectors/conversations.ts | 41 ++++++++++--------- 4 files changed, 31 insertions(+), 25 deletions(-) diff --git a/ts/components/dialog/InviteContactsDialog.tsx b/ts/components/dialog/InviteContactsDialog.tsx index 61f3c352c..a3215881c 100644 --- a/ts/components/dialog/InviteContactsDialog.tsx +++ b/ts/components/dialog/InviteContactsDialog.tsx @@ -3,7 +3,7 @@ import useKey from 'react-use/lib/useKey'; import { PubkeyType } from 'libsession_util_nodejs'; import _ from 'lodash'; -import { useDispatch, useSelector } from 'react-redux'; +import { useDispatch } from 'react-redux'; import { ConversationTypeEnum } from '../../models/conversationAttributes'; import { VALIDATION } from '../../session/constants'; import { ConvoHub } from '../../session/conversations'; @@ -23,7 +23,7 @@ import { ClosedGroup } from '../../session/group/closed-group'; import { PubKey } from '../../session/types'; import { SessionUtilUserGroups } from '../../session/utils/libsession/libsession_utils_user_groups'; import { groupInfoActions } from '../../state/ducks/metaGroups'; -import { getPrivateContactsPubkeys } from '../../state/selectors/conversations'; +import { useContactsToInviteToGroup } from '../../state/selectors/conversations'; import { useMemberGroupChangePending } from '../../state/selectors/groups'; import { MemberListItem } from '../MemberListItem'; import { SessionWrapperModal } from '../SessionWrapperModal'; @@ -112,7 +112,7 @@ const InviteContactsDialogInner = (props: Props) => { const { conversationId } = props; const dispatch = useDispatch(); - const privateContactPubkeys = useSelector(getPrivateContactsPubkeys); + const privateContactPubkeys = useContactsToInviteToGroup(); let validContactsForInvite = _.clone(privateContactPubkeys) as Array; const isProcessingUIChange = useMemberGroupChangePending(); diff --git a/ts/components/leftpane/overlay/OverlayClosedGroup.tsx b/ts/components/leftpane/overlay/OverlayClosedGroup.tsx index 386932230..1861c69d9 100644 --- a/ts/components/leftpane/overlay/OverlayClosedGroup.tsx +++ b/ts/components/leftpane/overlay/OverlayClosedGroup.tsx @@ -17,7 +17,9 @@ import { createClosedGroup } from '../../../session/conversations/createClosedGr import { ToastUtils } from '../../../session/utils'; import { groupInfoActions } from '../../../state/ducks/metaGroups'; import { resetOverlayMode } from '../../../state/ducks/section'; -import { getPrivateContactsPubkeys } from '../../../state/selectors/conversations'; +import { + useContactsToInviteToGroup +} from '../../../state/selectors/conversations'; import { useIsCreatingGroupFromUIPending } from '../../../state/selectors/groups'; import { getSearchResultsContactOnly, isSearching } from '../../../state/selectors/search'; import { useOurPkStr } from '../../../state/selectors/user'; @@ -96,7 +98,7 @@ async function createClosedGroupWithToasts( export const OverlayClosedGroupV2 = () => { const dispatch = useDispatch(); const us = useOurPkStr(); - const privateContactsPubkeys = useSelector(getPrivateContactsPubkeys); + const privateContactsPubkeys = useContactsToInviteToGroup(); const isCreatingGroup = useIsCreatingGroupFromUIPending(); const [groupName, setGroupName] = useState(''); const { @@ -210,7 +212,7 @@ export const OverlayClosedGroupV2 = () => { export const OverlayLegacyClosedGroup = () => { const dispatch = useDispatch(); - const privateContactsPubkeys = useSelector(getPrivateContactsPubkeys); + const privateContactsPubkeys = useContactsToInviteToGroup(); const [groupName, setGroupName] = useState(''); const [loading, setLoading] = useState(false); const { diff --git a/ts/models/conversation.ts b/ts/models/conversation.ts index 537f1cbb4..73800b3ed 100644 --- a/ts/models/conversation.ts +++ b/ts/models/conversation.ts @@ -129,6 +129,7 @@ import { import { DisappearingMessages } from '../session/disappearing_messages'; import { DisappearingMessageConversationModeType } from '../session/disappearing_messages/types'; +import { GroupUpdateInfoChangeMessage } from '../session/messages/outgoing/controlMessage/group_v2/to_group/GroupUpdateInfoChangeMessage'; import { FetchMsgExpirySwarm } from '../session/utils/job_runners/jobs/FetchMsgExpirySwarmJob'; import { UpdateMsgExpirySwarm } from '../session/utils/job_runners/jobs/UpdateMsgExpirySwarmJob'; import { getLibGroupKickedOutsideRedux } from '../state/selectors/userGroups'; diff --git a/ts/state/selectors/conversations.ts b/ts/state/selectors/conversations.ts index d4d1d6af7..b8aa2a3d4 100644 --- a/ts/state/selectors/conversations.ts +++ b/ts/state/selectors/conversations.ts @@ -300,21 +300,6 @@ const _getLeftPaneConversationIds = ( .map(m => m.id); }; -const _getPrivateFriendsConversations = ( - sortedConversations: Array -): Array => { - return sortedConversations.filter(convo => { - return ( - convo.isPrivate && - !convo.isMe && - !convo.isBlocked && - convo.isApproved && - convo.didApproveMe && - convo.activeAt !== undefined - ); - }); -}; - const _getGlobalUnreadCount = (sortedConversations: Array): number => { let globalUnreadCount = 0; for (const conversation of sortedConversations) { @@ -449,11 +434,29 @@ export const getLeftPaneConversationIds = createSelector( _getLeftPaneConversationIds ); -const getDirectContacts = createSelector(getSortedConversations, _getPrivateFriendsConversations); +const getPrivateFriendsConversations = ( + sortedConversations: Array +): Array => { + return sortedConversations.filter(convo => { + return ( + convo.isPrivate && + !convo.isMe && + !convo.isBlocked && + convo.isApproved && + (window.sessionFeatureFlags.useClosedGroupV2 || convo.didApproveMe) && // with groupv2, we can invite contacts which did not approve us yet + convo.activeAt !== undefined + ); + }); +}; -export const getPrivateContactsPubkeys = createSelector(getDirectContacts, state => - state.map(m => m.id) -); +const getDirectContacts = createSelector(getSortedConversations, getPrivateFriendsConversations); + +const getPrivateContactsPubkeys = createSelector(getDirectContacts, state => state.map(m => m.id)); + +export const useContactsToInviteToGroup = () => { + const contacts = useSelector(getPrivateContactsPubkeys); + return contacts; +}; export const getDirectContactsCount = createSelector( getDirectContacts,