From 1622fe21e7621dabfbc752814689cb52bb2818dd Mon Sep 17 00:00:00 2001 From: Josh Perez <60019601+josh-signal@users.noreply.github.com> Date: Tue, 9 May 2023 21:29:59 -0400 Subject: [PATCH] Normalize diacritics when searching conversations --- ts/state/ducks/search.ts | 9 ++++++++- ts/util/filterAndSortConversations.ts | 13 +++++++++++++ ts/util/removeDiacritics.ts | 6 ++++++ 3 files changed, 27 insertions(+), 1 deletion(-) create mode 100644 ts/util/removeDiacritics.ts diff --git a/ts/state/ducks/search.ts b/ts/state/ducks/search.ts index ea5498b21e..05f1ffefa7 100644 --- a/ts/state/ducks/search.ts +++ b/ts/state/ducks/search.ts @@ -36,6 +36,7 @@ import { CONVERSATION_UNLOADED, TARGETED_CONVERSATION_CHANGED, } from './conversations'; +import { removeDiacritics } from '../../util/removeDiacritics'; const { searchMessages: dataSearchMessages, @@ -286,8 +287,14 @@ async function queryConversationsAndContacts( const { ourConversationId, noteToSelf, regionCode, allConversations } = options; + const normalizedQuery = removeDiacritics(query); + const searchResults: Array = - filterAndSortConversationsByRecent(allConversations, query, regionCode); + filterAndSortConversationsByRecent( + allConversations, + normalizedQuery, + regionCode + ); // Split into two groups - active conversations and items just from address book let conversationIds: Array = []; diff --git a/ts/util/filterAndSortConversations.ts b/ts/util/filterAndSortConversations.ts index 0202808a9c..e6d120e999 100644 --- a/ts/util/filterAndSortConversations.ts +++ b/ts/util/filterAndSortConversations.ts @@ -6,6 +6,7 @@ import Fuse from 'fuse.js'; import type { ConversationType } from '../state/ducks/conversations'; import { parseAndFormatPhoneNumber } from './libphonenumberInstance'; import { WEEK } from './durations'; +import { removeDiacritics } from './removeDiacritics'; // Fuse.js scores have order of 0.01 const ACTIVE_AT_SCORE_FACTOR = (1 / WEEK) * 0.01; @@ -44,6 +45,18 @@ const FUSE_OPTIONS: Fuse.IFuseOptions = { weight: 0.5, }, ], + getFn: (...args) => { + const text = Fuse.config.getFn(...args); + if (!text) { + return text; + } + + if (typeof text === 'string') { + return removeDiacritics(text); + } + + return text.map(removeDiacritics); + }, }; const cachedIndices = new WeakMap< diff --git a/ts/util/removeDiacritics.ts b/ts/util/removeDiacritics.ts new file mode 100644 index 0000000000..5b2d77f6ae --- /dev/null +++ b/ts/util/removeDiacritics.ts @@ -0,0 +1,6 @@ +// Copyright 2023 Signal Messenger, LLC +// SPDX-License-Identifier: AGPL-3.0-only + +export function removeDiacritics(text: string): string { + return text.normalize('NFD').replace(/\p{Diacritic}/gu, ''); +}