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 emojismaster
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