import { isEmojiId } from '@/lib/emoji-catalog'; import { EMOJI_NATIVE_MAP, emojiIdToNative, resolveNativeEmojiContent } from '@/lib/emoji-native-map'; function countGraphemes(text: string) { if (typeof Intl !== 'undefined' && 'Segmenter' in Intl) { return [...new Intl.Segmenter('ru', { granularity: 'grapheme' }).segment(text)].length; } return [...text].length; } function resolveEmojiDisplayText(content?: string | null, visibleText?: string | null) { const raw = (visibleText ?? content ?? '').trim(); if (!raw) return ''; if (isEmojiId(raw)) return emojiIdToNative(raw) ?? raw; if (EMOJI_NATIVE_MAP[raw]) return EMOJI_NATIVE_MAP[raw]!; return resolveNativeEmojiContent(raw).trim(); } export function isSingleEmojiMessage(options: { type?: string; content?: string | null; visibleText?: string | null; }) { if (options.type === 'POLL' || options.type === 'IMAGE' || options.type === 'VOICE' || options.type === 'AUDIO' || options.type === 'FILE') { return false; } const text = resolveEmojiDisplayText(options.content, options.visibleText); if (!text) return false; if (countGraphemes(text) !== 1) return false; return /\p{Extended_Pictographic}/u.test(text); } export function getSingleEmojiNative(options: { type?: string; content?: string | null; visibleText?: string | null; }) { if (options.type === 'EMOJI') { return resolveEmojiDisplayText(options.content, options.visibleText); } return resolveEmojiDisplayText(options.content, options.visibleText); }