1 import React
from 'react';
2 import Dropdown
, { DropdownTrigger
, DropdownContent
} from 'react-simple-dropdown';
3 import PropTypes
from 'prop-types';
4 import { defineMessages
, injectIntl
} from 'react-intl';
6 const messages
= defineMessages({
7 emoji: { id: 'emoji_button.label', defaultMessage: 'Insert emoji' },
8 emoji_search: { id: 'emoji_button.search', defaultMessage: 'Search...' },
9 people: { id: 'emoji_button.people', defaultMessage: 'People' },
10 nature: { id: 'emoji_button.nature', defaultMessage: 'Nature' },
11 food: { id: 'emoji_button.food', defaultMessage: 'Food & Drink' },
12 activity: { id: 'emoji_button.activity', defaultMessage: 'Activity' },
13 travel: { id: 'emoji_button.travel', defaultMessage: 'Travel & Places' },
14 objects: { id: 'emoji_button.objects', defaultMessage: 'Objects' },
15 symbols: { id: 'emoji_button.symbols', defaultMessage: 'Symbols' },
16 flags: { id: 'emoji_button.flags', defaultMessage: 'Flags' },
22 imagePathPNG: '/emoji/',
25 let EmojiPicker
; // load asynchronously
27 class EmojiPickerDropdown
extends React
.PureComponent
{
30 intl: PropTypes
.object
.isRequired
,
31 onPickEmoji: PropTypes
.func
.isRequired
,
43 handleChange
= (data
) => {
45 this.props
.onPickEmoji(data
);
48 onShowDropdown
= () => {
49 this.setState({active: true});
51 this.setState({loading: true});
52 import('emojione-picker').then(TheEmojiPicker
=> {
53 EmojiPicker
= TheEmojiPicker
.default;
54 this.setState({loading: false});
56 // TODO: show the user an error?
57 this.setState({loading: false});
62 onHideDropdown
= () => {
63 this.setState({active: false});
67 const { intl
} = this.props
;
71 title: intl
.formatMessage(messages
.people
),
75 title: intl
.formatMessage(messages
.nature
),
79 title: intl
.formatMessage(messages
.food
),
83 title: intl
.formatMessage(messages
.activity
),
87 title: intl
.formatMessage(messages
.travel
),
88 emoji: 'earth_americas',
91 title: intl
.formatMessage(messages
.objects
),
95 title: intl
.formatMessage(messages
.symbols
),
99 title: intl
.formatMessage(messages
.flags
),
104 const { active
, loading
} = this.state
;
107 <Dropdown ref
={this.setRef
} className
='emoji-picker__dropdown' onShow
={this.onShowDropdown
} onHide
={this.onHideDropdown
}>
108 <DropdownTrigger className
='emoji-button' title
={intl
.formatMessage(messages
.emoji
)}>
109 <img draggable
="false"
110 className
={`emojione ${active && loading ? "pulse-loading" : ''}`}
111 alt
="🙂" src
="/emoji/1f602.svg" />
113 <DropdownContent className
='dropdown__left'>
115 this.state
.active
&& !this.state
.loading
&&
116 (<EmojiPicker emojione
={settings
} onChange
={this.handleChange
} searchPlaceholder
={intl
.formatMessage(messages
.emoji_search
)} categories
={categories
} search
={true} />)
125 export default injectIntl(EmojiPickerDropdown
);