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.

57 lines
1.6 KiB

  1. import { connect } from 'react-redux';
  2. import EmojiPickerDropdown from '../components/emoji_picker_dropdown';
  3. import { changeSetting } from '../../../actions/settings';
  4. import { createSelector } from 'reselect';
  5. import { Map as ImmutableMap } from 'immutable';
  6. import { useEmoji } from '../../../actions/emojis';
  7. const perLine = 8;
  8. const lines = 2;
  9. const getFrequentlyUsedEmojis = createSelector([
  10. state => state.getIn(['settings', 'frequentlyUsedEmojis'], ImmutableMap()),
  11. ], emojiCounters => emojiCounters
  12. .keySeq()
  13. .sort((a, b) => emojiCounters.get(a) - emojiCounters.get(b))
  14. .reverse()
  15. .slice(0, perLine * lines)
  16. .toArray()
  17. );
  18. const getCustomEmojis = createSelector([
  19. state => state.get('custom_emojis'),
  20. ], emojis => emojis.sort((a, b) => {
  21. const aShort = a.get('shortcode').toLowerCase();
  22. const bShort = b.get('shortcode').toLowerCase();
  23. if (aShort < bShort) {
  24. return -1;
  25. } else if (aShort > bShort ) {
  26. return 1;
  27. } else {
  28. return 0;
  29. }
  30. }));
  31. const mapStateToProps = state => ({
  32. custom_emojis: getCustomEmojis(state),
  33. autoPlay: state.getIn(['meta', 'auto_play_gif']),
  34. skinTone: state.getIn(['settings', 'skinTone']),
  35. frequentlyUsedEmojis: getFrequentlyUsedEmojis(state),
  36. });
  37. const mapDispatchToProps = (dispatch, { onPickEmoji }) => ({
  38. onSkinTone: skinTone => {
  39. dispatch(changeSetting(['skinTone'], skinTone));
  40. },
  41. onPickEmoji: emoji => {
  42. dispatch(useEmoji(emoji));
  43. if (onPickEmoji) {
  44. onPickEmoji(emoji);
  45. }
  46. },
  47. });
  48. export default connect(mapStateToProps, mapDispatchToProps)(EmojiPickerDropdown);