UNPKG

react-native-emojipicker

Version:
208 lines (186 loc) â€ĸ 11.3 kB
import React from 'react' import PropTypes from 'prop-types' import styled from 'styled-components/native' import { Text, TouchableOpacity, View } from 'react-native' /* list of emoji's sourced from http://getemoji.com */ const PEOPLE_EMOJIS = ['😀', '😃', '😄', '😁', '😆', '😅', '😂', '😇', 'â˜ēī¸', '😊', '🙂', '🙃', '😉', '😌', '😍', '😘', '😗', '😙', '😚', '😋', '😜', '😝', '😛', '🤑', '🤗', '🤓', '😎', '😏', '😒', '😞', '😔', '😟', '😕', '🙁', 'â˜šī¸', 'đŸ˜Ŗ', '😖', 'đŸ˜Ģ', '😩', '😤', '😠', '😡', 'đŸ˜ļ', '😐', '😑', 'đŸ˜¯', 'đŸ˜Ļ', '😧', '😮', '😲', 'đŸ˜ĩ', 'đŸ˜ŗ', '😱', '😨', '😰', 'đŸ˜ĸ', 'đŸ˜Ĩ', '😭', '😓', 'đŸ˜Ē', '😴', '🙄', '🤔', 'đŸ˜Ŧ', '🤐', '😷', '🤒', '🤕', '😈', 'đŸ‘ŋ', '👹', 'đŸ‘ē', '💩', 'đŸ‘ģ', '💀', 'â˜ ī¸', 'đŸ‘Ŋ', '👾', '🤖', '🎃', 'đŸ˜ē', '😸', '😹', 'đŸ˜ģ', 'đŸ˜ŧ', 'đŸ˜Ŋ', '🙀', 'đŸ˜ŋ', '😾', '👐', '🙌', '👏', '🙏', '👍', '👎', '👊', '✊', 'âœŒī¸', '🤘', '👌', '👈', '👉', '👆', '👇', 'â˜ī¸', '✋', '🖐', '🖖', '👋', 'đŸ’Ē', '🖕', 'âœī¸', '💅', '🖖', '💄', '💋', '👄', '👅', '👂', '👃', 'đŸ‘Ŗ', '👁', '👀', '👗', '👠', '👞', '👟', '👒', '🎩', '🎓', '👑', '⛑', '🎒', '👝', '👛', '👜', 'đŸ’ŧ', '👓', 'đŸ•ļ', 'â˜‚ī¸'] const ANIMALS_NATURE_EMOJIS = ['đŸļ', '🐱', '🐭', '🐹', '🐰', 'đŸģ', 'đŸŧ', '🐨', 'đŸ¯', 'đŸĻ', '🐮', '🐷', 'đŸŊ', '🐸', 'đŸĩ', '🙊', '🙉', '🙊', '🐒', '🐔', '🐧', 'đŸĻ', '🐤', 'đŸŖ', 'đŸĨ', 'đŸē', '🐗', '🐴', 'đŸĻ„', '🐝', '🐛', '🐌', '🐚', '🐞', '🐜', '🕷', '🕸', 'đŸĸ', '🐍', 'đŸĻ‚', 'đŸĻ€', '🐙', '🐠', '🐟', '🐡', 'đŸŦ', 'đŸŗ', '🐋', '🐊', '🐆', '🐅', '🐃', '🐂', '🐄', 'đŸĢ', '🐘', '🐎', '🐖', '🐐', '🐏', '🐑', '🐕', '🐩', '🐈', '🐓', 'đŸĻƒ', '🕊', '🐇', '🐁', '🐀', 'đŸŋ', '🐾', '🐉', '🐲', 'đŸŒĩ', '🎄', '🌲', 'đŸŒŗ', '🌴', '🌱', 'đŸŒŋ', 'â˜˜ī¸', '🍀', '🎍', '🎋', '🍃', '🍂', '🍁', '🍄', '🌾', '💐', '🌷', '🌹', 'đŸĨ€', 'đŸŒģ', 'đŸŒŧ', '🌸', 'đŸŒē', '🌎', '🌍', '🌏', '🌕', '🌖', '🌔', '🌚', '🌝', '🌞', '🌛', '🌜', '🌙', 'đŸ’Ģ', 'â­ī¸', '🌟', '✨', 'âšĄī¸', 'đŸ”Ĩ', 'đŸ’Ĩ', 'â˜„ī¸', 'â˜€ī¸', '🌤', 'â›…ī¸', 'đŸŒĨ', 'đŸŒĻ', '🌈', 'â˜ī¸', '🌧', '⛈', '🌩', '🌨', 'â˜ƒī¸', 'â›„ī¸', 'â„ī¸', 'đŸŒŦ', '💨', 'đŸŒĒ', 'đŸŒĢ', '🌊', '💧', 'đŸ’Ļ', 'â˜”ī¸'] const FOOD_SPORTS_EMOJIS = ['🍏', '🍎', '🍐', '🍊', '🍋', '🍌', '🍉', '🍇', '🍓', '🍈', '🍒', '🍑', '🍍', '🍅', '🍆', 'đŸŒŊ', 'đŸŒļ', '🍠', '🌰', 'đŸ¯', '🍞', '🧀', 'đŸŗ', '🍤', '🍗', '🍖', '🍕', '🌭', '🍔', '🍟', '🌮', 'đŸŒ¯', '🍝', '🍜', '🍲', 'đŸĨ', 'đŸŖ', '🍱', '🍛', '🍚', '🍙', '🍘', 'đŸĸ', '🍡', '🍧', '🍨', 'đŸĻ', '🍰', '🎂', '🍮', '🍭', 'đŸŦ', 'đŸĢ', 'đŸŋ', '🍩', 'đŸĒ', 'đŸŧ', 'â˜•ī¸', 'đŸĩ', 'đŸļ', 'đŸē', 'đŸģ', '🍷', '🍸', '🍹', '🍾', '🍴', 'đŸŊ', 'âšŊī¸', '🏀', '🏈', 'âšžī¸', '🎾', '🏐', '🏉', '🎱', '🏓', '🏸', '🏒', '🏑', '🏏', 'â›ŗī¸', '🏹', 'đŸŽŖ', '⛸', 'đŸŽŋ', '⛷', '🏂', '🏋', 'â›šī¸', '🏌', '🏄', '🏊', 'đŸšŖ', '🏇', '🚴', 'đŸšĩ', 'đŸŽŦ', '🎤', '🎧', 'đŸŽŧ', '🎹', '🎷', 'đŸŽē', '🎸', 'đŸŽģ', '🎲', 'đŸŽ¯', 'đŸŽŗ', '🎮', '🏁', '🏆'] const TRAVEL_PLACES_EMOJIS = ['🚗', '🚕', '🚙', '🚌', '🚎', '🏎', '🚓', '🚑', '🚒', '🚐', '🚚', '🚛', '🚜', '🚲', '🏍', '🚨', '🚔', '🚍', '🚘', '🚖', '🚡', '🚠', '🚟', '🚃', '🚋', '🚞', '🚝', '🚄', '🚅', '🚈', '🚂', '🚆', '🚇', '🚊', '🚉', '🚁', '🛩', 'âœˆī¸', 'đŸ›Ģ', 'đŸ›Ŧ', '🚀', '🛰', 'đŸ’ē', 'â›ĩī¸', 'đŸ›Ĩ', '🚤', 'đŸ›ŗ', '⛴', 'đŸšĸ', 'âš“ī¸', '🚧', 'â›Ŋī¸', '🚏', 'đŸšĻ', 'đŸšĨ', 'đŸ—ē', 'đŸ—ŋ', 'đŸ—Ŋ', 'â›˛ī¸', 'đŸ—ŧ', '🏰', 'đŸ¯', '🏟', '🎡', 'đŸŽĸ', '🎠', '⛱', '🏖', '🏝', '⛰', '🏔', 'đŸ—ģ', '🌋', '🏜', '🏕', 'â›ēī¸', '🛤', 'đŸ›Ŗ', '🏗', '🏭', '🏠', '🏡', '🏘', '🏚', 'đŸĸ', 'đŸŦ', 'đŸŖ', '🏤', 'đŸĨ', 'đŸĻ', '🏨', 'đŸĒ', 'đŸĢ', '🏩', '💒', '🏛', 'â›Ēī¸', '🕌', '🕍', '🕋', '⛩', '🗾', '🎑', '🏞', '🌅', '🌄', '🌠', '🎇', '🎆', '🌇', '🌆', '🏙', '🌃', '🌌', '🌉', '🌁', '🎨'] const OBJECTS_EMOJIS = ['🆓', '📗', '📕', 'âŒšī¸', '📱', '📲', 'đŸ’ģ', 'âŒ¨ī¸', 'đŸ–Ĩ', '🖨', '🖱', '🖲', '🕹', '🗜', 'đŸ’Ŋ', '💾', 'đŸ’ŋ', '📀', 'đŸ“ŧ', '📷', '📸', '📹', 'đŸŽĨ', 'đŸ“Ŋ', '🎞', '📞', 'â˜Žī¸', '📟', '📠', 'đŸ“ē', 'đŸ“ģ', '🎙', '🎚', '🎛', '⏱', '⏲', '⏰', '🕰', 'âŒ›ī¸', 'âŗ', '📡', '🔋', '🔌', '💡', 'đŸ”Ļ', 'đŸ•¯', '🗑', 'đŸ›ĸ', '💸', 'đŸ’ĩ', '💴', 'đŸ’ļ', '💷', '💰', 'đŸ’ŗ', '💎', 'âš–ī¸', '🔧', '🔨', '⚒', '⛏', 'âš™ī¸', 'đŸ’Ŗ', 'đŸ”Ē', '🗡', 'âš”ī¸', '🛡', 'âš°ī¸', 'âšąī¸', 'đŸē', '🔮', 'đŸ“ŋ', '💈', 'âš—ī¸', '🔭', 'đŸ”Ŧ', 'đŸ•ŗ', '💊', '💉', '🌡', 'đŸšŊ', '🚰', 'đŸšŋ', '🛁', '🛀', '🛎', '🔑', '🗝', 'đŸšĒ', '🛋', '🛏', 'đŸ–ŧ', '🛍', '🎁', '🎈', '🎏', '🎀', '🎊', '🎉', '🎎', '🏮', '🎐', 'âœ‰ī¸', 'đŸ“Ē', '📮', 'đŸ“¯', '📜', '📃', '📄', '📑', '📊', '📈', '📉', '🗒', '🗓', '📆', '📅', '📇', '🗃', 'đŸ—ŗ', '🗄', '📋', '🗞', '📰', '📘', '📚', '📖', '🔖', '🔗', '📎', '📐', '📏', '📌', '🖊', '🖌', '🖍', '📝', 'âœī¸', '🔍', '🔓'] const SYMBOLS_FLAGS_EMOJIS = ['â¤ī¸', '💛', '💚', '💙', '💜', '💔', 'âŖī¸', '💕', '💞', '💓', '💗', '💖', '💘', '💝', '💟', 'â˜Žī¸', 'âœī¸', 'â˜Ēī¸', '🕉', 'â˜¸ī¸', 'âœĄī¸', 'đŸ”¯', '🕎', 'â˜¯ī¸', 'â˜Ļī¸', '🛐', '⛎', 'â™ˆī¸', 'â™‰ī¸', 'â™Šī¸', 'â™‹ī¸', 'â™Œī¸', 'â™ī¸', 'â™Žī¸', 'â™ī¸', 'â™ī¸', 'â™‘ī¸', 'â™’ī¸', 'â™“ī¸', '🆔', 'âš›ī¸', '🉑', 'â˜ĸī¸', 'â˜Ŗī¸', '📴', 'đŸ“ŗ', 'đŸˆļ', '🈚', '🈸', 'đŸˆē', '🈷', 'âœ´ī¸', '🆚', '💮', '🉐', 'ãŠ™ī¸', 'ãŠ—ī¸', '🈴', 'đŸˆĩ', '🈹', '🈲', '❌', 'â­•ī¸', 'â›”ī¸', '📛', 'đŸšĢ', 'đŸ’¯', 'đŸ’ĸ', 'â™¨ī¸', '🚷', 'đŸš¯', 'đŸšŗ', '🚱', '🔞', 'đŸ“ĩ', '🚭', '❕', '❔', 'â€ŧī¸', 'â‰ī¸', '🔅', '🔆', 'ã€Ŋī¸', 'âš ī¸', '🚸', '🔱', 'âšœī¸', '🔰', 'â™ģī¸', '✅', 'đŸˆ¯', '💹', 'â‡ī¸', 'âœŗī¸', '❎', '🌐', '💠', 'â“‚ī¸', '🌀', '💤', 'đŸšē', 'đŸšŧ', 'đŸŽĩ', 'đŸŽļ', '➕', '➖', '➗', 'âœ–ī¸', '💲', '💱', 'â„ĸī¸', 'ÂŠī¸', 'ÂŽī¸', 'ã€°ī¸', '➰', 'âžŋ', '🔚', '🔙', '🔛', '🔝', 'âœ”ī¸', 'â˜‘ī¸', '🔈', '🔇', '🔉', '🔊', '🔔', '🔕', 'đŸ“Ŗ', 'đŸ“ĸ', '🗨', 'đŸ’Ŧ', '💭', 'đŸ—¯', 'â™ ī¸', 'â™Ŗī¸', 'â™Ĩī¸', 'â™Ļī¸', '🃏', '🎴'] export default class extends React.Component { constructor(props) { super(props) this.state = { emojis: PEOPLE_EMOJIS, emojiCategory: 'PEOPLE_EMOJIS' } } static get propTypes() { return { onEmojiSelected: PropTypes.func.isRequired, visible: PropTypes.bool } } static get defaultProps() { return { visible: true } } toggleEmojis(emoji) { switch (emoji) { case 'PEOPLE_EMOJIS': this.setState({ emojis: PEOPLE_EMOJIS, emojiCategory: 'PEOPLE_EMOJIS' }) break case 'ANIMALS_NATURE_EMOJIS': this.setState({ emojis: ANIMALS_NATURE_EMOJIS, emojiCategory: 'ANIMALS_NATURE_EMOJIS' }) break case 'FOOD_SPORTS_EMOJIS': this.setState({ emojis: FOOD_SPORTS_EMOJIS, emojiCategory: 'FOOD_SPORTS_EMOJIS' }) break case 'TRAVEL_PLACES_EMOJIS': this.setState({ emojis: TRAVEL_PLACES_EMOJIS, emojiCategory: 'TRAVEL_PLACES_EMOJIS' }) break case 'OBJECTS_EMOJIS': this.setState({ emojis: OBJECTS_EMOJIS, emojiCategory: 'OBJECTS_EMOJIS' }) break case 'SYMBOLS_FLAGS_EMOJIS': this.setState({ emojis: SYMBOLS_FLAGS_EMOJIS, emojiCategory: 'SYMBOLS_FLAGS_EMOJIS' }) break default: this.setState({ emojis: PEOPLE_EMOJIS, emojiCategory: 'PEOPLE_EMOJIS' }) } } onEmojiSelect(emoji) { this.props.onEmojiSelected(emoji) } renderTabs() { const { emojiCategory } = this.state return ( <TabWrapper> <TouchableOpacity selected={emojiCategory === 'PEOPLE_EMOJIS'} onPress={() => { this.toggleEmojis('PEOPLE_EMOJIS') }} > <EmojiTitle>😀</EmojiTitle> </TouchableOpacity> <TouchableOpacity selected={emojiCategory === 'ANIMALS_NATURE_EMOJIS'} onPress={() => { this.toggleEmojis('ANIMALS_NATURE_EMOJIS') }} > <EmojiTitle>đŸŧ</EmojiTitle> </TouchableOpacity> <TouchableOpacity selected={emojiCategory === 'FOOD_SPORTS_EMOJIS'} onPress={() => { this.toggleEmojis('FOOD_SPORTS_EMOJIS') }} > <EmojiTitle>🍏</EmojiTitle> </TouchableOpacity> <TouchableOpacity selected={emojiCategory === 'TRAVEL_PLACES_EMOJIS'} onPress={() => { this.toggleEmojis('TRAVEL_PLACES_EMOJIS') }} > <EmojiTitle>🚘</EmojiTitle> </TouchableOpacity> <TouchableOpacity selected={emojiCategory === 'OBJECTS_EMOJIS'} onPress={() => { this.toggleEmojis('OBJECTS_EMOJIS') }} > <EmojiTitle>💎</EmojiTitle> </TouchableOpacity> <TouchableOpacity selected={emojiCategory === 'SYMBOLS_FLAGS_EMOJIS'} onPress={() => { this.toggleEmojis('SYMBOLS_FLAGS_EMOJIS') }} > <EmojiTitle>â¤ī¸</EmojiTitle> </TouchableOpacity> </TabWrapper> ) } render() { const { emojis } = this.state const { visible } = this.props return ( <View style={{ opacity: visible ? 1 : 0, flex: 1, flexDirection: 'row', justifyContent: 'center', alignItems: 'stretch', padding: '10px' }} > {this.renderTabs()} <EmojiWrapper> {emojis.map((emoji, index) => ( <EmojiHighlight key={index} onPress={() => { this.onEmojiSelect(emoji) }} > <Emoji key={index}>{emoji}</Emoji> </EmojiHighlight> ))} </EmojiWrapper> </View> ) } } const Wrapper = styled.View` opacity: ${props => (props.visible ? 1 : 0)}; padding: 10px; flex: 1; flex-direction: column; ` const EmojiWrapper = styled.View` flex: 5; flex-direction: column; flex-wrap: wrap; height: 300; ` const EmojiHighlight = styled.TouchableOpacity` height: 24; ` const Emoji = styled.Text` font-size: 18; height: 24; ` const TabWrapper = styled.View` flex: 1; ` const EmojiTitle = styled.Text` font-size: 32; text-align: center; width: 44; height: 44; `