react-native-emojipicker
Version:
A react-native emoji picker
208 lines (186 loc) âĸ 11.3 kB
JavaScript
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;
`