Refactor and improve emoji sanitization function

The emoji sanitization function has been refactored for better handling of emoji variations. New types have been imported from 'emoji-mart', allowing for a more precise type assignment for the emoji input and output. Bound checking operations have been adjusted to better accommodate and handle custom emojis and skin variations.
This commit is contained in:
taichi221228 2024-04-24 10:04:33 +09:00 committed by Eugen Rochko
parent 562c8778fb
commit 4845f5a50d

View File

@ -1,6 +1,12 @@
// This code is largely borrowed from: // This code is largely borrowed from:
// https://github.com/missive/emoji-mart/blob/5f2ffcc/src/utils/index.js // https://github.com/missive/emoji-mart/blob/5f2ffcc/src/utils/index.js
import type {
BaseEmoji,
CustomEmoji,
EmojiSkin,
PickerProps,
} from 'emoji-mart';
import type { Emoji } from 'emoji-mart/dist-es/utils/data'; import type { Emoji } from 'emoji-mart/dist-es/utils/data';
import * as data from './emoji_mart_data_light'; import * as data from './emoji_mart_data_light';
@ -46,22 +52,27 @@ function unifiedToNative(unified: Emoji['unified']) {
return String.fromCodePoint(...codePoints); return String.fromCodePoint(...codePoints);
} }
/* eslint-disable */ function sanitize(
emoji: BaseEmoji &
CustomEmoji &
Pick<Emoji, 'skin_variations'> &
Pick<PickerProps, 'custom'> & { skin_tone?: EmojiSkin },
):
| BaseEmoji
| (Omit<CustomEmoji, 'short_names'> & Pick<PickerProps, 'custom'>) {
const {
name = '',
short_names = [],
skin_tone,
skin_variations,
emoticons = [],
unified = '',
custom,
imageUrl,
} = emoji;
const id = emoji.id || short_names[0];
// @ts-expect-error let colons = `:${id}:`;
function sanitize(emoji) {
let {
name,
short_names,
skin_tone,
skin_variations,
emoticons,
unified,
custom,
imageUrl,
} = emoji,
id = emoji.id || short_names[0],
colons = `:${id}:`;
if (custom) { if (custom) {
return { return {
@ -84,11 +95,13 @@ function sanitize(emoji) {
colons, colons,
emoticons, emoticons,
unified: unified.toLowerCase(), unified: unified.toLowerCase(),
skin: skin_tone || (skin_variations ? 1 : null), skin: skin_tone ?? (skin_variations ? 1 : null),
native: unifiedToNative(unified), native: unifiedToNative(unified),
}; };
} }
/* eslint-disable */
function getSanitizedData() { function getSanitizedData() {
// @ts-expect-error // @ts-expect-error
return sanitize(getData(...arguments)); return sanitize(getData(...arguments));