feat: added filters to convo and contact query

search screen only shows contacts and not convos
pull/3083/head
William Grant 12 months ago
parent 4ae133bb67
commit a159616514

@ -106,7 +106,6 @@
"contextMenuNoSuggestions": "No Suggestions", "contextMenuNoSuggestions": "No Suggestions",
"continue": "Continue", "continue": "Continue",
"conversationId": "Conversation ID", "conversationId": "Conversation ID",
"conversationsHeader": "Contacts and Groups: $count$",
"conversationsNone": "You don't have any conversations yet", "conversationsNone": "You don't have any conversations yet",
"conversationsSettingsTitle": "Conversations", "conversationsSettingsTitle": "Conversations",
"copiedToClipboard": "Copied", "copiedToClipboard": "Copied",
@ -295,6 +294,7 @@
"mediaPermissionsTitle": "Microphone", "mediaPermissionsTitle": "Microphone",
"members": "$count$ members", "members": "$count$ members",
"message": "Message", "message": "Message",
"messages": "Messages",
"messageBody": "Message body", "messageBody": "Message body",
"messageBodyMissing": "Please enter a message body.", "messageBodyMissing": "Please enter a message body.",
"messageDeletedPlaceholder": "This message has been deleted", "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.", "saveRecoveryPasswordDescription": "Save your recovery password to make sure you don't lose access to your account.",
"searchFor...": "Search conversations and contacts", "searchFor...": "Search conversations and contacts",
"searchForContactsOnly": "Search for contacts", "searchForContactsOnly": "Search for contacts",
"searchMessagesHeader": "Messages: $count$",
"selectMessage": "Select message", "selectMessage": "Select message",
"sendFailed": "Send Failed", "sendFailed": "Send Failed",
"sending": "Sending", "sending": "Sending",
"sendMessage": "Message", "sendMessage": "Message",
"sent": "Sent", "sent": "Sent",
"serverId": "Server ID", "serverId": "Server ID",
"sessionConversations": "Conversations",
"sessionInviteAFriend": "Invite a Friend", "sessionInviteAFriend": "Invite a Friend",
"sessionInviteAFriendDescription": "Copy your Account ID then share it with your friends so they can message you.", "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.", "sessionInviteAFriendIDCopied": "Share with your friends wherever you usually speak with them — then move the conversation here.",

