// SPDX-License-Identifier: AGPL-3.0-or-later import {useShouldAnimate} from '@app/features/app/hooks/useShouldAnimate'; import styles from '@app/features/channel/components/QuickReactionsRow.module.css'; import type {FlatEmoji} from '@app/features/emoji/types/EmojiTypes'; import {buildCustomEmojiURL} from '@app/features/expressions/utils/CustomEmojiImageUrl'; import {useExpressionImagesPreload} from '@app/features/expressions/utils/ExpressionImageCache'; import {getEmojiDisplayData} from '@app/features/expressions/utils/SkinToneUtils'; import {ReactionImage} from '@app/features/messaging/components/ReactionImage'; import {msg} from '@lingui/core/macro'; import type React from 'react'; import {useMemo} from 'react'; export const REACT_WITH_EMOJI_DESCRIPTOR = msg({ message: 'React with {emojiShortcode}', comment: 'Accessible label for a quick reaction emoji button. Preserve {emojiShortcode}; it is inserted by code, usually like :smile:.', }); export function getQuickReactionEmojiSrc(emoji: FlatEmoji): string { const {url: displayUrl} = getEmojiDisplayData(emoji); return emoji.id ? buildCustomEmojiURL({id: emoji.id, animated: emoji.animated === true}) : (displayUrl ?? ''); } export function renderQuickReactionEmoji(emoji: FlatEmoji): React.ReactNode { const emojiSrc = getQuickReactionEmojiSrc(emoji); return ( ); } export function getReactionSubmenuEmojiSrc(emoji: FlatEmoji, animationAllowed: boolean): string { const {url: displayUrl} = getEmojiDisplayData(emoji); return emoji.id ? buildCustomEmojiURL({id: emoji.id, animated: emoji.animated === true && animationAllowed}) : (displayUrl ?? ''); } export function useReactionSubmenuEmojiSrc(emoji: FlatEmoji): string { const animationAllowed = useShouldAnimate({kind: 'emoji', isAnimated: emoji.animated === true}); return getReactionSubmenuEmojiSrc(emoji, animationAllowed); } const NO_SUBMENU_EMOJIS: ReadonlyArray = []; export function useReactionMenuImagePreload( quickReactionEmojis: ReadonlyArray, submenuReactionEmojis: ReadonlyArray = NO_SUBMENU_EMOJIS, ): void { const animationAllowed = useShouldAnimate({kind: 'emoji', isAnimated: true}); const urls = useMemo( () => Array.from( new Set([ ...quickReactionEmojis.map(getQuickReactionEmojiSrc), ...submenuReactionEmojis.map((emoji) => getReactionSubmenuEmojiSrc(emoji, animationAllowed)), ]), ).filter(Boolean), [quickReactionEmojis, submenuReactionEmojis, animationAllowed], ); useExpressionImagesPreload(urls); }