The code powering m.abunchtell.com https://m.abunchtell.com
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.
 
 
 
 

115 regels
3.2 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 dropdownStyle = {
  23. position: 'absolute',
  24. right: '5px',
  25. top: '5px'
  26. };
  27. const dropdownTriggerStyle = {
  28. display: 'block',
  29. fontSize: '24px',
  30. lineHeight: '24px',
  31. marginLeft: '2px',
  32. width: '24px'
  33. }
  34. class EmojiPickerDropdown extends React.PureComponent {
  35. constructor (props, context) {
  36. super(props, context);
  37. this.setRef = this.setRef.bind(this);
  38. this.handleChange = this.handleChange.bind(this);
  39. }
  40. setRef (c) {
  41. this.dropdown = c;
  42. }
  43. handleChange (data) {
  44. this.dropdown.hide();
  45. this.props.onPickEmoji(data);
  46. }
  47. render () {
  48. const { intl } = this.props;
  49. const categories = {
  50. people: {
  51. title: intl.formatMessage(messages.people),
  52. emoji: 'smile',
  53. },
  54. nature: {
  55. title: intl.formatMessage(messages.nature),
  56. emoji: 'hamster',
  57. },
  58. food: {
  59. title: intl.formatMessage(messages.food),
  60. emoji: 'pizza',
  61. },
  62. activity: {
  63. title: intl.formatMessage(messages.activity),
  64. emoji: 'soccer',
  65. },
  66. travel: {
  67. title: intl.formatMessage(messages.travel),
  68. emoji: 'earth_americas',
  69. },
  70. objects: {
  71. title: intl.formatMessage(messages.objects),
  72. emoji: 'bulb',
  73. },
  74. symbols: {
  75. title: intl.formatMessage(messages.symbols),
  76. emoji: 'clock9',
  77. },
  78. flags: {
  79. title: intl.formatMessage(messages.flags),
  80. emoji: 'flag_gb',
  81. }
  82. }
  83. return (
  84. <Dropdown ref={this.setRef} style={dropdownStyle}>
  85. <DropdownTrigger className='emoji-button' title={intl.formatMessage(messages.emoji)} style={dropdownTriggerStyle}>
  86. <img draggable="false" className="emojione" alt="🙂" src="/emoji/1f602.svg" />
  87. </DropdownTrigger>
  88. <DropdownContent className='dropdown__left'>
  89. <EmojiPicker emojione={settings} onChange={this.handleChange} searchPlaceholder={intl.formatMessage(messages.emoji_search)} categories={categories} search={true} />
  90. </DropdownContent>
  91. </Dropdown>
  92. );
  93. }
  94. }
  95. EmojiPickerDropdown.propTypes = {
  96. intl: PropTypes.object.isRequired,
  97. onPickEmoji: PropTypes.func.isRequired
  98. };
  99. export default injectIntl(EmojiPickerDropdown);