// Package imports. import PropTypes from 'prop-types'; import React from 'react'; import ImmutablePropTypes from 'react-immutable-proptypes'; import { FormattedMessage, defineMessages, injectIntl } from 'react-intl'; import spring from 'react-motion/lib/spring'; // Components. import IconButton from 'flavours/glitch/components/icon_button'; import TextIconButton from 'flavours/glitch/components/text_icon_button'; import Dropdown from './dropdown'; import ImmutablePureComponent from 'react-immutable-pure-component'; // Utils. import Motion from 'flavours/glitch/util/optional_motion'; import { pollLimits } from 'flavours/glitch/util/initial_state'; // Messages. const messages = defineMessages({ advanced_options_icon_title: { defaultMessage: 'Advanced options', id: 'advanced_options.icon_title', }, attach: { defaultMessage: 'Attach...', id: 'compose.attach', }, bbcode: { defaultMessage: 'BBCode', id: 'compose.content-type.bbcode', }, bbdown: { defaultMessage: 'BBdown', id: 'compose.content-type.bbdown', }, local_short: { defaultMessage: 'Community', id: 'privacy.local.short' }, local_long: { defaultMessage: 'Post to community timeline', id: 'privacy.local.long' }, change_privacy: { defaultMessage: 'Adjust status privacy', id: 'privacy.change', }, content_type: { defaultMessage: 'Content type', id: 'content-type.change', }, direct_long: { defaultMessage: 'Post to mentioned users only', id: 'privacy.direct.long', }, direct_short: { defaultMessage: 'Direct', id: 'privacy.direct.short', }, doodle: { defaultMessage: 'Draw something', id: 'compose.attach.doodle', }, html: { defaultMessage: 'HTML', id: 'compose.content-type.html', }, local_only_long: { defaultMessage: 'Do not post to other instances', id: 'advanced_options.local-only.long', }, local_only_short: { defaultMessage: 'Local-only', id: 'advanced_options.local-only.short', }, markdown: { defaultMessage: 'Markdown', id: 'compose.content-type.markdown', }, console: { defaultMessage: 'Console', id: 'compose.content-type.console', }, plain: { defaultMessage: 'Plain text', id: 'compose.content-type.plain', }, private_long: { defaultMessage: 'Post to followers only', id: 'privacy.private.long', }, private_short: { defaultMessage: 'Followers-only', id: 'privacy.private.short', }, public_long: { defaultMessage: 'Post to public timelines', id: 'privacy.public.long', }, public_short: { defaultMessage: 'Public', id: 'privacy.public.short', }, spoiler: { defaultMessage: 'Hide text behind warning', id: 'compose_form.spoiler', }, threaded_mode_long: { defaultMessage: 'Automatically opens a reply on posting', id: 'advanced_options.threaded_mode.long', }, threaded_mode_short: { defaultMessage: 'Threaded mode', id: 'advanced_options.threaded_mode.short', }, unlisted_long: { defaultMessage: 'Do not show in public timelines', id: 'privacy.unlisted.long', }, unlisted_short: { defaultMessage: 'Unlisted', id: 'privacy.unlisted.short', }, upload: { defaultMessage: 'Upload a file', id: 'compose.attach.upload', }, add_poll: { defaultMessage: 'Add a poll', id: 'poll_button.add_poll', }, remove_poll: { defaultMessage: 'Remove poll', id: 'poll_button.remove_poll', }, }); export default @injectIntl class ComposerOptions extends ImmutablePureComponent { static propTypes = { acceptContentTypes: PropTypes.string, advancedOptions: ImmutablePropTypes.map, disabled: PropTypes.bool, allowMedia: PropTypes.bool, hasMedia: PropTypes.bool, allowPoll: PropTypes.bool, hasPoll: PropTypes.bool, intl: PropTypes.object.isRequired, onChangeAdvancedOption: PropTypes.func, onChangeVisibility: PropTypes.func, onChangeContentType: PropTypes.func, onTogglePoll: PropTypes.func, onDoodleOpen: PropTypes.func, onModalClose: PropTypes.func, onModalOpen: PropTypes.func, onToggleSpoiler: PropTypes.func, onUpload: PropTypes.func, privacy: PropTypes.string, contentType: PropTypes.string, resetFileKey: PropTypes.number, spoiler: PropTypes.bool, showContentTypeChoice: PropTypes.bool, }; // Handles file selection. handleChangeFiles = ({ target: { files } }) => { const { onUpload } = this.props; if (files.length && onUpload) { onUpload(files); } } // Handles attachment clicks. handleClickAttach = (name) => { const { fileElement } = this; const { onDoodleOpen } = this.props; // We switch over the name of the option. switch (name) { case 'upload': if (fileElement) { fileElement.click(); } return; case 'doodle': if (onDoodleOpen) { onDoodleOpen(); } return; } } // Handles a ref to the file input. handleRefFileElement = (fileElement) => { this.fileElement = fileElement; } // Rendering. render () { const { acceptContentTypes, advancedOptions, contentType, disabled, allowMedia, hasMedia, allowPoll, hasPoll, intl, onChangeAdvancedOption, onChangeContentType, onChangeVisibility, onTogglePoll, onModalClose, onModalOpen, onToggleSpoiler, privacy, resetFileKey, spoiler, showContentTypeChoice, } = this.props; // We predefine our privacy items so that we can easily pick the // dropdown icon later. const privacyItems = { direct: { icon: 'envelope', meta: , name: 'direct', text: , }, private: { icon: 'lock', meta: , name: 'private', text: , }, public: { icon: 'globe', meta: , name: 'public', text: , }, unlisted: { icon: 'unlock', meta: , name: 'unlisted', text: , }, local: { icon: 'users', meta: , name: 'local', text: , } }; const contentTypeItems = { plain: { icon: 'file-text', name: 'text/plain', text: , }, console: { icon: 'terminal', name: 'text/console', text: , }, html: { icon: 'code', name: 'text/html', text: , }, markdown: { icon: 'hashtag', name: 'text/markdown', text: , }, xbbcode: { icon: 'thumb-tack', name: 'text/x-bbcode', text: , }, xbbcodemarkdown: { icon: 'arrow-circle-down', name: 'text/x-bbcode+markdown', text: , }, }; // The result. return (
, }, { icon: 'paint-brush', name: 'doodle', text: , }, ]} onChange={this.handleClickAttach} onModalClose={onModalClose} onModalOpen={onModalOpen} title={intl.formatMessage(messages.attach)} /> {!!pollLimits && ( )}
{showContentTypeChoice && ( )} {onToggleSpoiler && ( )} !!value)} disabled={disabled} icon='ellipsis-h' items={advancedOptions ? [ { meta: , name: 'do_not_federate', on: advancedOptions.get('do_not_federate'), text: , }, { meta: , name: 'threaded_mode', on: advancedOptions.get('threaded_mode'), text: , }, ] : null} onChange={onChangeAdvancedOption} onModalClose={onModalClose} onModalOpen={onModalOpen} title={intl.formatMessage(messages.advanced_options_icon_title)} />
); } }