Full-text search within conversation
This commit is contained in:
parent
6292019d30
commit
c39d5a811a
26 changed files with 697 additions and 134 deletions
|
@ -520,6 +520,10 @@
|
|||
Signal.State.Ducks.user.actions,
|
||||
store.dispatch
|
||||
);
|
||||
actions.search = Signal.State.bindActionCreators(
|
||||
Signal.State.Ducks.search.actions,
|
||||
store.dispatch
|
||||
);
|
||||
actions.stickers = Signal.State.bindActionCreators(
|
||||
Signal.State.Ducks.stickers.actions,
|
||||
store.dispatch
|
||||
|
|
4
js/modules/data.d.ts
vendored
4
js/modules/data.d.ts
vendored
|
@ -1,5 +1,9 @@
|
|||
export function searchMessages(query: string): Promise<Array<any>>;
|
||||
export function searchConversations(query: string): Promise<Array<any>>;
|
||||
export function searchMessagesInConversation(
|
||||
query: string,
|
||||
conversationId: string
|
||||
): Promise<Array<any>>;
|
||||
|
||||
export function updateStickerLastUsed(
|
||||
packId: string,
|
||||
|
|
|
@ -655,9 +655,16 @@ async function searchConversations(query) {
|
|||
return conversations;
|
||||
}
|
||||
|
||||
function handleSearchMessageJSON(messages) {
|
||||
return messages.map(message => ({
|
||||
...JSON.parse(message.json),
|
||||
snippet: message.snippet,
|
||||
}));
|
||||
}
|
||||
|
||||
async function searchMessages(query, { limit } = {}) {
|
||||
const messages = await channels.searchMessages(query, { limit });
|
||||
return messages;
|
||||
return handleSearchMessageJSON(messages);
|
||||
}
|
||||
|
||||
async function searchMessagesInConversation(
|
||||
|
@ -670,7 +677,7 @@ async function searchMessagesInConversation(
|
|||
conversationId,
|
||||
{ limit }
|
||||
);
|
||||
return messages;
|
||||
return handleSearchMessageJSON(messages);
|
||||
}
|
||||
|
||||
// Message
|
||||
|
@ -784,6 +791,10 @@ async function getUnreadByConversation(conversationId, { MessageCollection }) {
|
|||
return new MessageCollection(messages);
|
||||
}
|
||||
|
||||
function handleMessageJSON(messages) {
|
||||
return messages.map(message => JSON.parse(message.json));
|
||||
}
|
||||
|
||||
async function getOlderMessagesByConversation(
|
||||
conversationId,
|
||||
{ limit = 100, receivedAt = Number.MAX_VALUE, MessageCollection }
|
||||
|
@ -796,7 +807,7 @@ async function getOlderMessagesByConversation(
|
|||
}
|
||||
);
|
||||
|
||||
return new MessageCollection(messages);
|
||||
return new MessageCollection(handleMessageJSON(messages));
|
||||
}
|
||||
async function getNewerMessagesByConversation(
|
||||
conversationId,
|
||||
|
@ -810,7 +821,7 @@ async function getNewerMessagesByConversation(
|
|||
}
|
||||
);
|
||||
|
||||
return new MessageCollection(messages);
|
||||
return new MessageCollection(handleMessageJSON(messages));
|
||||
}
|
||||
async function getMessageMetricsForConversation(conversationId) {
|
||||
const result = await channels.getMessageMetricsForConversation(
|
||||
|
|
|
@ -62,6 +62,7 @@ const { createStore } = require('../../ts/state/createStore');
|
|||
const conversationsDuck = require('../../ts/state/ducks/conversations');
|
||||
const emojisDuck = require('../../ts/state/ducks/emojis');
|
||||
const itemsDuck = require('../../ts/state/ducks/items');
|
||||
const searchDuck = require('../../ts/state/ducks/search');
|
||||
const stickersDuck = require('../../ts/state/ducks/stickers');
|
||||
const userDuck = require('../../ts/state/ducks/user');
|
||||
|
||||
|
@ -274,6 +275,7 @@ exports.setup = (options = {}) => {
|
|||
emojis: emojisDuck,
|
||||
items: itemsDuck,
|
||||
user: userDuck,
|
||||
search: searchDuck,
|
||||
stickers: stickersDuck,
|
||||
};
|
||||
const State = {
|
||||
|
|
|
@ -257,6 +257,13 @@
|
|||
this.setDisappearingMessages(seconds),
|
||||
onDeleteMessages: () => this.destroyMessages(),
|
||||
onResetSession: () => this.endSession(),
|
||||
onSearchInConversation: () => {
|
||||
const { searchInConversation } = window.reduxActions.search;
|
||||
const name = this.model.isMe()
|
||||
? i18n('noteToSelf')
|
||||
: this.model.getTitle();
|
||||
searchInConversation(this.model.id, name);
|
||||
},
|
||||
|
||||
// These are view only and don't update the Conversation model, so they
|
||||
// need a manual update call.
|
||||
|
@ -1490,8 +1497,6 @@
|
|||
|
||||
this.focusMessageField();
|
||||
|
||||
this.model.updateLastMessage();
|
||||
|
||||
const statusPromise = this.throttledGetProfiles();
|
||||
// eslint-disable-next-line more/no-then
|
||||
this.statusFetch = statusPromise.then(() =>
|
||||
|
@ -1522,6 +1527,8 @@
|
|||
if (quotedMessageId) {
|
||||
this.setQuoteMessage(quotedMessageId);
|
||||
}
|
||||
|
||||
this.model.updateLastMessage();
|
||||
},
|
||||
|
||||
async retrySend(messageId) {
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue