import React from 'react'; import PropTypes from 'prop-types'; import { defineMessages, injectIntl } from 'react-intl'; import { IconPicker as IconPickerAsync } from '../utils/async'; import Overlay from 'react-overlays/lib/Overlay'; import classNames from 'classnames'; import detectPassiveEvents from 'detect-passive-events'; import forkAwesomeIcons from '../forkawesome.json'; import Icon from 'soapbox/components/icon'; const messages = defineMessages({ emoji: { id: 'icon_button.label', defaultMessage: 'Select icon' }, emoji_search: { id: 'emoji_button.search', defaultMessage: 'Search...' }, emoji_not_found: { id: 'emoji_button.not_found', defaultMessage: 'No emojos!! (╯°□°)╯︵ ┻━┻' }, custom: { id: 'icon_button.icons', defaultMessage: 'Icons' }, search_results: { id: 'emoji_button.search_results', defaultMessage: 'Search results' }, }); let IconPicker; // load asynchronously const backgroundImageFn = () => ''; const listenerOptions = detectPassiveEvents.hasSupport ? { passive: true } : false; const categoriesSort = 'custom'; @injectIntl class IconPickerMenu extends React.PureComponent { static propTypes = { custom_emojis: PropTypes.object, loading: PropTypes.bool, onClose: PropTypes.func.isRequired, onPick: PropTypes.func.isRequired, style: PropTypes.object, placement: PropTypes.string, arrowOffsetLeft: PropTypes.string, arrowOffsetTop: PropTypes.string, intl: PropTypes.object.isRequired, }; static defaultProps = { style: {}, loading: true, }; state = { modifierOpen: false, placement: null, }; handleDocumentClick = e => { if (this.node && !this.node.contains(e.target)) { this.props.onClose(); } } componentDidMount() { document.addEventListener('click', this.handleDocumentClick, false); document.addEventListener('touchend', this.handleDocumentClick, listenerOptions); } componentWillUnmount() { document.removeEventListener('click', this.handleDocumentClick, false); document.removeEventListener('touchend', this.handleDocumentClick, listenerOptions); } setRef = c => { this.node = c; } getI18n = () => { const { intl } = this.props; return { search: intl.formatMessage(messages.emoji_search), notfound: intl.formatMessage(messages.emoji_not_found), categories: { search: intl.formatMessage(messages.search_results), custom: intl.formatMessage(messages.custom), }, }; } handleClick = emoji => { emoji.native = emoji.colons; this.props.onClose(); this.props.onPick(emoji); } buildIcons = (customEmojis, autoplay = false) => { const emojis = []; Object.values(customEmojis).forEach(category => { category.forEach(function(icon) { const name = icon.replace('fa fa-', ''); emojis.push({ id: icon, name, short_names: [name], emoticons: [], keywords: [name], imageUrl: '', custom: true, }); }); }); return emojis; }; render() { const { loading, style, intl, custom_emojis } = this.props; if (loading) { return
; } const title = intl.formatMessage(messages.emoji); const { modifierOpen } = this.state; return (