// SPDX-License-Identifier: AGPL-3.0-or-later import {useAnimatedMediaVideoPlayback} from '@app/features/app/hooks/useAnimatedMediaPlayback'; import {useShouldAnimate} from '@app/features/app/hooks/useShouldAnimate'; import {type AutocompleteOption, isEmoji, isMeme, isSticker} from '@app/features/channel/components/Autocomplete'; import styles from '@app/features/channel/components/AutocompleteEmoji.module.css'; import {AutocompleteItem} from '@app/features/channel/components/AutocompleteItem'; import * as EmojiPickerCommands from '@app/features/emoji/commands/EmojiPickerCommands'; import {useStickerAnimation} from '@app/features/emoji/hooks/useStickerAnimation'; import type {FlatEmoji} from '@app/features/emoji/types/EmojiTypes'; import type {GuildSticker} from '@app/features/expressions/models/GuildSticker'; import {getEmojiDisplayData} from '@app/features/expressions/utils/SkinToneUtils'; import Guilds from '@app/features/guild/state/Guilds'; import { EMOJIS_DESCRIPTOR, MEDIA_DESCRIPTOR, STICKERS_DESCRIPTOR, } from '@app/features/i18n/utils/CommonMessageDescriptors'; import * as AvatarUtils from '@app/features/user/utils/AvatarUtils'; import {msg} from '@lingui/core/macro'; import {useLingui} from '@lingui/react/macro'; import {MusicNoteIcon} from '@phosphor-icons/react'; import {observer} from 'mobx-react-lite'; import type React from 'react'; import {useRef} from 'react'; const DEFAULT_EMOJI_DESCRIPTOR = msg({ message: 'Default emoji', comment: 'Short label in the channel and chat autocomplete emoji. Keep it concise.', }); const SectionHeading = observer(({children}: {children: React.ReactNode}) => (
{children}
)); const AutocompleteEmojiIcon = observer(({emoji}: {emoji: FlatEmoji}) => { const shouldAnimate = useShouldAnimate({kind: 'emoji'}); const {url: fallbackDisplayUrl} = getEmojiDisplayData(emoji); const displayUrl = emoji.id ? AvatarUtils.getEmojiURL({id: emoji.id, animated: Boolean(emoji.animated) && shouldAnimate}) : (fallbackDisplayUrl ?? ''); return ( {emoji.name} ); }); const AutocompleteStickerIcon = observer( ({sticker, isInteracting}: {sticker: GuildSticker; isInteracting: boolean}) => { const {shouldAnimate} = useStickerAnimation({isInteracting}); return (
{sticker.name}
); }, ); const AutocompleteMemeVideo = ({src}: {src: string}) => { const videoRef = useRef(null); const playbackAllowed = useAnimatedMediaVideoPlayback(videoRef); return (