signal-desktop/ts/state/smart/EmojiButton.tsx

55 lines
1.6 KiB
TypeScript

import { connect } from 'react-redux';
import { createSelector } from 'reselect';
import { get } from 'lodash';
import { mapDispatchToProps } from '../actions';
import { EmojiButton, Props } from '../../components/emoji/EmojiButton';
import { StateType } from '../reducer';
import { isShortNameValid } from '../../components/emoji/lib';
import { getIntl } from '../selectors/user';
const mapStateToProps = (state: StateType) => {
const { recents } = state.emojis;
return {
i18n: getIntl(state),
recentEmojis: recents.filter(isShortNameValid),
skinTone: get(state, ['items', 'skinTone'], 0),
};
};
const dispatchPropsMap = {
...mapDispatchToProps,
onSetSkinTone: (tone: number) => mapDispatchToProps.putItem('skinTone', tone),
};
type OnPickEmojiType = Props['onPickEmoji'];
type UseEmojiType = typeof mapDispatchToProps.useEmoji;
export type OwnProps = {
onPickEmoji: OnPickEmojiType;
};
const selectOnPickEmoji = createSelector(
(onPickEmoji: OnPickEmojiType) => onPickEmoji,
(_onPickEmoji: OnPickEmojiType, useEmoji: UseEmojiType) => useEmoji,
(onPickEmoji, useEmoji): OnPickEmojiType => e => {
onPickEmoji(e);
useEmoji(e.shortName);
}
);
const mergeProps = (
stateProps: ReturnType<typeof mapStateToProps>,
dispatchProps: typeof dispatchPropsMap,
ownProps: OwnProps
) => ({
...ownProps,
...stateProps,
...dispatchProps,
onPickEmoji: selectOnPickEmoji(ownProps.onPickEmoji, dispatchProps.useEmoji),
});
const smart = connect(mapStateToProps, dispatchPropsMap, mergeProps);
export const SmartEmojiButton = smart(EmojiButton);