softchatjs-react-native
Version:
React native UI SDK for softchatjs-core. Create a free account at: https://www.softchatjs.com
1 lines โข 793 kB
Source Map (JSON)
{"version":3,"sources":["../../../src/components/Modals/EmojiList.tsx","../../../src/components/Search.tsx","../../../src/contexts/ChatProvider.tsx","../../../src/contexts/ModalProvider.tsx","../../../src/theme/colors.ts","../../../src/theme/index.ts","../../../src/contexts/MessageStateContext.tsx","../../../src/constants/defaultUser.ts","../../../src/assets/emoji.ts","../../../src/assets/icons.tsx"],"sourcesContent":["import {\r\n View,\r\n Text,\r\n Dimensions,\r\n TouchableOpacity,\r\n Platform,\r\n} from \"react-native\";\r\nimport React, { useState, useCallback } from \"react\";\r\nimport Search from \"../Search\";\r\nimport { FlashList } from \"@shopify/flash-list\";\r\nimport { emojis } from \"../../assets/emoji\";\r\nimport { useConfig } from \"../../contexts/ChatProvider\";\r\nimport { CloseIcon, TimesIcon } from \"../../assets/icons\";\r\nimport { useModalProvider } from \"../../contexts/ModalProvider\";\r\nimport { Emoji, Message } from \"softchatjs-core\";\r\nimport { ChatTheme } from \"../../types\";\r\n\r\ntype EmojiListProps = {\r\n recipientId: string;\r\n message: Message | null;\r\n theme: ChatTheme | undefined;\r\n type?: \"reaction\" | \"message\",\r\n onSelect?: (value: string) => void;\r\n};\r\n\r\nexport default function EmojiListModal(props: EmojiListProps) {\r\n const { recipientId, message, theme, type = \"reaction\", onSelect } = props;\r\n const { fontFamily, client } = useConfig();\r\n const [searchValue, setSearchValue] = useState(\"\");\r\n const { resetModal } = useModalProvider();\r\n\r\n const width = Dimensions.get(\"window\").width;\r\n const emojiSize = 50;\r\n var noOfColumns = Math.floor(width / emojiSize);\r\n\r\n const addReaction = useCallback(\r\n (emoji: string) => {\r\n if (client && message) {\r\n const newReaction = {\r\n emoji: emoji,\r\n uid: client.chatUserId,\r\n };\r\n\r\n const existingReactionIndex = message.reactions.findIndex(\r\n (reaction) => reaction.uid === client.chatUserId\r\n );\r\n\r\n let updatedReactions: Array<{ uid: string; emoji: string }>;\r\n\r\n if (existingReactionIndex !== -1) {\r\n updatedReactions = [...message.reactions];\r\n updatedReactions[existingReactionIndex] = newReaction;\r\n } else {\r\n updatedReactions = [...message.reactions, newReaction];\r\n }\r\n\r\n client.messageClient(message.conversationId).reactToMessage({\r\n conversationId: message.conversationId,\r\n messageId: message.messageId,\r\n reactions: updatedReactions,\r\n to: recipientId,\r\n });\r\n } else {\r\n console.log(\"not sending\");\r\n }\r\n },\r\n [message, client, recipientId]\r\n );\r\n\r\n const renderEmoji = useCallback(\r\n ({ item, index }: { item: any; index: number }) => {\r\n return (\r\n <TouchableOpacity\r\n key={index}\r\n onPress={() => {\r\n if(type == \"reaction\"){\r\n addReaction(item.emoji);\r\n }else{\r\n onSelect?.(item.emoji)\r\n }\r\n resetModal();\r\n }}\r\n style={{\r\n height: emojiSize,\r\n minWidth: emojiSize,\r\n alignItems: \"center\",\r\n margin: 0.7,\r\n flex: 1,\r\n justifyContent: \"center\",\r\n borderRadius: emojiSize,\r\n }}\r\n >\r\n <Text\r\n style={{\r\n // fontSize: Platform.OS === \"android\" ? 25 : 35,\r\n fontSize: emojiSize * 0.75,\r\n fontFamily,\r\n }}\r\n >\r\n {item.emoji}\r\n </Text>\r\n </TouchableOpacity>\r\n );\r\n },\r\n []\r\n );\r\n\r\n var filtered_emojis = emojis.filter((data: Emoji) => {\r\n return (\r\n data.description.toLowerCase()?.indexOf(searchValue.toLowerCase()) !==\r\n -1\r\n );\r\n });\r\n\r\n const emoji_list = filtered_emojis.length > 0 ? filtered_emojis : emojis;\r\n\r\n return (\r\n <View\r\n style={{\r\n backgroundColor: theme.background.primary,\r\n flex: 1,\r\n height: \"100%\",\r\n width: \"100%\",\r\n paddingTop: Platform.OS === \"ios\"? 40 : 0\r\n }}\r\n >\r\n <View\r\n style={{\r\n flexDirection: \"row\",\r\n justifyContent: \"space-between\",\r\n alignItems: \"center\",\r\n paddingHorizontal: 15,\r\n }}\r\n >\r\n <TouchableOpacity onPress={() => resetModal()}>\r\n <TimesIcon color={theme.icon} />\r\n </TouchableOpacity>\r\n <Search\r\n containerStyle={{ flex: 1 }}\r\n value={searchValue}\r\n setValue={setSearchValue}\r\n placeholder=\"Search emoji\"\r\n />\r\n </View>\r\n <Text style={{ paddingHorizontal: 15, color: theme.text.secondary }}>\r\n Smileys and Emoticons\r\n </Text>\r\n\r\n <View\r\n style={{\r\n height: \"100%\",\r\n width: \"100%\",\r\n paddingTop: 5,\r\n padding: 15,\r\n flexDirection: \"row\",\r\n flexWrap: \"wrap\",\r\n flexGrow: 1,\r\n flex: 1,\r\n }}\r\n >\r\n <FlashList\r\n numColumns={noOfColumns}\r\n data={emoji_list}\r\n estimatedItemSize={200}\r\n renderItem={renderEmoji}\r\n ListEmptyComponent={() => <Text>emepty</Text>}\r\n />\r\n </View>\r\n </View>\r\n );\r\n}\r\n","import { View, Text, TextInput, ViewStyle } from \"react-native\";\r\nimport React from \"react\";\r\nimport { SetState } from \"../types\";\r\nimport { useConfig } from \"../contexts/ChatProvider\";\r\n\r\ntype Search = {\r\n value: string;\r\n setValue: SetState<string>;\r\n placeholder: string;\r\n containerStyle?: ViewStyle;\r\n};\r\n\r\nexport default function Search(props: Search) {\r\n const { theme, fontFamily } = useConfig();\r\n const { value, setValue, placeholder, containerStyle } = props;\r\n return (\r\n <View\r\n style={{\r\n paddingHorizontal: 10,\r\n marginVertical: 10,\r\n width: \"100%\",\r\n ...containerStyle,\r\n }}\r\n >\r\n <TextInput\r\n style={{\r\n height: 45,\r\n width: \"100%\",\r\n borderWidth: 1,\r\n borderColor: theme?.divider,\r\n borderRadius: 10,\r\n paddingStart: 10,\r\n color: theme?.text.secondary,\r\n fontFamily\r\n }}\r\n placeholder={placeholder}\r\n placeholderTextColor=\"grey\"\r\n value={value}\r\n onChangeText={(val) => setValue(val)}\r\n />\r\n </View>\r\n );\r\n}\r\n","import React, { createContext, useContext, useEffect } from \"react\";\r\nimport { ChatTheme, Config } from \"../types\";\r\nimport ModalProvider from \"./ModalProvider\";\r\nimport ChatClient from \"softchatjs-core\";\r\nimport defaultTheme from \"../theme\";\r\nimport { MessageStateProvider } from \"./MessageStateContext\";\r\n\r\ntype ChatProvider = {\r\n children: JSX.Element;\r\n theme?: ChatTheme;\r\n fontFamily: string | undefined;\r\n /**\r\n * Multiplier to adjust the font size dynamically.\r\n * A value of 1 keeps the default size, while values like 0.5 or 1.5 scale it down or up.\r\n */\r\n fontScale?: number\r\n};\r\n\r\nconst ConfigContext = createContext<\r\n Omit<ChatProvider, \"children\"> & { client: ChatClient | null }\r\n>({\r\n theme: defaultTheme,\r\n client: null,\r\n fontFamily: undefined,\r\n fontScale: 1\r\n});\r\n\r\nexport function useConfig() {\r\n return useContext(ConfigContext);\r\n}\r\n\r\nexport default function ChatProvider(\r\n props: ChatProvider & { client: ChatClient | null }\r\n) {\r\n const { children, client, theme = defaultTheme, fontFamily, fontScale } = props;\r\n\r\n return (\r\n <ConfigContext.Provider value={{ theme, client, fontFamily, fontScale }}>\r\n <MessageStateProvider>\r\n <ModalProvider>{children}</ModalProvider>\r\n </MessageStateProvider>\r\n </ConfigContext.Provider>\r\n );\r\n}\r\n","import React, { createContext, useContext, useState } from \"react\";\r\nimport {\r\n KeyboardAvoidingView,\r\n Modal,\r\n ScrollView,\r\n StyleSheet,\r\n TouchableWithoutFeedback,\r\n View,\r\n ViewStyle,\r\n Text,\r\n} from \"react-native\";\r\nimport { Children } from \"../types\";\r\nimport { stopPropagation } from \"../utils\";\r\n\r\ntype ModalProps = {\r\n dismissable?: boolean;\r\n justifyContent?: ViewStyle[\"justifyContent\"];\r\n children: Children | null;\r\n animation?: \"none\" | \"fade\" | \"slide\" | undefined;\r\n containerWidth?: ViewStyle[\"width\"];\r\n};\r\n\r\ntype ModalProvider = {\r\n displayModal: (child: ModalProps) => void;\r\n resetModal: (cb?: Function) => void;\r\n};\r\n\r\nconst initial: ModalProvider & { modalProps: ModalProps | null } = {\r\n displayModal: () => {},\r\n resetModal: () => {},\r\n modalProps: {\r\n dismissable: true,\r\n justifyContent: \"center\",\r\n children: null,\r\n animation: \"slide\",\r\n containerWidth: \"100%\",\r\n },\r\n};\r\n\r\nconst ModalProviderContext = createContext<ModalProvider>(initial);\r\n\r\nexport const useModalProvider = () => useContext(ModalProviderContext);\r\n\r\nexport default function ModalProvider(props: { children: Children }) {\r\n const { children } = props;\r\n\r\n const [modal, showModal] = useState(false);\r\n const [modalProps, setModalProps] = useState(initial.modalProps);\r\n\r\n const displayModal = (props: ModalProps) => {\r\n showModal(true);\r\n setModalProps({ ...initial.modalProps, ...props });\r\n };\r\n\r\n const dismiss = () => {\r\n if (modalProps?.dismissable) {\r\n showModal(false);\r\n }\r\n };\r\n\r\n const resetModal = (cb?: Function) => {\r\n showModal(false);\r\n cb?.();\r\n };\r\n\r\n return (\r\n <ModalProviderContext.Provider\r\n value={{\r\n displayModal,\r\n resetModal,\r\n }}\r\n >\r\n {children}\r\n <Modal\r\n animationType={modalProps?.animation}\r\n style={{ height: \"100%\", width: \"100%\" }}\r\n visible={modal}\r\n transparent\r\n >\r\n <View\r\n style={{\r\n flex: 1,\r\n height: \"100%\",\r\n width: \"100%\",\r\n alignItems: \"center\",\r\n justifyContent: modalProps?.justifyContent,\r\n backgroundColor: \"rgba(0,0,0,.3)\",\r\n }}\r\n >\r\n <View style={{ flex: 1, width: \"100%\", height: \"100%\" }}>\r\n {modalProps?.children}\r\n </View>\r\n </View>\r\n </Modal>\r\n </ModalProviderContext.Provider>\r\n );\r\n}\r\n","interface Color {\r\n 50: string;\r\n 100: string;\r\n 200: string;\r\n 300: string;\r\n 400: string;\r\n 500: string;\r\n 600: string;\r\n 700: string;\r\n 800: string;\r\n 900: string;\r\n A100?: string;\r\n}\r\n\r\nexport const teal: Color = {\r\n 50: '#DCF2F0',\r\n 100: '#A9DFD8',\r\n 200: '#73CABE',\r\n 300: '#3AB4A4',\r\n 400: '#00A391',\r\n 500: '#00927E',\r\n 600: '#008572',\r\n 700: '#007662',\r\n 800: '#006654',\r\n 900: '#004A38',\r\n};\r\n\r\nexport const fuchsia: Color = {\r\n 50: '#FAE9F7',\r\n 100: '#F2C8ED',\r\n 200: '#EBA3E3',\r\n 300: '#E27DD7',\r\n 400: '#D95ECD',\r\n 500: '#D043C4',\r\n 600: '#C13EBD',\r\n 700: '#AE36B5',\r\n 800: '#9D31AE',\r\n 900: '#7F28A0',\r\n};\r\n\r\nexport const green: Color = {\r\n 50: '#E6F5E4',\r\n 100: '#C2E6BD',\r\n 200: '#9AD693',\r\n 300: '#6FC666',\r\n 400: '#4ABA42',\r\n 500: '#17AE13',\r\n 600: '#029F04',\r\n 700: '#008D00',\r\n 800: '#007C00',\r\n 900: '#005E00',\r\n};\r\n\r\nexport const bluishCyan: Color = {\r\n 50: '#E2F5FE',\r\n 100: '#B5E6FB',\r\n 200: '#84D6F9',\r\n 300: '#56C6F6',\r\n 400: '#36B9F5',\r\n 500: '#20AEF3',\r\n 600: '#1D9FE4',\r\n 700: '#188BD0',\r\n 800: '#167ABC',\r\n 900: '#105A9A',\r\n};\r\n\r\nexport const yellowOrange: Color = {\r\n 50: '#FEF3E2',\r\n 100: '#FDE0B6',\r\n 200: '#FDCD87',\r\n 300: '#FCB859',\r\n 400: '#FBA939',\r\n 500: '#FB9A23',\r\n 600: '#F78F21',\r\n 700: '#F07F1E',\r\n 800: '#EA701B',\r\n 900: '#E05716',\r\n};\r\n\r\nexport const pinkishRed: Color = {\r\n 50: '#FFEBF0',\r\n 100: '#FFCCD6',\r\n 200: '#FB969F',\r\n 300: '#F66B79',\r\n 400: '#FF3F56',\r\n 500: '#FF183B',\r\n 600: '#FC003C',\r\n 700: '#EA0034',\r\n 800: '#DD002C',\r\n 900: '#CF001E',\r\n};\r\n\r\nexport const grey: Color = {\r\n 50: '#F6F6FF',\r\n 100: '#F2F1FF',\r\n 200: '#EBEBF9',\r\n 300: '#CAC9D7',\r\n 400: '#ACACB9',\r\n 500: '#82818F',\r\n 600: '#6D6D7A',\r\n 700: '#4D4D59',\r\n 800: '#2B2B36',\r\n 900: '#21222D',\r\n A100: '#1D1E26',\r\n};\r\n\r\nexport const stone: Color = {\r\n 50: '#F8F8F8',\r\n 100: '#EFEFEF',\r\n 200: '#E8E8E8',\r\n 300: '#D9D9D9',\r\n 400: '#D2D2D2',\r\n 500: '#A0A0A0',\r\n 600: '#87888C',\r\n 700: '#2C2D33',\r\n 800: '#1D1E26',\r\n 900: '#171821',\r\n};\r\n","import { ChatTheme } from \"../types\"\r\nimport { bluishCyan, fuchsia, green, grey, stone, teal } from \"./colors\"\r\n\r\nconst theme: ChatTheme = {\r\n background: {\r\n primary: stone[900],\r\n secondary: grey[900],\r\n disabled: grey[800]\r\n },\r\n text: {\r\n primary: 'black',\r\n secondary: stone[200],\r\n disabled: stone[500],\r\n },\r\n action: {\r\n primary: teal[50],\r\n secondary: stone[300]\r\n },\r\n chatBubble: {\r\n left: {\r\n bgColor: grey[900],\r\n messageColor: stone[200],\r\n messageTimeColor: 'grey',\r\n replyBorderColor: stone[200]\r\n },\r\n right: {\r\n bgColor: \"#474952\",\r\n messageColor: 'white',\r\n messageTimeColor: 'grey',\r\n replyBorderColor: green[900]\r\n },\r\n },\r\n icon: 'white',\r\n divider: stone[700]\r\n}\r\n\r\nexport default theme","import React, {\r\n createContext,\r\n useState,\r\n useContext,\r\n} from \"react\";\r\nimport {\r\n SetState,\r\n} from \"../types\";\r\nimport { Audio, AVPlaybackStatus } from 'expo-av';\r\nimport { Emoticon, Message, SendMessageGenerics, Media, UserMeta, Conversation, ConversationListItem } from \"softchatjs-core\";\r\nimport defaultUser from \"../constants/defaultUser\";\r\n\r\ntype MessageStateContext = {\r\n globalTextMessage: string,\r\n setGlobalTextMessage: SetState<string>,\r\n stickers: Emoticon[],\r\n setStickers: SetState<Emoticon[]>,\r\n pendingMessages: Array<Partial<Message>>,\r\n addNewPendingMessages: (message: Partial<Message>) => void;\r\n removePendingMessage: (messageId: string) => void;\r\n updatePendingMessage: (messageId: string, message: Message) => void;\r\n playVoiceMessage: (media: Media) => void;\r\n pauseVoiceMessage: () => void;\r\n resumeVoiceMessage: () => void;\r\n audioState: \"playing\" | \"paused\" | \"loading\" | null,\r\n unload: () => void;\r\n sound: Audio.Sound | null,\r\n activeVoiceMessage: Media | null,\r\n avPlayBackStatus: AVPlaybackStatus & { positionMillis: number } | null,\r\n userMeta: UserMeta,\r\n setUserMeta: SetState<UserMeta>,\r\n conversationList: Array<ConversationListItem>,\r\n setConversationList: SetState<Array<ConversationListItem>>\r\n};\r\n\r\nconst initialMessageStateContext: MessageStateContext = {\r\n globalTextMessage: '',\r\n setGlobalTextMessage: () => {},\r\n stickers: [],\r\n setStickers: () => {},\r\n pendingMessages: [],\r\n addNewPendingMessages: (message: Partial<Message>) => {},\r\n removePendingMessage: (messageId: string) => {},\r\n updatePendingMessage: (messageId: string, message: Message) => {},\r\n playVoiceMessage: (media: Media) => {},\r\n pauseVoiceMessage: () => {},\r\n resumeVoiceMessage: () => {},\r\n audioState: null,\r\n unload: () => {},\r\n sound: null,\r\n activeVoiceMessage: null,\r\n avPlayBackStatus: null,\r\n userMeta: defaultUser,\r\n setUserMeta: () => {},\r\n conversationList: [],\r\n setConversationList: () => {}\r\n}\r\n\r\nexport default initialMessageStateContext;\r\n\r\nconst MessageStateContext = createContext<MessageStateContext>(\r\n initialMessageStateContext\r\n);\r\n\r\nexport const useMessageState = () => useContext(MessageStateContext);\r\n\r\nexport const MessageStateProvider = ({ children }: { children: JSX.Element }) => {\r\n \r\n const [conversationList, setConversationList] = useState<Array<ConversationListItem>>([]);\r\n const [ globalTextMessage, setGlobalTextMessage ] = useState('');\r\n const [ stickers, setStickers ] = useState<Emoticon[]>([]);\r\n const [ pendingMessages, setPendingMessages ] = useState<Array<Partial<Message>>>([]);\r\n const [sound, setSound] = useState<Audio.Sound | null>(null);\r\n const [ audioState, setAudioState ] = useState<\"playing\" | \"paused\" | \"loading\" | null>(null);\r\n const [ activeVoiceMessage, setActiveVoiceMessage ] = useState<Media | null>(null);\r\n const [ avPlayBackStatus, setAvPlayBackStatus ] = useState<AVPlaybackStatus & { positionMillis: number } | null>(null);\r\n const [ userMeta, setUserMeta ] = useState<UserMeta>(defaultUser);\r\n\r\n const addNewPendingMessages = (message: Partial<Message>) => {\r\n setPendingMessages((prev) => {\r\n return [ ...prev, message ]\r\n });\r\n }\r\n\r\n const removePendingMessage = (messageId: string) => {\r\n setPendingMessages((prev) => {\r\n const filtered = prev.filter(m => m.messageId !== messageId)\r\n return filtered\r\n });\r\n }\r\n\r\n const updatePendingMessage = (messageId: string, updatedMessage: Message) => {\r\n const clonedMessage = JSON.parse(JSON.stringify(updatedMessage));\r\n \r\n setPendingMessages((prev) =>\r\n prev.map((message) =>\r\n message.messageId === messageId ? { ...message, ...clonedMessage } : message\r\n )\r\n );\r\n };\r\n \r\n const onPlaybackStatusUpdate = (data: AVPlaybackStatus & { didJustFinish: boolean , positionMillis: number}) => {\r\n console.log(data)\r\n setAvPlayBackStatus(data)\r\n if(data?.didJustFinish){\r\n setAudioState(null);\r\n unload();\r\n }\r\n };\r\n \r\n const playVoiceMessage = async (media: Media) => {\r\n if (activeVoiceMessage !== null && media.mediaId !== activeVoiceMessage?.mediaId) {\r\n return unload()\r\n }\r\n \r\n setActiveVoiceMessage(media);\r\n setAudioState(\"loading\");\r\n \r\n try {\r\n console.log('Loading Sound');\r\n console.log(media.mediaUrl)\r\n const { sound: avSound } = await Audio.Sound.createAsync({ uri: media.mediaUrl }, {}, onPlaybackStatusUpdate);\r\n setSound(avSound);\r\n console.log('Playing Sound');\r\n setAudioState(\"playing\");\r\n await avSound.playAsync();\r\n } catch (error) {\r\n console.error(\"Error loading audio: \", error);\r\n setAudioState(null); \r\n }\r\n };\r\n\r\n const pauseVoiceMessage = async () => {\r\n await sound?.pauseAsync();\r\n setAudioState(\"paused\")\r\n }\r\n\r\n const resumeVoiceMessage = async () => {\r\n if(audioState === \"paused\"){\r\n await sound?.playAsync();\r\n setAudioState(\"playing\")\r\n }\r\n }\r\n\r\n const unload = () => {\r\n console.log('Unloading Sound');\r\n sound?.stopAsync();\r\n sound?.unloadAsync();\r\n setSound(null);\r\n setActiveVoiceMessage(null);\r\n setAudioState(null)\r\n }\r\n\r\n return (\r\n <MessageStateContext.Provider\r\n value={{\r\n globalTextMessage,\r\n setGlobalTextMessage,\r\n stickers,\r\n setStickers,\r\n pendingMessages, \r\n addNewPendingMessages,\r\n removePendingMessage,\r\n updatePendingMessage,\r\n playVoiceMessage,\r\n pauseVoiceMessage,\r\n resumeVoiceMessage,\r\n audioState,\r\n unload,\r\n sound,\r\n activeVoiceMessage,\r\n avPlayBackStatus,\r\n userMeta,\r\n setUserMeta,\r\n conversationList,\r\n setConversationList\r\n }}\r\n >\r\n {children}\r\n </MessageStateContext.Provider>\r\n );\r\n};\r\n","export default {\r\n id: \"\",\r\n uid: \"\",\r\n username: \"\",\r\n firstname: \"\",\r\n lastname: \"\",\r\n profileUrl: \"\",\r\n color: \"\",\r\n custom: {}\r\n}\r\n","export const emojis = [\r\n {\r\n emoji: \"๐\",\r\n description: \"grinning face\",\r\n category: \"Smileys & Emotion\",\r\n aliases: [\"grinning\"],\r\n tags: [\"smile\", \"happy\"],\r\n unicode_version: \"6.1\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"๐\",\r\n description: \"grinning face with big eyes\",\r\n category: \"Smileys & Emotion\",\r\n aliases: [\"smiley\"],\r\n tags: [\"happy\", \"joy\", \"haha\"],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"๐\",\r\n description: \"grinning face with smiling eyes\",\r\n category: \"Smileys & Emotion\",\r\n aliases: [\"smile\"],\r\n tags: [\"happy\", \"joy\", \"laugh\", \"pleased\"],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"๐\",\r\n description: \"beaming face with smiling eyes\",\r\n category: \"Smileys & Emotion\",\r\n aliases: [\"grin\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"๐\",\r\n description: \"grinning squinting face\",\r\n category: \"Smileys & Emotion\",\r\n aliases: [\"laughing\", \"satisfied\"],\r\n tags: [\"happy\", \"haha\"],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"๐
\",\r\n description: \"grinning face with sweat\",\r\n category: \"Smileys & Emotion\",\r\n aliases: [\"sweat_smile\"],\r\n tags: [\"hot\"],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"๐คฃ\",\r\n description: \"rolling on the floor laughing\",\r\n category: \"Smileys & Emotion\",\r\n aliases: [\"rofl\"],\r\n tags: [\"lol\", \"laughing\"],\r\n unicode_version: \"9.0\",\r\n ios_version: \"10.2\",\r\n },\r\n {\r\n emoji: \"๐\",\r\n description: \"face with tears of joy\",\r\n category: \"Smileys & Emotion\",\r\n aliases: [\"joy\"],\r\n tags: [\"tears\"],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"๐\",\r\n description: \"slightly smiling face\",\r\n category: \"Smileys & Emotion\",\r\n aliases: [\"slightly_smiling_face\"],\r\n tags: [],\r\n unicode_version: \"7.0\",\r\n ios_version: \"9.1\",\r\n },\r\n {\r\n emoji: \"๐\",\r\n description: \"upside-down face\",\r\n category: \"Smileys & Emotion\",\r\n aliases: [\"upside_down_face\"],\r\n tags: [],\r\n unicode_version: \"8.0\",\r\n ios_version: \"9.1\",\r\n },\r\n {\r\n emoji: \"๐\",\r\n description: \"winking face\",\r\n category: \"Smileys & Emotion\",\r\n aliases: [\"wink\"],\r\n tags: [\"flirt\"],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"๐\",\r\n description: \"smiling face with smiling eyes\",\r\n category: \"Smileys & Emotion\",\r\n aliases: [\"blush\"],\r\n tags: [\"proud\"],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"๐\",\r\n description: \"smiling face with halo\",\r\n category: \"Smileys & Emotion\",\r\n aliases: [\"innocent\"],\r\n tags: [\"angel\"],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"๐ฅฐ\",\r\n description: \"smiling face with hearts\",\r\n category: \"Smileys & Emotion\",\r\n aliases: [\"smiling_face_with_three_hearts\"],\r\n tags: [\"love\"],\r\n unicode_version: \"11.0\",\r\n ios_version: \"12.1\",\r\n },\r\n {\r\n emoji: \"๐\",\r\n description: \"smiling face with heart-eyes\",\r\n category: \"Smileys & Emotion\",\r\n aliases: [\"heart_eyes\"],\r\n tags: [\"love\", \"crush\"],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"๐คฉ\",\r\n description: \"star-struck\",\r\n category: \"Smileys & Emotion\",\r\n aliases: [\"star_struck\"],\r\n tags: [\"eyes\"],\r\n unicode_version: \"11.0\",\r\n ios_version: \"12.1\",\r\n },\r\n {\r\n emoji: \"๐\",\r\n description: \"face blowing a kiss\",\r\n category: \"Smileys & Emotion\",\r\n aliases: [\"kissing_heart\"],\r\n tags: [\"flirt\"],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"๐\",\r\n description: \"kissing face\",\r\n category: \"Smileys & Emotion\",\r\n aliases: [\"kissing\"],\r\n tags: [],\r\n unicode_version: \"6.1\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"โบ๏ธ\",\r\n description: \"smiling face\",\r\n category: \"Smileys & Emotion\",\r\n aliases: [\"relaxed\"],\r\n tags: [\"blush\", \"pleased\"],\r\n unicode_version: \"\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"๐\",\r\n description: \"kissing face with closed eyes\",\r\n category: \"Smileys & Emotion\",\r\n aliases: [\"kissing_closed_eyes\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"๐\",\r\n description: \"kissing face with smiling eyes\",\r\n category: \"Smileys & Emotion\",\r\n aliases: [\"kissing_smiling_eyes\"],\r\n tags: [],\r\n unicode_version: \"6.1\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"๐ฅฒ\",\r\n description: \"smiling face with tear\",\r\n category: \"Smileys & Emotion\",\r\n aliases: [\"smiling_face_with_tear\"],\r\n tags: [],\r\n unicode_version: \"13.0\",\r\n ios_version: \"14.0\",\r\n },\r\n {\r\n emoji: \"๐\",\r\n description: \"face savoring food\",\r\n category: \"Smileys & Emotion\",\r\n aliases: [\"yum\"],\r\n tags: [\"tongue\", \"lick\"],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"๐\",\r\n description: \"face with tongue\",\r\n category: \"Smileys & Emotion\",\r\n aliases: [\"stuck_out_tongue\"],\r\n tags: [],\r\n unicode_version: \"6.1\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"๐\",\r\n description: \"winking face with tongue\",\r\n category: \"Smileys & Emotion\",\r\n aliases: [\"stuck_out_tongue_winking_eye\"],\r\n tags: [\"prank\", \"silly\"],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"๐คช\",\r\n description: \"zany face\",\r\n category: \"Smileys & Emotion\",\r\n aliases: [\"zany_face\"],\r\n tags: [\"goofy\", \"wacky\"],\r\n unicode_version: \"11.0\",\r\n ios_version: \"12.1\",\r\n },\r\n {\r\n emoji: \"๐\",\r\n description: \"squinting face with tongue\",\r\n category: \"Smileys & Emotion\",\r\n aliases: [\"stuck_out_tongue_closed_eyes\"],\r\n tags: [\"prank\"],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"๐ค\",\r\n description: \"money-mouth face\",\r\n category: \"Smileys & Emotion\",\r\n aliases: [\"money_mouth_face\"],\r\n tags: [\"rich\"],\r\n unicode_version: \"8.0\",\r\n ios_version: \"9.1\",\r\n },\r\n {\r\n emoji: \"๐ค\",\r\n description: \"smiling face with open hands\",\r\n category: \"Smileys & Emotion\",\r\n aliases: [\"hugs\"],\r\n tags: [],\r\n unicode_version: \"8.0\",\r\n ios_version: \"9.1\",\r\n },\r\n {\r\n emoji: \"๐คญ\",\r\n description: \"face with hand over mouth\",\r\n category: \"Smileys & Emotion\",\r\n aliases: [\"hand_over_mouth\"],\r\n tags: [\"quiet\", \"whoops\"],\r\n unicode_version: \"11.0\",\r\n ios_version: \"12.1\",\r\n },\r\n {\r\n emoji: \"๐ซข\",\r\n description: \"face with open eyes and hand over mouth\",\r\n category: \"Smileys & Emotion\",\r\n aliases: [\"face_with_open_eyes_and_hand_over_mouth\"],\r\n tags: [\"gasp\", \"shock\"],\r\n unicode_version: \"14.0\",\r\n ios_version: \"15.4\",\r\n },\r\n {\r\n emoji: \"๐ซฃ\",\r\n description: \"face with peeking eye\",\r\n category: \"Smileys & Emotion\",\r\n aliases: [\"face_with_peeking_eye\"],\r\n tags: [],\r\n unicode_version: \"14.0\",\r\n ios_version: \"15.4\",\r\n },\r\n {\r\n emoji: \"๐คซ\",\r\n description: \"shushing face\",\r\n category: \"Smileys & Emotion\",\r\n aliases: [\"shushing_face\"],\r\n tags: [\"silence\", \"quiet\"],\r\n unicode_version: \"11.0\",\r\n ios_version: \"12.1\",\r\n },\r\n {\r\n emoji: \"๐ค\",\r\n description: \"thinking face\",\r\n category: \"Smileys & Emotion\",\r\n aliases: [\"thinking\"],\r\n tags: [],\r\n unicode_version: \"8.0\",\r\n ios_version: \"9.1\",\r\n },\r\n {\r\n emoji: \"๐ซก\",\r\n description: \"saluting face\",\r\n category: \"Smileys & Emotion\",\r\n aliases: [\"saluting_face\"],\r\n tags: [\"respect\"],\r\n unicode_version: \"14.0\",\r\n ios_version: \"15.4\",\r\n },\r\n {\r\n emoji: \"๐ค\",\r\n description: \"zipper-mouth face\",\r\n category: \"Smileys & Emotion\",\r\n aliases: [\"zipper_mouth_face\"],\r\n tags: [\"silence\", \"hush\"],\r\n unicode_version: \"8.0\",\r\n ios_version: \"9.1\",\r\n },\r\n {\r\n emoji: \"๐คจ\",\r\n description: \"face with raised eyebrow\",\r\n category: \"Smileys & Emotion\",\r\n aliases: [\"raised_eyebrow\"],\r\n tags: [\"suspicious\"],\r\n unicode_version: \"11.0\",\r\n ios_version: \"12.1\",\r\n },\r\n {\r\n emoji: \"๐\",\r\n description: \"neutral face\",\r\n category: \"Smileys & Emotion\",\r\n aliases: [\"neutral_face\"],\r\n tags: [\"meh\"],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"๐\",\r\n description: \"expressionless face\",\r\n category: \"Smileys & Emotion\",\r\n aliases: [\"expressionless\"],\r\n tags: [],\r\n unicode_version: \"6.1\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"๐ถ\",\r\n description: \"face without mouth\",\r\n category: \"Smileys & Emotion\",\r\n aliases: [\"no_mouth\"],\r\n tags: [\"mute\", \"silence\"],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"๐ซฅ\",\r\n description: \"dotted line face\",\r\n category: \"Smileys & Emotion\",\r\n aliases: [\"dotted_line_face\"],\r\n tags: [\"invisible\"],\r\n unicode_version: \"14.0\",\r\n ios_version: \"15.4\",\r\n },\r\n {\r\n emoji: \"๐ถโ๐ซ๏ธ\",\r\n description: \"face in clouds\",\r\n category: \"Smileys & Emotion\",\r\n aliases: [\"face_in_clouds\"],\r\n tags: [],\r\n unicode_version: \"13.1\",\r\n ios_version: \"14.0\",\r\n },\r\n {\r\n emoji: \"๐\",\r\n description: \"smirking face\",\r\n category: \"Smileys & Emotion\",\r\n aliases: [\"smirk\"],\r\n tags: [\"smug\"],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"๐\",\r\n description: \"unamused face\",\r\n category: \"Smileys & Emotion\",\r\n aliases: [\"unamused\"],\r\n tags: [\"meh\"],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"๐\",\r\n description: \"face with rolling eyes\",\r\n category: \"Smileys & Emotion\",\r\n aliases: [\"roll_eyes\"],\r\n tags: [],\r\n unicode_version: \"8.0\",\r\n ios_version: \"9.1\",\r\n },\r\n {\r\n emoji: \"๐ฌ\",\r\n description: \"grimacing face\",\r\n category: \"Smileys & Emotion\",\r\n aliases: [\"grimacing\"],\r\n tags: [],\r\n unicode_version: \"6.1\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"๐ฎโ๐จ\",\r\n description: \"face exhaling\",\r\n category: \"Smileys & Emotion\",\r\n aliases: [\"face_exhaling\"],\r\n tags: [],\r\n unicode_version: \"13.1\",\r\n ios_version: \"14.0\",\r\n },\r\n {\r\n emoji: \"๐คฅ\",\r\n description: \"lying face\",\r\n category: \"Smileys & Emotion\",\r\n aliases: [\"lying_face\"],\r\n tags: [\"liar\"],\r\n unicode_version: \"9.0\",\r\n ios_version: \"10.2\",\r\n },\r\n {\r\n emoji: \"๐ซจ\",\r\n description: \"shaking face\",\r\n category: \"Smileys & Emotion\",\r\n aliases: [\"shaking_face\"],\r\n tags: [\"shock\"],\r\n unicode_version: \"15.0\",\r\n ios_version: \"16.4\",\r\n },\r\n {\r\n emoji: \"๐\",\r\n description: \"relieved face\",\r\n category: \"Smileys & Emotion\",\r\n aliases: [\"relieved\"],\r\n tags: [\"whew\"],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"๐\",\r\n description: \"pensive face\",\r\n category: \"Smileys & Emotion\",\r\n aliases: [\"pensive\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"๐ช\",\r\n description: \"sleepy face\",\r\n category: \"Smileys & Emotion\",\r\n aliases: [\"sleepy\"],\r\n tags: [\"tired\"],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"๐คค\",\r\n description: \"drooling face\",\r\n category: \"Smileys & Emotion\",\r\n aliases: [\"drooling_face\"],\r\n tags: [],\r\n unicode_version: \"9.0\",\r\n ios_version: \"10.2\",\r\n },\r\n {\r\n emoji: \"๐ด\",\r\n description: \"sleeping face\",\r\n category: \"Smileys & Emotion\",\r\n aliases: [\"sleeping\"],\r\n tags: [\"zzz\"],\r\n unicode_version: \"6.1\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"๐ท\",\r\n description: \"face with medical mask\",\r\n category: \"Smileys & Emotion\",\r\n aliases: [\"mask\"],\r\n tags: [\"sick\", \"ill\"],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"๐ค\",\r\n description: \"face with thermometer\",\r\n category: \"Smileys & Emotion\",\r\n aliases: [\"face_with_thermometer\"],\r\n tags: [\"sick\"],\r\n unicode_version: \"8.0\",\r\n ios_version: \"9.1\",\r\n },\r\n {\r\n emoji: \"๐ค\",\r\n description: \"face with head-bandage\",\r\n category: \"Smileys & Emotion\",\r\n aliases: [\"face_with_head_bandage\"],\r\n tags: [\"hurt\"],\r\n unicode_version: \"8.0\",\r\n ios_version: \"9.1\",\r\n },\r\n {\r\n emoji: \"๐คข\",\r\n description: \"nauseated face\",\r\n category: \"Smileys & Emotion\",\r\n aliases: [\"nauseated_face\"],\r\n tags: [\"sick\", \"barf\", \"disgusted\"],\r\n unicode_version: \"9.0\",\r\n ios_version: \"10.2\",\r\n },\r\n {\r\n emoji: \"๐คฎ\",\r\n description: \"face vomiting\",\r\n category: \"Smileys & Emotion\",\r\n aliases: [\"vomiting_face\"],\r\n tags: [\"barf\", \"sick\"],\r\n unicode_version: \"11.0\",\r\n ios_version: \"12.1\",\r\n },\r\n {\r\n emoji: \"๐คง\",\r\n description: \"sneezing face\",\r\n category: \"Smileys & Emotion\",\r\n aliases: [\"sneezing_face\"],\r\n tags: [\"achoo\", \"sick\"],\r\n unicode_version: \"9.0\",\r\n ios_version: \"10.2\",\r\n },\r\n {\r\n emoji: \"๐ฅต\",\r\n description: \"hot face\",\r\n category: \"Smileys & Emotion\",\r\n aliases: [\"hot_face\"],\r\n tags: [\"heat\", \"sweating\"],\r\n unicode_version: \"11.0\",\r\n ios_version: \"12.1\",\r\n },\r\n {\r\n emoji: \"๐ฅถ\",\r\n description: \"cold face\",\r\n category: \"Smileys & Emotion\",\r\n aliases: [\"cold_face\"],\r\n tags: [\"freezing\", \"ice\"],\r\n unicode_version: \"11.0\",\r\n ios_version: \"12.1\",\r\n },\r\n {\r\n emoji: \"๐ฅด\",\r\n description: \"woozy face\",\r\n category: \"Smileys & Emotion\",\r\n aliases: [\"woozy_face\"],\r\n tags: [\"groggy\"],\r\n unicode_version: \"11.0\",\r\n ios_version: \"12.1\",\r\n },\r\n {\r\n emoji: \"๐ต\",\r\n description: \"face with crossed-out eyes\",\r\n category: \"Smileys & Emotion\",\r\n aliases: [\"dizzy_face\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"๐ตโ๐ซ\",\r\n description: \"face with spiral eyes\",\r\n category: \"Smileys & Emotion\",\r\n aliases: [\"face_with_spiral_eyes\"],\r\n tags: [],\r\n unicode_version: \"13.1\",\r\n ios_version: \"14.0\",\r\n },\r\n {\r\n emoji: \"๐คฏ\",\r\n description: \"exploding head\",\r\n category: \"Smileys & Emotion\",\r\n aliases: [\"exploding_head\"],\r\n tags: [\"mind\", \"blown\"],\r\n unicode_version: \"11.0\",\r\n ios_version: \"12.1\",\r\n },\r\n {\r\n emoji: \"๐ค \",\r\n description: \"cowboy hat face\",\r\n category: \"Smileys & Emotion\",\r\n aliases: [\"cowboy_hat_face\"],\r\n tags: [],\r\n unicode_version: \"9.0\",\r\n ios_version: \"10.2\",\r\n },\r\n {\r\n emoji: \"๐ฅณ\",\r\n description: \"partying face\",\r\n category: \"Smileys & Emotion\",\r\n aliases: [\"partying_face\"],\r\n tags: [\"celebration\", \"birthday\"],\r\n unicode_version: \"11.0\",\r\n ios_version: \"12.1\",\r\n },\r\n {\r\n emoji: \"๐ฅธ\",\r\n description: \"disguised face\",\r\n category: \"Smileys & Emotion\",\r\n aliases: [\"disguised_face\"],\r\n tags: [],\r\n unicode_version: \"13.0\",\r\n ios_version: \"14.0\",\r\n },\r\n {\r\n emoji: \"๐\",\r\n description: \"smiling face with sunglasses\",\r\n category: \"Smileys & Emotion\",\r\n aliases: [\"sunglasses\"],\r\n tags: [\"cool\"],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"๐ค\",\r\n description: \"nerd face\",\r\n category: \"Smileys & Emotion\",\r\n aliases: [\"nerd_face\"],\r\n tags: [\"geek\", \"glasses\"],\r\n unicode_version: \"8.0\",\r\n ios_version: \"9.1\",\r\n },\r\n {\r\n emoji: \"๐ง\",\r\n description: \"face with monocle\",\r\n category: \"Smileys & Emotion\",\r\n aliases: [\"monocle_face\"],\r\n tags: [],\r\n unicode_version: \"11.0\",\r\n ios_version: \"12.1\",\r\n },\r\n {\r\n emoji: \"๐\",\r\n description: \"confused face\",\r\n category: \"Smileys & Emotion\",\r\n aliases: [\"confused\"],\r\n tags: [],\r\n unicode_version: \"6.1\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"๐ซค\",\r\n description: \"face with diagonal mouth\",\r\n category: \"Smileys & Emotion\",\r\n aliases: [\"face_with_diagonal_mouth\"],\r\n tags: [\"confused\"],\r\n unicode_version: \"14.0\",\r\n ios_version: \"15.4\",\r\n },\r\n {\r\n emoji: \"๐\",\r\n description: \"worried face\",\r\n category: \"Smileys & Emotion\",\r\n aliases: [\"worried\"],\r\n tags: [\"nervous\"],\r\n unicode_version: \"6.1\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"๐\",\r\n description: \"slightly frowning face\",\r\n category: \"Smileys & Emotion\",\r\n aliases: [\"slightly_frowning_face\"],\r\n tags: [],\r\n unicode_version: \"7.0\",\r\n ios_version: \"9.1\",\r\n },\r\n {\r\n emoji: \"โน๏ธ\",\r\n description: \"frowning face\",\r\n category: \"Smileys & Emotion\",\r\n aliases: [\"frowning_face\"],\r\n tags: [],\r\n unicode_version: \"\",\r\n ios_version: \"9.1\",\r\n },\r\n {\r\n emoji: \"๐ฎ\",\r\n description: \"face with open mouth\",\r\n category: \"Smileys & Emotion\",\r\n aliases: [\"open_mouth\"],\r\n tags: [\"surprise\", \"impressed\", \"wow\"],\r\n unicode_version: \"6.1\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"๐ฏ\",\r\n description: \"hushed face\",\r\n category: \"Smileys & Emotion\",\r\n aliases: [\"hushed\"],\r\n tags: [\"silence\", \"speechless\"],\r\n unicode_version: \"6.1\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"๐ฒ\",\r\n description: \"astonished face\",\r\n category: \"Smileys & Emotion\",\r\n aliases: [\"astonished\"],\r\n tags: [\"amazed\", \"gasp\"],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"๐ณ\",\r\n description: \"flushed face\",\r\n category: \"Smileys & Emotion\",\r\n aliases: [\"flushed\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"๐ฅบ\",\r\n description: \"pleading face\",\r\n category: \"Smileys & Emotion\",\r\n aliases: [\"pleading_face\"],\r\n tags: [\"puppy\", \"eyes\"],\r\n unicode_version: \"11.0\",\r\n ios_version: \"12.1\",\r\n },\r\n {\r\n emoji: \"๐ฅน\",\r\n description: \"face holding back tears\",\r\n category: \"Smileys & Emotion\",\r\n aliases: [\"face_holding_back_tears\"],\r\n tags: [\"tears\", \"gratitude\"],\r\n unicode_version: \"14.0\",\r\n ios_version: \"15.4\",\r\n },\r\n {\r\n emoji: \"๐ฆ\",\r\n description: \"frowning face with open mouth\",\r\n category: \"Smileys & Emotion\",\r\n aliases: [\"frowning\"],\r\n tags: [],\r\n unicode_version: \"6.1\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"๐ง\",\r\n description: \"anguished face\",\r\n category: \"Smileys & Emotion\",\r\n aliases: [\"anguished\"],\r\n tags: [\"stunned\"],\r\n unicode_version: \"6.1\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"๐จ\",\r\n description: \"fearful face\",\r\n category: \"Smileys & Emotion\",\r\n aliases: [\"fearful\"],\r\n tags: [\"scared\", \"shocked\", \"oops\"],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"๐ฐ\",\r\n description: \"anxious face with sweat\",\r\n category: \"Smileys & Emotion\",\r\n aliases: [\"cold_sweat\"],\r\n tags: [\"nervous\"],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"๐ฅ\",\r\n description: \"sad but relieved face\",\r\n category: \"Smileys & Emotion\",\r\n aliases: [\"disappointed_relieved\"],\r\n tags: [\"phew\", \"sweat\", \"nervous\"],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"๐ข\",\r\n description: \"crying face\",\r\n category: \"Smileys & Emotion\",\r\n aliases: [\"cry\"],\r\n tags: [\"sad\", \"tear\"],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"๐ญ\",\r\n description: \"loudly crying face\",\r\n category: \"Smileys & Emotion\",\r\n aliases: [\"sob\"],\r\n tags: [\"sad\", \"cry\", \"bawling\"],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"๐ฑ\",\r\n description: \"face screaming in fear\",\r\n category: \"Smileys & Emotion\",\r\n aliases: [\"scream\"],\r\n tags: [\"horror\", \"shocked\"],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"๐\",\r\n description: \"confounded face\",\r\n category: \"Smileys & Emotion\",\r\n aliases: [\"confounded\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"๐ฃ\",\r\n description: \"persevering face\",\r\n category: \"Smileys & Emotion\",\r\n aliases: [\"persevere\"],\r\n tags: [\"struggling\"],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"๐\",\r\n description: \"disappointed face\",\r\n category: \"Smileys & Emotion\",\r\n aliases: [\"disappointed\"],\r\n tags: [\"sad\"],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"๐\",\r\n description: \"downcast face with sweat\",\r\n category: \"Smileys & Emotion\",\r\n aliases: [\"sweat\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"๐ฉ\",\r\n description: \"weary face\",\r\n category: \"Smileys & Emotion\",\r\n aliases: [\"weary\"],\r\n tags: [\"tired\"],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"๐ซ\",\r\n description: \"tired face\",\r\n category: \"Smileys & Emotion\",\r\n aliases: [\"tired_face\"],\r\n tags: [\"upset\", \"whine\"],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"๐ฅฑ\",\r\n description: \"yawning face\",\r\n category: \"Smileys & Emotion\",\r\n aliases: [\"yawning_face\"],\r\n tags: [],\r\n unicode_version: \"12.0\",\r\n ios_version: \"13.0\",\r\n },\r\n {\r\n emoji: \"๐ค\",\r\n description: \"face with steam from nose\",\r\n category: \"Smileys & Emotion\",\r\n aliases: [\"triumph\"],\r\n tags: [\"smug\"],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"๐ก\",\r\n description: \"enraged face\",\r\n category: \"Smileys & Emotion\",\r\n aliases: [\"rage\", \"pout\"],\r\n tags: [\"angry\"],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"๐ \",\r\n description: \"angry face\",\r\n category: \"Smileys & Emotion\",\r\n aliases: [\"angry\"],\r\n tags: [\"mad\", \"annoyed\"],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"๐คฌ\",\r\n description: \"face with symbols on mouth\",\r\n category: \"Smileys & Emotion\",\r\n aliases: [\"cursing_face\"],\r\n tags: [\"foul\"],\r\n unicode_version: \"11.0\",\r\n ios_version: \"12.1\",\r\n },\r\n {\r\n emoji: \"๐\",\r\n description: \"smiling face with horns\",\r\n category: \"Smileys & Emotion\",\r\n aliases: [\"smiling_imp\"],\r\n tags: [\"devil\", \"evil\", \"horns\"],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"๐ฟ\",\r\n description: \"angry face with horns\",\r\n category: \"Smileys & Emotion\",\r\n aliases: [\"imp\"],\r\n tags: [\"angry\", \"devil\", \"evil\", \"horns\"],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"๐\",\r\n description: \"skull\",\r\n category: \"Smileys & Emotion\",\r\n aliases: [\"skull\"],\r\n tags: [\"dead\", \"danger\", \"poison\"],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"โ ๏ธ\",\r\n description: \"skull and crossbones\",\r\n category: \"Smileys & Emotion\",\r\n aliases: [\"skull_and_crossbones\"],\r\n tags: [\"danger\", \"pirate\"],\r\n unicode_version: \"\",\r\n ios_version: \"9.1\",\r\n },\r\n {\r\n emoji: \"๐ฉ\",\r\n description: \"pile of poo\",\r\n category: \"Smileys & Emotion\",\r\n aliases: [\"hankey\", \"poop\", \"shit\"],\r\n tags: [\"crap\"],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"๐คก\",\r\n description: \"clown face\",\r\n category: \"Smileys & Emotion\",\r\n aliases: [\"clown_face\"],\r\n tags: [],\r\n unicode_version: \"9.0\",\r\n ios_version: \"10.2\",\r\n },\r\n {\r\n emoji: \"๐น\",\r\n description: \"ogre\",\r\n category: \"Smileys & Emotion\",\r\n aliases: [\"japanese_ogre\"],\r\n tags: [\"monster\"],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"๐บ\",\r\n description: \"goblin\",\r\n category: \"Smileys & Emotion\",\r\n aliases: [\"japanese_goblin\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"๐ป\",\r\n description: \"ghost\",\r\n category: \"Smileys & Emotion\",\r\n aliases: [\"ghost\"],\r\n tags: [\"halloween\"],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"๐ฝ\",\r\n description: \"alien\",\r\n category: \"Smileys & Emotion\",\r\n aliases: [\"alien\"],\r\n tags: [\"ufo\"],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"๐พ\",\r\n description: \"alien monster\",\r\n category: \"Smileys & Emotion\",\r\n aliases: [\"space_invader\"],\r\n tags: [\"game\", \"retro\"],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"๐ค\",\r\n description: \"robot\",\r\n category: \"Smileys & Emotion\",\r\n aliases: [\"robot\"],\r\n tags: [],\r\n unicode_version: \"8.0\",\r\n ios_version: \"9.1\",\r\n },\r\n {\r\n emoji: \"๐บ\",\r\n description: \"grinning cat\",\r\n category: \"Smileys & Emotion\",\r\n aliases: [\"smiley_cat\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"๐ธ\",\r\n description: \"grinning cat with smiling eyes\",\r\n category: \"Smileys & Emotion\",\r\n aliases: [\"smile_cat\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"๐น\",\r\n description: \"cat with tears of joy\",\r\n category: \"Smileys & Emotion\",\r\n aliases: [\"joy_cat\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"๐ป\",\r\n description: \"smiling cat with heart-eyes\",\r\n category: \"Smileys & Emotion\",\r\n aliases: [\"heart_eyes_cat\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"๐ผ\",\r\n description: \"cat with wry smile\",\r\n category: \"Smileys & Emotion\",\r\n aliases: [\"smirk_cat\"],\r\n tags: [],\r\n unicode_version: \"6.0\",\r\n ios_version: \"6.0\",\r\n },\r\n {\r\n emoji: \"๐ฝ\",\r\n description: \"kissing cat\",\r\n category: \"Smileys & Emotion\",\r\n aliases: