UNPKG

react-emojipicker

Version:
206 lines (186 loc) â€Ē 12.5 kB
import React, { Component } from 'react' import styled from 'styled-components' import emojione from 'emojione' import PropTypes from 'prop-types' /* 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 Component { constructor (props) { super(props) this.state = { emojis: PEOPLE_EMOJIS, emojiCategory: 'PEOPLE_EMOJIS' } } static get propTypes () { return { onEmojiSelected: PropTypes.func.isRequired, visible: PropTypes.bool, modal: PropTypes.bool } } static get defaultProps () { return { visible: true, modal: false } } 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 (e) { if(e.target.alt === undefined) { return } let emoji = { image: e.target, unicode: e.target.alt, shortname: e.target.title } this.props.onEmojiSelected(emoji) } renderTabs () { const {emojiCategory} = this.state return ( <Tabs> <Title selected={emojiCategory === 'PEOPLE_EMOJIS'} onClick={() => {this.toggleEmojis('PEOPLE_EMOJIS')}} dangerouslySetInnerHTML={{__html: emojione.unicodeToImage('😀')}} /> <Title selected={emojiCategory === 'ANIMALS_NATURE_EMOJIS'} onClick={() => {this.toggleEmojis('ANIMALS_NATURE_EMOJIS')}} dangerouslySetInnerHTML={{__html: emojione.unicodeToImage('ðŸĶŠ')}} /> <Title selected={emojiCategory === 'FOOD_SPORTS_EMOJIS'} onClick={() => {this.toggleEmojis('FOOD_SPORTS_EMOJIS')}} dangerouslySetInnerHTML={{__html: emojione.unicodeToImage('🍏')}} /> <Title selected={emojiCategory === 'TRAVEL_PLACES_EMOJIS'} onClick={() => {this.toggleEmojis('TRAVEL_PLACES_EMOJIS')}} dangerouslySetInnerHTML={{__html: emojione.unicodeToImage('🚗')}} /> <Title selected={emojiCategory === 'OBJECTS_EMOJIS'} onClick={() => {this.toggleEmojis('OBJECTS_EMOJIS')}} dangerouslySetInnerHTML={{__html: emojione.unicodeToImage('💎')}} /> <Title selected={emojiCategory === 'SYMBOLS_FLAGS_EMOJIS'} onClick={() => {this.toggleEmojis('SYMBOLS_FLAGS_EMOJIS')}} dangerouslySetInnerHTML={{__html: emojione.unicodeToImage('âĪïļ')}} /> </Tabs> ) } render() { const {emojis} = this.state const {visible, modal} = this.props return ( <Wrapper> <EmojiPickerWrapper visible={visible} modal={modal}> {this.renderTabs()} <EmojiWrapper> { emojis.map((emoji, index) => ( <Emoji className='ld-emoji' key={index} role='presentation' onClick={this.onEmojiSelect.bind(this)} dangerouslySetInnerHTML={{__html: emojione.unicodeToImage(emoji)}} /> )) } </EmojiWrapper> </EmojiPickerWrapper> </Wrapper> ) } } const Wrapper = styled.div` position: relative; ` const EmojiPickerWrapper = styled.div` position: ${props => props.modal ? 'absolute' : 'static'}; opacity: ${props => props.visible ? 1 : 0}; transition: opacity 300ms linear; margin-top: 1rem; border: 1px solid #F1F1F1; border-radius: 2px; background: white; box-shadow: 3px 3px 5px #BFBDBD; width: 340px; height: 350px; overflow-y: scroll; z-index: 100; ` const EmojiPicker = styled.div` cursor: pointer; border: 1px solid #eee; padding: 0.4rem 0.8rem; margin: 0; border-radius: 2px; &:hover { background: rgba(0, 0, 0, 0.1); } ` const EmojiWrapper = styled.div` display: flex; flex-wrap: wrap; padding: 0.8rem; padding-right: 0; border-radius: 2px; align-items: baseline; float: left; width: 75%; ` const Emoji = styled.span` cursor: pointer; display: flex; justify-content: center; align-items: center; padding: 0.21rem; img { height: 16px !important; width: 16px !important; } ` const Tabs = styled.div` flex-direction: column; float: left; width: 15%; height: 100%; border-right: 1px solid rgba(0, 0, 0, 0.1); ` const Title = styled.p` padding-left: 0.35rem; padding: 0.8rem margin: 0; cursor: pointer; img { opacity: ${props => props.selected ? '1' : '0.5'}; height: 24px !important; width: 24px !important; } `