Fallback to emoji-datasource for unlocalized emoji

Co-authored-by: Fedor Indutny <79877362+indutny-signal@users.noreply.github.com>
This commit is contained in:
automated-signal 2025-10-06 16:43:15 -05:00 committed by GitHub
commit 48b78e7e35
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
3 changed files with 34 additions and 6 deletions

View file

@ -130,9 +130,10 @@ function useFunEmojiSearchIndex(
localeEmojiList: LocaleEmojiListType | null
): FunEmojiSearchIndex {
const funEmojiSearchIndex = useMemo(() => {
const defaultSearchIndex = getEmojiDefaultEnglishSearchIndex();
return localeEmojiList != null
? createFunEmojiSearchIndex(localeEmojiList)
: getEmojiDefaultEnglishSearchIndex();
? createFunEmojiSearchIndex(localeEmojiList, defaultSearchIndex)
: defaultSearchIndex;
}, [localeEmojiList]);
return funEmojiSearchIndex;
}
@ -141,9 +142,10 @@ function useFunEmojiLocalizerIndex(
localeEmojiList: LocaleEmojiListType | null
): FunEmojiLocalizerIndex {
const funEmojiLocalizerIndex = useMemo(() => {
const defaultSearchIndex = getEmojiDefaultEnglishLocalizerIndex();
return localeEmojiList != null
? createFunEmojiLocalizerIndex(localeEmojiList)
: getEmojiDefaultEnglishLocalizerIndex();
? createFunEmojiLocalizerIndex(localeEmojiList, defaultSearchIndex)
: defaultSearchIndex;
}, [localeEmojiList]);
return funEmojiLocalizerIndex;
}

View file

@ -23,7 +23,8 @@ export type FunEmojiLocalizer = Readonly<{
}>;
export function createFunEmojiLocalizerIndex(
localeEmojiList: LocaleEmojiListType
localeEmojiList: LocaleEmojiListType,
defaultLocalizerIndex?: FunEmojiLocalizerIndex
): FunEmojiLocalizerIndex {
const parentKeyToLocaleShortName = new Map<EmojiParentKey, string>();
const localeShortNameToParentKey = new Map<string, EmojiParentKey>();
@ -37,10 +38,25 @@ export function createFunEmojiLocalizerIndex(
const variantKey = getEmojiVariantKeyByValue(entry.emoji);
const parentKey = getEmojiParentKeyByVariantKey(variantKey);
const localizedShortName = entry.tags.at(0) ?? entry.shortName;
parentKeyToLocaleShortName.set(parentKey, localizedShortName);
localeShortNameToParentKey.set(localizedShortName, parentKey);
}
if (defaultLocalizerIndex != null) {
for (const [
parentKey,
defaultShortName,
] of defaultLocalizerIndex.parentKeyToLocaleShortName) {
if (parentKeyToLocaleShortName.has(parentKey)) {
continue;
}
parentKeyToLocaleShortName.set(parentKey, defaultShortName);
localeShortNameToParentKey.set(defaultShortName, parentKey);
}
}
return { parentKeyToLocaleShortName, localeShortNameToParentKey };
}

View file

@ -37,10 +37,13 @@ export type FunEmojiSearch = (
) => ReadonlyArray<FunEmojiSearchResult>;
export function createFunEmojiSearchIndex(
localeEmojiList: LocaleEmojiListType
localeEmojiList: LocaleEmojiListType,
defaultSearchIndex: ReadonlyArray<FunEmojiSearchIndexEntry> = []
): FunEmojiSearchIndex {
const results: Array<FunEmojiSearchIndexEntry> = [];
const localizedKeys = new Set<string>();
for (const localeEmoji of localeEmojiList) {
if (!isEmojiParentValue(localeEmoji.emoji)) {
// Skipping unknown emoji, most likely apple doesn't support it
@ -54,6 +57,7 @@ export function createFunEmojiSearchIndex(
const parentKey = getEmojiParentKeyByValue(localeEmoji.emoji);
const emoji = getEmojiParentByKey(parentKey);
localizedKeys.add(parentKey);
results.push({
key: parentKey,
rank: localeEmoji.rank,
@ -66,6 +70,12 @@ export function createFunEmojiSearchIndex(
});
}
for (const defaultEntry of defaultSearchIndex) {
if (!localizedKeys.has(defaultEntry.key)) {
results.push(defaultEntry);
}
}
return results;
}