You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

106 lines
3.1 KiB

  1. import Dropdown, { DropdownTrigger, DropdownContent } from 'react-simple-dropdown';
  2. import EmojiPicker from 'emojione-picker';
  3. import PropTypes from 'prop-types';
  4. import { defineMessages, injectIntl } from 'react-intl';
  5. const messages = defineMessages({
  6. emoji: { id: 'emoji_button.label', defaultMessage: 'Insert emoji' },
  7. emoji_search: { id: 'emoji_button.search', defaultMessage: 'Search...' },
  8. people: { id: 'emoji_button.people', defaultMessage: 'People' },
  9. nature: { id: 'emoji_button.nature', defaultMessage: 'Nature' },
  10. food: { id: 'emoji_button.food', defaultMessage: 'Food & Drink' },
  11. activity: { id: 'emoji_button.activity', defaultMessage: 'Activity' },
  12. travel: { id: 'emoji_button.travel', defaultMessage: 'Travel & Places' },
  13. objects: { id: 'emoji_button.objects', defaultMessage: 'Objects' },
  14. symbols: { id: 'emoji_button.symbols', defaultMessage: 'Symbols' },
  15. flags: { id: 'emoji_button.flags', defaultMessage: 'Flags' }
  16. });
  17. const settings = {
  18. imageType: 'png',
  19. sprites: false,
  20. imagePathPNG: '/emoji/'
  21. };
  22. const style = {
  23. position: 'absolute',
  24. right: '5px',
  25. top: '5px'
  26. };
  27. class EmojiPickerDropdown extends React.PureComponent {
  28. constructor (props, context) {
  29. super(props, context);
  30. this.setRef = this.setRef.bind(this);
  31. this.handleChange = this.handleChange.bind(this);
  32. }
  33. setRef (c) {
  34. this.dropdown = c;
  35. }
  36. handleChange (data) {
  37. this.dropdown.hide();
  38. this.props.onPickEmoji(data);
  39. }
  40. render () {
  41. const { intl } = this.props;
  42. const categories = {
  43. people: {
  44. title: intl.formatMessage(messages.people),
  45. emoji: 'smile',
  46. },
  47. nature: {
  48. title: intl.formatMessage(messages.nature),
  49. emoji: 'hamster',
  50. },
  51. food: {
  52. title: intl.formatMessage(messages.food),
  53. emoji: 'pizza',
  54. },
  55. activity: {
  56. title: intl.formatMessage(messages.activity),
  57. emoji: 'soccer',
  58. },
  59. travel: {
  60. title: intl.formatMessage(messages.travel),
  61. emoji: 'earth_americas',
  62. },
  63. objects: {
  64. title: intl.formatMessage(messages.objects),
  65. emoji: 'bulb',
  66. },
  67. symbols: {
  68. title: intl.formatMessage(messages.symbols),
  69. emoji: 'clock9',
  70. },
  71. flags: {
  72. title: intl.formatMessage(messages.flags),
  73. emoji: 'flag_gb',
  74. }
  75. }
  76. return (
  77. <Dropdown ref={this.setRef} style={style}>
  78. <DropdownTrigger className='emoji-button' title={intl.formatMessage(messages.emoji)} style={{ fontSize: `24px`, width: `24px`, lineHeight: `24px`, display: 'block', marginLeft: '2px' }}>
  79. <img draggable="false" className="emojione" alt="🙂" src="/emoji/1f602.svg" />
  80. </DropdownTrigger>
  81. <DropdownContent className='dropdown__left light'>
  82. <EmojiPicker emojione={settings} onChange={this.handleChange} searchPlaceholder={intl.formatMessage(messages.emoji_search)} categories={categories} search={true} />
  83. </DropdownContent>
  84. </Dropdown>
  85. );
  86. }
  87. }
  88. EmojiPickerDropdown.propTypes = {
  89. intl: PropTypes.object.isRequired,
  90. onPickEmoji: PropTypes.func.isRequired
  91. };
  92. export default injectIntl(EmojiPickerDropdown);