import haptics from '@components/haptics' import { useAccessibility } from '@utils/accessibility/AccessibilityManager' import { countInstanceEmoji } from '@utils/slices/instancesSlice' import { StyleConstants } from '@utils/styles/constants' import { useTheme } from '@utils/styles/ThemeManager' import React, { RefObject, useCallback, useContext, useEffect } from 'react' import { useTranslation } from 'react-i18next' import { AccessibilityInfo, findNodeHandle, Pressable, SectionList, StyleSheet, Text, View } from 'react-native' import FastImage from 'react-native-fast-image' import { useDispatch } from 'react-redux' import validUrl from 'valid-url' import updateText from '../../updateText' import ComposeContext from '../../utils/createContext' export interface Props { accessibleRefEmojis: RefObject } const ComposeEmojis: React.FC = ({ accessibleRefEmojis }) => { const { composeState, composeDispatch } = useContext(ComposeContext) const { reduceMotionEnabled } = useAccessibility() const { colors } = useTheme() const { t } = useTranslation() const dispatch = useDispatch() useEffect(() => { const tagEmojis = findNodeHandle(accessibleRefEmojis.current) if (composeState.emoji.active) { tagEmojis && AccessibilityInfo.setAccessibilityFocus(tagEmojis) } }, [composeState.emoji.active]) const listHeader = useCallback( ({ section: { title } }) => ( {title} ), [] ) const listItem = useCallback( ({ index, item }: { item: Mastodon.Emoji[]; index: number }) => { return ( {item.map(emoji => { const uri = reduceMotionEnabled ? emoji.static_url : emoji.url if (validUrl.isHttpsUri(uri)) { return ( { haptics('Light') updateText({ composeState, composeDispatch, newText: `:${emoji.shortcode}:`, type: 'emoji' }) dispatch(countInstanceEmoji(emoji)) }} > ) } else { return null } })} ) }, [composeState] ) return ( item[0].shortcode} renderSectionHeader={listHeader} renderItem={listItem} windowSize={2} /> ) } const styles = StyleSheet.create({ base: { flex: 1, flexDirection: 'row', flexWrap: 'wrap', justifyContent: 'space-around', height: 260 }, group: { position: 'absolute', left: StyleConstants.Spacing.L, ...StyleConstants.FontStyle.S }, emojis: { flex: 1, flexWrap: 'wrap', marginTop: StyleConstants.Spacing.M, marginLeft: StyleConstants.Spacing.M }, emoji: { width: 32, height: 32, padding: StyleConstants.Spacing.S, margin: StyleConstants.Spacing.S } }) export default React.memo(ComposeEmojis, () => true)