diff --git a/_locales/en/messages.json b/_locales/en/messages.json index bf0ffa93e..306c74b85 100644 --- a/_locales/en/messages.json +++ b/_locales/en/messages.json @@ -106,7 +106,6 @@ "contextMenuNoSuggestions": "No Suggestions", "continue": "Continue", "conversationId": "Conversation ID", - "conversationsHeader": "Contacts and Groups: $count$", "conversationsNone": "You don't have any conversations yet", "conversationsSettingsTitle": "Conversations", "copiedToClipboard": "Copied", @@ -295,6 +294,7 @@ "mediaPermissionsTitle": "Microphone", "members": "$count$ members", "message": "Message", + "messages": "Messages", "messageBody": "Message body", "messageBodyMissing": "Please enter a message body.", "messageDeletedPlaceholder": "This message has been deleted", @@ -459,13 +459,13 @@ "saveRecoveryPasswordDescription": "Save your recovery password to make sure you don't lose access to your account.", "searchFor...": "Search conversations and contacts", "searchForContactsOnly": "Search for contacts", - "searchMessagesHeader": "Messages: $count$", "selectMessage": "Select message", "sendFailed": "Send Failed", "sending": "Sending", "sendMessage": "Message", "sent": "Sent", "serverId": "Server ID", + "sessionConversations": "Conversations", "sessionInviteAFriend": "Invite a Friend", "sessionInviteAFriendDescription": "Copy your Account ID then share it with your friends so they can message you.", "sessionInviteAFriendIDCopied": "Share with your friends wherever you usually speak with them — then move the conversation here.", diff --git a/ts/node/sql.ts b/ts/node/sql.ts index 80fcecbfd..0fa90aed7 100644 --- a/ts/node/sql.ts +++ b/ts/node/sql.ts @@ -66,6 +66,7 @@ import { MessageAttributes } from '../models/messageType'; import { SignalService } from '../protobuf'; import { Quote } from '../receiver/types'; import { DURATION } from '../session/constants'; +import { ed25519Str } from '../session/utils/String'; import { getSQLCipherIntegrityCheck, openAndMigrateDatabase, @@ -79,7 +80,6 @@ import { initDbInstanceWith, isInstanceInitialized, } from './sqlInstance'; -import { ed25519Str } from '../session/utils/String'; // eslint:disable: function-name non-literal-fs-path diff --git a/ts/state/ducks/search.ts b/ts/state/ducks/search.ts index 72c64c50d..f28109c35 100644 --- a/ts/state/ducks/search.ts +++ b/ts/state/ducks/search.ts @@ -16,7 +16,7 @@ export type SearchStateType = { query: string; normalizedPhoneNumber?: string; // For conversations we store just the id, and pull conversation props in the selector - contactsAndGroups: Array; + contactsAndConversations: Array; messages?: Array; }; @@ -24,7 +24,7 @@ export type SearchStateType = { type SearchResultsPayloadType = { query: string; normalizedPhoneNumber?: string; - contactsAndGroups: Array; + contactsAndConversations: Array; messages?: Array; }; @@ -72,6 +72,7 @@ async function doSearch(query: string): Promise { noteToSelf: window.i18n('noteToSelf').toLowerCase(), savedMessages: window.i18n('savedMessages').toLowerCase(), ourNumber: UserUtils.getOurPubKeyStrFromCache(), + filter: 'contacts', }; const advancedSearchOptions = getAdvancedSearchOptionsFromQuery(query); const processedQuery = advancedSearchOptions.query; @@ -82,13 +83,14 @@ async function doSearch(query: string): Promise { queryMessages(processedQuery), ]); const { conversations, contacts } = discussions; - const contactsAndGroups = _.uniq([...conversations, ...contacts]); + window.log.debug(`WIP: [doSearch] conversations: ${conversations} contacts: ${contacts}`); + const contactsAndConversations = _.uniq([...conversations, ...contacts]); const filteredMessages = _.compact(messages); return { query, normalizedPhoneNumber: PubKey.normalize(query), - contactsAndGroups, + contactsAndConversations, messages: filteredMessages, }; } @@ -201,8 +203,10 @@ async function queryMessages(query: string): Promise> } async function queryConversationsAndContacts(providedQuery: string, options: SearchOptions) { - const { ourNumber, noteToSelf, savedMessages } = options; + const { ourNumber, noteToSelf, savedMessages, filter } = options; const query = providedQuery.replace(/[+-.()]*/g, ''); + const contactsOnly = filter === 'contacts'; + const conversationsOnly = filter === 'conversations'; const searchResults: Array = await Data.searchConversations(query); @@ -213,16 +217,26 @@ async function queryConversationsAndContacts(providedQuery: string, options: Sea for (let i = 0; i < max; i += 1) { const conversation = searchResults[i]; - if (conversation.id && conversation.activeAt) { - if (conversation.id === ourNumber) { - conversations.push(ourNumber); - } else { + if (!contactsOnly) { + if (conversation.id && conversation.activeAt) { + if (conversation.id === ourNumber) { + conversations.push(ourNumber); + } else { + conversations.push(conversation.id); + } + } + + if (conversation.id && conversation.type !== ConversationTypeEnum.PRIVATE) { conversations.push(conversation.id); } - } else if (conversation.type === ConversationTypeEnum.PRIVATE) { + } + + if ( + !conversationsOnly && + conversation.id && + conversation.type === ConversationTypeEnum.PRIVATE + ) { contacts.push(conversation.id); - } else { - conversations.push(conversation.id); } } @@ -243,7 +257,7 @@ async function queryConversationsAndContacts(providedQuery: string, options: Sea export const initialSearchState: SearchStateType = { query: '', - contactsAndGroups: [], + contactsAndConversations: [], messages: [], }; @@ -272,7 +286,7 @@ export function reducer(state: SearchStateType | undefined, action: SEARCH_TYPES if (action.type === 'SEARCH_RESULTS_FULFILLED') { const { payload } = action; - const { query, normalizedPhoneNumber, contactsAndGroups, messages } = payload; + const { query, normalizedPhoneNumber, contactsAndConversations, messages } = payload; // Reject if the associated query is not the most recent user-provided query if (state.query !== query) { return state; @@ -282,7 +296,7 @@ export function reducer(state: SearchStateType | undefined, action: SEARCH_TYPES ...state, query, normalizedPhoneNumber, - contactsAndGroups, + contactsAndConversations, messages, }; } diff --git a/ts/state/selectors/search.ts b/ts/state/selectors/search.ts index d2ad30520..10f584ef7 100644 --- a/ts/state/selectors/search.ts +++ b/ts/state/selectors/search.ts @@ -20,8 +20,8 @@ const getSearchResults = createSelector( [getSearch, getConversationLookup], (searchState: SearchStateType, lookup: ConversationLookupType) => { return { - contactsAndGroups: compact( - searchState.contactsAndGroups + contactsAndConversations: compact( + searchState.contactsAndConversations .filter(id => { const value = lookup[id]; @@ -49,16 +49,16 @@ export const getSearchTerm = createSelector([getSearchResults], searchResult => export const getSearchResultsIdsOnly = createSelector([getSearchResults], searchState => { return { ...searchState, - contactsAndGroupsIds: searchState.contactsAndGroups.map(m => m.id), + contactsAndConversationIds: searchState.contactsAndConversations.map(m => m.id), }; }); export const getHasSearchResults = createSelector([getSearchResults], searchState => { - return !isEmpty(searchState.contactsAndGroups) || !isEmpty(searchState.messages); + return !isEmpty(searchState.contactsAndConversations) || !isEmpty(searchState.messages); }); export const getSearchResultsContactOnly = createSelector([getSearchResults], searchState => { - return searchState.contactsAndGroups.filter(m => m.isPrivate).map(m => m.id); + return searchState.contactsAndConversations.filter(m => m.isPrivate).map(m => m.id); }); /** @@ -70,14 +70,14 @@ export const getSearchResultsContactOnly = createSelector([getSearchResults], se export type SearchResultsMergedListItem = string | { contactConvoId: string } | MessageResultProps; export const getSearchResultsList = createSelector([getSearchResults], searchState => { - const { contactsAndGroups, messages } = searchState; + const { contactsAndConversations, messages } = searchState; const builtList: Array = []; - if (contactsAndGroups.length) { - builtList.push(window.i18n('conversationsHeader', [`${contactsAndGroups.length}`])); - builtList.push(...contactsAndGroups.map(m => ({ contactConvoId: m.id }))); + if (contactsAndConversations.length) { + builtList.push(window.i18n('sessionConversations')); + builtList.push(...contactsAndConversations.map(m => ({ contactConvoId: m.id }))); } if (messages.length) { - builtList.push(window.i18n('searchMessagesHeader', [`${messages.length}`])); + builtList.push(window.i18n('messages')); builtList.push(...messages); } return builtList; diff --git a/ts/types/LocalizerKeys.ts b/ts/types/LocalizerKeys.ts index b3ecb06a2..bed234f8e 100644 --- a/ts/types/LocalizerKeys.ts +++ b/ts/types/LocalizerKeys.ts @@ -106,7 +106,6 @@ export type LocalizerKeys = | 'contextMenuNoSuggestions' | 'continue' | 'conversationId' - | 'conversationsHeader' | 'conversationsNone' | 'conversationsSettingsTitle' | 'copiedToClipboard' @@ -310,6 +309,7 @@ export type LocalizerKeys = | 'messageRequests' | 'messageRequestsAcceptDescription' | 'messageWillDisappear' + | 'messages' | 'messagesHeader' | 'moreInformation' | 'multipleJoinedTheGroup' @@ -459,13 +459,13 @@ export type LocalizerKeys = | 'savedTheFile' | 'searchFor...' | 'searchForContactsOnly' - | 'searchMessagesHeader' | 'selectMessage' | 'sendFailed' | 'sendMessage' | 'sending' | 'sent' | 'serverId' + | 'sessionConversations' | 'sessionInviteAFriend' | 'sessionInviteAFriendDescription' | 'sessionInviteAFriendIDCopied' diff --git a/ts/types/Search.ts b/ts/types/Search.ts index 0206be8a3..7ac840fce 100644 --- a/ts/types/Search.ts +++ b/ts/types/Search.ts @@ -2,6 +2,7 @@ export type SearchOptions = { ourNumber: string; noteToSelf: string; savedMessages: string; + filter?: 'contacts' | 'conversations'; }; export type AdvancedSearchOptions = {