feat: added filters to convo and contact query

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

@ -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.",

@ -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

@ -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<string>;
contactsAndConversations: Array<string>;
messages?: Array<MessageResultProps>;
};
@ -24,7 +24,7 @@ export type SearchStateType = {
type SearchResultsPayloadType = {
query: string;
normalizedPhoneNumber?: string;
contactsAndGroups: Array<string>;
contactsAndConversations: Array<string>;
messages?: Array<MessageResultProps>;
};
@ -72,6 +72,7 @@ async function doSearch(query: string): Promise<SearchResultsPayloadType> {
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<SearchResultsPayloadType> {
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<Array<MessageResultProps>>
}
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<ReduxConversationType> = 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,
};
}

@ -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<SearchResultsMergedListItem> = [];
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;

@ -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'

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

Loading…
Cancel
Save