@ -66,6 +66,7 @@ import { MessageAttributes } from '../models/messageType';
import { SignalService } from '../protobuf'; import { SignalService } from '../protobuf';
import { Quote } from '../receiver/types'; import { Quote } from '../receiver/types';
import { DURATION } from '../session/constants'; import { DURATION } from '../session/constants';
import { ed25519Str } from '../session/utils/String';
import { import {
getSQLCipherIntegrityCheck, getSQLCipherIntegrityCheck,
openAndMigrateDatabase, openAndMigrateDatabase,
@ -79,7 +80,6 @@ import {
initDbInstanceWith, initDbInstanceWith,
isInstanceInitialized, isInstanceInitialized,
} from './sqlInstance'; } from './sqlInstance';
import { ed25519Str } from '../session/utils/String';
// eslint:disable: function-name non-literal-fs-path // eslint:disable: function-name non-literal-fs-path

@ -16,7 +16,7 @@ export type SearchStateType = {
query: string; query: string;
normalizedPhoneNumber?: string; normalizedPhoneNumber?: string;
// For conversations we store just the id, and pull conversation props in the selector // For conversations we store just the id, and pull conversation props in the selector
contactsAndGroups: Array<string>; contactsAndConversations: Array<string>;
messages?: Array<MessageResultProps>; messages?: Array<MessageResultProps>;
}; };
@ -24,7 +24,7 @@ export type SearchStateType = {
type SearchResultsPayloadType = { type SearchResultsPayloadType = {
query: string; query: string;
normalizedPhoneNumber?: string; normalizedPhoneNumber?: string;
contactsAndGroups: Array<string>; contactsAndConversations: Array<string>;
messages?: Array<MessageResultProps>; messages?: Array<MessageResultProps>;
}; };
@ -72,6 +72,7 @@ async function doSearch(query: string): Promise<SearchResultsPayloadType> {
noteToSelf: window.i18n('noteToSelf').toLowerCase(), noteToSelf: window.i18n('noteToSelf').toLowerCase(),
savedMessages: window.i18n('savedMessages').toLowerCase(), savedMessages: window.i18n('savedMessages').toLowerCase(),
ourNumber: UserUtils.getOurPubKeyStrFromCache(), ourNumber: UserUtils.getOurPubKeyStrFromCache(),
filter: 'contacts',
}; };
const advancedSearchOptions = getAdvancedSearchOptionsFromQuery(query); const advancedSearchOptions = getAdvancedSearchOptionsFromQuery(query);
const processedQuery = advancedSearchOptions.query; const processedQuery = advancedSearchOptions.query;
@ -82,13 +83,14 @@ async function doSearch(query: string): Promise<SearchResultsPayloadType> {
queryMessages(processedQuery), queryMessages(processedQuery),
]); ]);
const { conversations, contacts } = discussions; 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); const filteredMessages = _.compact(messages);
return { return {
query, query,
normalizedPhoneNumber: PubKey.normalize(query), normalizedPhoneNumber: PubKey.normalize(query),
contactsAndGroups, contactsAndConversations,
messages: filteredMessages, messages: filteredMessages,
}; };
} }
@ -201,8 +203,10 @@ async function queryMessages(query: string): Promise<Array<MessageResultProps>>
} }
async function queryConversationsAndContacts(providedQuery: string, options: SearchOptions) { async function queryConversationsAndContacts(providedQuery: string, options: SearchOptions) {
const { ourNumber, noteToSelf, savedMessages } = options; const { ourNumber, noteToSelf, savedMessages, filter } = options;
const query = providedQuery.replace(/[+-.()]*/g, ''); const query = providedQuery.replace(/[+-.()]*/g, '');
const contactsOnly = filter === 'contacts';
const conversationsOnly = filter === 'conversations';
const searchResults: Array<ReduxConversationType> = await Data.searchConversations(query); const searchResults: Array<ReduxConversationType> = await Data.searchConversations(query);
@ -213,16 +217,26 @@ async function queryConversationsAndContacts(providedQuery: string, options: Sea
for (let i = 0; i < max; i += 1) { for (let i = 0; i < max; i += 1) {
const conversation = searchResults[i]; const conversation = searchResults[i];
if (conversation.id && conversation.activeAt) { if (!contactsOnly) {
if (conversation.id === ourNumber) { if (conversation.id && conversation.activeAt) {
conversations.push(ourNumber); if (conversation.id === ourNumber) {
} else { conversations.push(ourNumber);
} else {
conversations.push(conversation.id);
}
}
if (conversation.id && conversation.type !== ConversationTypeEnum.PRIVATE) {
conversations.push(conversation.id); conversations.push(conversation.id);
} }
} else if (conversation.type === ConversationTypeEnum.PRIVATE) { }
if (
!conversationsOnly &&
conversation.id &&
conversation.type === ConversationTypeEnum.PRIVATE
) {
contacts.push(conversation.id); contacts.push(conversation.id);
} else {
conversations.push(conversation.id);
} }
} }
@ -243,7 +257,7 @@ async function queryConversationsAndContacts(providedQuery: string, options: Sea
export const initialSearchState: SearchStateType = { export const initialSearchState: SearchStateType = {
query: '', query: '',
contactsAndGroups: [], contactsAndConversations: [],
messages: [], messages: [],
}; };
@ -272,7 +286,7 @@ export function reducer(state: SearchStateType | undefined, action: SEARCH_TYPES
if (action.type === 'SEARCH_RESULTS_FULFILLED') { if (action.type === 'SEARCH_RESULTS_FULFILLED') {
const { payload } = action; 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 // Reject if the associated query is not the most recent user-provided query
if (state.query !== query) { if (state.query !== query) {
return state; return state;
@ -282,7 +296,7 @@ export function reducer(state: SearchStateType | undefined, action: SEARCH_TYPES
...state, ...state,
query, query,
normalizedPhoneNumber, normalizedPhoneNumber,
contactsAndGroups, contactsAndConversations,
messages, messages,
}; };
} }

@ -20,8 +20,8 @@ const getSearchResults = createSelector(
[getSearch, getConversationLookup], [getSearch, getConversationLookup],
(searchState: SearchStateType, lookup: ConversationLookupType) => { (searchState: SearchStateType, lookup: ConversationLookupType) => {
return { return {
contactsAndGroups: compact( contactsAndConversations: compact(
searchState.contactsAndGroups searchState.contactsAndConversations
.filter(id => { .filter(id => {
const value = lookup[id]; const value = lookup[id];
@ -49,16 +49,16 @@ export const getSearchTerm = createSelector([getSearchResults], searchResult =>
export const getSearchResultsIdsOnly = createSelector([getSearchResults], searchState => { export const getSearchResultsIdsOnly = createSelector([getSearchResults], searchState => {
return { return {
...searchState, ...searchState,
contactsAndGroupsIds: searchState.contactsAndGroups.map(m => m.id), contactsAndConversationIds: searchState.contactsAndConversations.map(m => m.id),
}; };
}); });
export const getHasSearchResults = createSelector([getSearchResults], searchState => { 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 => { 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 type SearchResultsMergedListItem = string | { contactConvoId: string } | MessageResultProps;
export const getSearchResultsList = createSelector([getSearchResults], searchState => { export const getSearchResultsList = createSelector([getSearchResults], searchState => {
const { contactsAndGroups, messages } = searchState; const { contactsAndConversations, messages } = searchState;
const builtList: Array<SearchResultsMergedListItem> = []; const builtList: Array<SearchResultsMergedListItem> = [];
if (contactsAndGroups.length) { if (contactsAndConversations.length) {
builtList.push(window.i18n('conversationsHeader', [`${contactsAndGroups.length}`])); builtList.push(window.i18n('sessionConversations'));
builtList.push(...contactsAndGroups.map(m => ({ contactConvoId: m.id }))); builtList.push(...contactsAndConversations.map(m => ({ contactConvoId: m.id })));
} }
if (messages.length) { if (messages.length) {
builtList.push(window.i18n('searchMessagesHeader', [`${messages.length}`])); builtList.push(window.i18n('messages'));
builtList.push(...messages); builtList.push(...messages);
} }
return builtList; return builtList;

@ -106,7 +106,6 @@ export type LocalizerKeys =
| 'contextMenuNoSuggestions' | 'contextMenuNoSuggestions'
| 'continue' | 'continue'
| 'conversationId' | 'conversationId'
| 'conversationsHeader'
| 'conversationsNone' | 'conversationsNone'
| 'conversationsSettingsTitle' | 'conversationsSettingsTitle'
| 'copiedToClipboard' | 'copiedToClipboard'
@ -310,6 +309,7 @@ export type LocalizerKeys =
| 'messageRequests' | 'messageRequests'
| 'messageRequestsAcceptDescription' | 'messageRequestsAcceptDescription'
| 'messageWillDisappear' | 'messageWillDisappear'
| 'messages'
| 'messagesHeader' | 'messagesHeader'
| 'moreInformation' | 'moreInformation'
| 'multipleJoinedTheGroup' | 'multipleJoinedTheGroup'
@ -459,13 +459,13 @@ export type LocalizerKeys =
| 'savedTheFile' | 'savedTheFile'
| 'searchFor...' | 'searchFor...'
| 'searchForContactsOnly' | 'searchForContactsOnly'
| 'searchMessagesHeader'
| 'selectMessage' | 'selectMessage'
| 'sendFailed' | 'sendFailed'
| 'sendMessage' | 'sendMessage'
| 'sending' | 'sending'
| 'sent' | 'sent'
| 'serverId' | 'serverId'
| 'sessionConversations'
| 'sessionInviteAFriend' | 'sessionInviteAFriend'
| 'sessionInviteAFriendDescription' | 'sessionInviteAFriendDescription'
| 'sessionInviteAFriendIDCopied' | 'sessionInviteAFriendIDCopied'

@ -2,6 +2,7 @@ export type SearchOptions = {
ourNumber: string; ourNumber: string;
noteToSelf: string; noteToSelf: string;
savedMessages: string; savedMessages: string;
filter?: 'contacts' | 'conversations';
}; };
export type AdvancedSearchOptions = { export type AdvancedSearchOptions = {

Loading…
Cancel
Save