mirror of https://github.com/mastodon/mastodon
				
				
				
			Track frequently used emojis in web UI (#5275)
* Track frequently used emojis in web UI * Persist emoji usage, but debounce commits to the settings API * Fix #5144 - Add tooltips to picker * Display only 2 lines of frequently used emojispull/5280/head
							parent
							
								
									0717d9b3e6
								
							
						
					
					
						commit
						488584bfc1
					
				@ -0,0 +1,14 @@
 | 
				
			|||||||
 | 
					import { saveSettings } from './settings';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					export const EMOJI_USE = 'EMOJI_USE';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					export function useEmoji(emoji) {
 | 
				
			||||||
 | 
					  return dispatch => {
 | 
				
			||||||
 | 
					    dispatch({
 | 
				
			||||||
 | 
					      type: EMOJI_USE,
 | 
				
			||||||
 | 
					      emoji,
 | 
				
			||||||
 | 
					    });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    dispatch(saveSettings());
 | 
				
			||||||
 | 
					  };
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
@ -1,17 +1,42 @@
 | 
				
			|||||||
import { connect } from 'react-redux';
 | 
					import { connect } from 'react-redux';
 | 
				
			||||||
import EmojiPickerDropdown from '../components/emoji_picker_dropdown';
 | 
					import EmojiPickerDropdown from '../components/emoji_picker_dropdown';
 | 
				
			||||||
import { changeSetting } from '../../../actions/settings';
 | 
					import { changeSetting } from '../../../actions/settings';
 | 
				
			||||||
 | 
					import { createSelector } from 'reselect';
 | 
				
			||||||
 | 
					import { Map as ImmutableMap } from 'immutable';
 | 
				
			||||||
 | 
					import { useEmoji } from '../../../actions/emojis';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const perLine = 8;
 | 
				
			||||||
 | 
					const lines   = 2;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const getFrequentlyUsedEmojis = createSelector([
 | 
				
			||||||
 | 
					  state => state.getIn(['settings', 'frequentlyUsedEmojis'], ImmutableMap()),
 | 
				
			||||||
 | 
					], emojiCounters => emojiCounters
 | 
				
			||||||
 | 
					    .keySeq()
 | 
				
			||||||
 | 
					    .sort((a, b) => emojiCounters.get(a) - emojiCounters.get(b))
 | 
				
			||||||
 | 
					    .reverse()
 | 
				
			||||||
 | 
					    .slice(0, perLine * lines)
 | 
				
			||||||
 | 
					    .toArray()
 | 
				
			||||||
 | 
					);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
const mapStateToProps = state => ({
 | 
					const mapStateToProps = state => ({
 | 
				
			||||||
  custom_emojis: state.get('custom_emojis'),
 | 
					  custom_emojis: state.get('custom_emojis'),
 | 
				
			||||||
  autoPlay: state.getIn(['meta', 'auto_play_gif']),
 | 
					  autoPlay: state.getIn(['meta', 'auto_play_gif']),
 | 
				
			||||||
  skinTone: state.getIn(['settings', 'skinTone']),
 | 
					  skinTone: state.getIn(['settings', 'skinTone']),
 | 
				
			||||||
 | 
					  frequentlyUsedEmojis: getFrequentlyUsedEmojis(state),
 | 
				
			||||||
});
 | 
					});
 | 
				
			||||||
 | 
					
 | 
				
			||||||
const mapDispatchToProps = dispatch => ({
 | 
					const mapDispatchToProps = (dispatch, { onPickEmoji }) => ({
 | 
				
			||||||
  onSkinTone: skinTone => {
 | 
					  onSkinTone: skinTone => {
 | 
				
			||||||
    dispatch(changeSetting(['skinTone'], skinTone));
 | 
					    dispatch(changeSetting(['skinTone'], skinTone));
 | 
				
			||||||
  },
 | 
					  },
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  onPickEmoji: emoji => {
 | 
				
			||||||
 | 
					    dispatch(useEmoji(emoji));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if (onPickEmoji) {
 | 
				
			||||||
 | 
					      onPickEmoji(emoji);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
});
 | 
					});
 | 
				
			||||||
 | 
					
 | 
				
			||||||
export default connect(mapStateToProps, mapDispatchToProps)(EmojiPickerDropdown);
 | 
					export default connect(mapStateToProps, mapDispatchToProps)(EmojiPickerDropdown);
 | 
				
			||||||
 | 
				
			|||||||
					Loading…
					
					
				
		Reference in New Issue