diff options
Diffstat (limited to 'app/javascript/flavours/glitch/features/compose')
-rw-r--r-- | app/javascript/flavours/glitch/features/compose/components/action_bar.jsx (renamed from app/javascript/flavours/glitch/features/compose/components/action_bar.js) | 7 | ||||
-rw-r--r-- | app/javascript/flavours/glitch/features/compose/components/autosuggest_account.jsx (renamed from app/javascript/flavours/glitch/features/compose/components/autosuggest_account.js) | 0 | ||||
-rw-r--r-- | app/javascript/flavours/glitch/features/compose/components/character_counter.jsx (renamed from app/javascript/flavours/glitch/features/compose/components/character_counter.js) | 0 | ||||
-rw-r--r-- | app/javascript/flavours/glitch/features/compose/components/compose_form.jsx (renamed from app/javascript/flavours/glitch/features/compose/components/compose_form.js) | 51 | ||||
-rw-r--r-- | app/javascript/flavours/glitch/features/compose/components/dropdown.jsx (renamed from app/javascript/flavours/glitch/features/compose/components/dropdown.js) | 22 | ||||
-rw-r--r-- | app/javascript/flavours/glitch/features/compose/components/dropdown_menu.jsx (renamed from app/javascript/flavours/glitch/features/compose/components/dropdown_menu.js) | 16 | ||||
-rw-r--r-- | app/javascript/flavours/glitch/features/compose/components/emoji_picker_dropdown.jsx (renamed from app/javascript/flavours/glitch/features/compose/components/emoji_picker_dropdown.js) | 46 | ||||
-rw-r--r-- | app/javascript/flavours/glitch/features/compose/components/header.jsx (renamed from app/javascript/flavours/glitch/features/compose/components/header.js) | 15 | ||||
-rw-r--r-- | app/javascript/flavours/glitch/features/compose/components/language_dropdown.jsx (renamed from app/javascript/flavours/glitch/features/compose/components/language_dropdown.js) | 37 | ||||
-rw-r--r-- | app/javascript/flavours/glitch/features/compose/components/navigation_bar.jsx (renamed from app/javascript/flavours/glitch/features/compose/components/navigation_bar.js) | 0 | ||||
-rw-r--r-- | app/javascript/flavours/glitch/features/compose/components/options.jsx (renamed from app/javascript/flavours/glitch/features/compose/components/options.js) | 18 | ||||
-rw-r--r-- | app/javascript/flavours/glitch/features/compose/components/poll_form.jsx (renamed from app/javascript/flavours/glitch/features/compose/components/poll_form.js) | 25 | ||||
-rw-r--r-- | app/javascript/flavours/glitch/features/compose/components/privacy_dropdown.jsx (renamed from app/javascript/flavours/glitch/features/compose/components/privacy_dropdown.js) | 3 | ||||
-rw-r--r-- | app/javascript/flavours/glitch/features/compose/components/publisher.jsx (renamed from app/javascript/flavours/glitch/features/compose/components/publisher.js) | 6 | ||||
-rw-r--r-- | app/javascript/flavours/glitch/features/compose/components/reply_indicator.jsx (renamed from app/javascript/flavours/glitch/features/compose/components/reply_indicator.js) | 5 | ||||
-rw-r--r-- | app/javascript/flavours/glitch/features/compose/components/search.jsx (renamed from app/javascript/flavours/glitch/features/compose/components/search.js) | 19 | ||||
-rw-r--r-- | app/javascript/flavours/glitch/features/compose/components/search_results.jsx (renamed from app/javascript/flavours/glitch/features/compose/components/search_results.js) | 8 | ||||
-rw-r--r-- | app/javascript/flavours/glitch/features/compose/components/text_icon_button.jsx (renamed from app/javascript/flavours/glitch/features/compose/components/text_icon_button.js) | 0 | ||||
-rw-r--r-- | app/javascript/flavours/glitch/features/compose/components/textarea_icons.jsx (renamed from app/javascript/flavours/glitch/features/compose/components/textarea_icons.js) | 6 | ||||
-rw-r--r-- | app/javascript/flavours/glitch/features/compose/components/upload.jsx (renamed from app/javascript/flavours/glitch/features/compose/components/upload.js) | 21 | ||||
-rw-r--r-- | app/javascript/flavours/glitch/features/compose/components/upload_form.jsx (renamed from app/javascript/flavours/glitch/features/compose/components/upload_form.js) | 1 | ||||
-rw-r--r-- | app/javascript/flavours/glitch/features/compose/components/upload_progress.jsx (renamed from app/javascript/flavours/glitch/features/compose/components/upload_progress.js) | 0 | ||||
-rw-r--r-- | app/javascript/flavours/glitch/features/compose/components/warning.jsx (renamed from app/javascript/flavours/glitch/features/compose/components/warning.js) | 0 | ||||
-rw-r--r-- | app/javascript/flavours/glitch/features/compose/containers/compose_form_container.js | 35 | ||||
-rw-r--r-- | app/javascript/flavours/glitch/features/compose/containers/options_container.js | 2 | ||||
-rw-r--r-- | app/javascript/flavours/glitch/features/compose/containers/poll_form_container.js | 6 | ||||
-rw-r--r-- | app/javascript/flavours/glitch/features/compose/containers/sensitive_button_container.jsx (renamed from app/javascript/flavours/glitch/features/compose/containers/sensitive_button_container.js) | 0 | ||||
-rw-r--r-- | app/javascript/flavours/glitch/features/compose/containers/upload_container.js | 3 | ||||
-rw-r--r-- | app/javascript/flavours/glitch/features/compose/containers/warning_container.jsx (renamed from app/javascript/flavours/glitch/features/compose/containers/warning_container.js) | 6 | ||||
-rw-r--r-- | app/javascript/flavours/glitch/features/compose/index.jsx (renamed from app/javascript/flavours/glitch/features/compose/index.js) | 8 | ||||
-rw-r--r-- | app/javascript/flavours/glitch/features/compose/util/counter.js | 4 |
31 files changed, 212 insertions, 158 deletions
diff --git a/app/javascript/flavours/glitch/features/compose/components/action_bar.js b/app/javascript/flavours/glitch/features/compose/components/action_bar.jsx index 267c0ba69..af1f02efc 100644 --- a/app/javascript/flavours/glitch/features/compose/components/action_bar.js +++ b/app/javascript/flavours/glitch/features/compose/components/action_bar.jsx @@ -12,6 +12,7 @@ const messages = defineMessages({ follow_requests: { id: 'navigation_bar.follow_requests', defaultMessage: 'Follow requests' }, favourites: { id: 'navigation_bar.favourites', defaultMessage: 'Favourites' }, lists: { id: 'navigation_bar.lists', defaultMessage: 'Lists' }, + followed_tags: { id: 'navigation_bar.followed_tags', defaultMessage: 'Followed hashtags' }, blocks: { id: 'navigation_bar.blocks', defaultMessage: 'Blocked users' }, domain_blocks: { id: 'navigation_bar.domain_blocks', defaultMessage: 'Hidden domains' }, mutes: { id: 'navigation_bar.mutes', defaultMessage: 'Muted users' }, @@ -20,7 +21,6 @@ const messages = defineMessages({ bookmarks: { id: 'navigation_bar.bookmarks', defaultMessage: 'Bookmarks' }, }); -export default @injectIntl class ActionBar extends React.PureComponent { static propTypes = { @@ -31,7 +31,7 @@ class ActionBar extends React.PureComponent { handleLogout = () => { this.props.onLogout(); - } + }; render () { const { intl } = this.props; @@ -46,6 +46,7 @@ class ActionBar extends React.PureComponent { menu.push({ text: intl.formatMessage(messages.favourites), to: '/favourites' }); menu.push({ text: intl.formatMessage(messages.bookmarks), to: '/bookmarks' }); menu.push({ text: intl.formatMessage(messages.lists), to: '/lists' }); + menu.push({ text: intl.formatMessage(messages.followed_tags), to: '/followed_tags' }); menu.push(null); menu.push({ text: intl.formatMessage(messages.mutes), to: '/mutes' }); menu.push({ text: intl.formatMessage(messages.blocks), to: '/blocks' }); @@ -64,3 +65,5 @@ class ActionBar extends React.PureComponent { } } + +export default injectIntl(ActionBar); diff --git a/app/javascript/flavours/glitch/features/compose/components/autosuggest_account.js b/app/javascript/flavours/glitch/features/compose/components/autosuggest_account.jsx index fb9bb5035..fb9bb5035 100644 --- a/app/javascript/flavours/glitch/features/compose/components/autosuggest_account.js +++ b/app/javascript/flavours/glitch/features/compose/components/autosuggest_account.jsx diff --git a/app/javascript/flavours/glitch/features/compose/components/character_counter.js b/app/javascript/flavours/glitch/features/compose/components/character_counter.jsx index 0ecfc9141..0ecfc9141 100644 --- a/app/javascript/flavours/glitch/features/compose/components/character_counter.js +++ b/app/javascript/flavours/glitch/features/compose/components/character_counter.jsx diff --git a/app/javascript/flavours/glitch/features/compose/components/compose_form.js b/app/javascript/flavours/glitch/features/compose/components/compose_form.jsx index 0462c7c4b..973a17a1a 100644 --- a/app/javascript/flavours/glitch/features/compose/components/compose_form.js +++ b/app/javascript/flavours/glitch/features/compose/components/compose_form.jsx @@ -21,14 +21,17 @@ import { length } from 'stringz'; const messages = defineMessages({ placeholder: { id: 'compose_form.placeholder', defaultMessage: 'What is on your mind?' }, - missingDescriptionMessage: { id: 'confirmations.missing_media_description.message', - defaultMessage: 'At least one media attachment is lacking a description. Consider describing all media attachments for the visually impaired before sending your toot.' }, - missingDescriptionConfirm: { id: 'confirmations.missing_media_description.confirm', - defaultMessage: 'Send anyway' }, + missingDescriptionMessage: { + id: 'confirmations.missing_media_description.message', + defaultMessage: 'At least one media attachment is lacking a description. Consider describing all media attachments for the visually impaired before sending your toot.', + }, + missingDescriptionConfirm: { + id: 'confirmations.missing_media_description.confirm', + defaultMessage: 'Send anyway', + }, spoiler_placeholder: { id: 'compose_form.spoiler_placeholder', defaultMessage: 'Write your warning here' }, }); -export default @injectIntl class ComposeForm extends ImmutablePureComponent { static contextTypes = { @@ -61,6 +64,7 @@ class ComposeForm extends ImmutablePureComponent { anyMedia: PropTypes.bool, isInReply: PropTypes.bool, singleColumn: PropTypes.bool, + lang: PropTypes.string, advancedOptions: ImmutablePropTypes.map, layout: PropTypes.string, @@ -82,22 +86,22 @@ class ComposeForm extends ImmutablePureComponent { handleChange = (e) => { this.props.onChange(e.target.value); - } + }; getFulltextForCharacterCounting = () => { return [ this.props.spoiler? this.props.spoilerText: '', countableText(this.props.text), - this.props.advancedOptions && this.props.advancedOptions.get('do_not_federate') ? ' 👁️' : '' + this.props.advancedOptions && this.props.advancedOptions.get('do_not_federate') ? ' 👁️' : '', ].join(''); - } + }; canSubmit = () => { const { isSubmitting, isChangingUpload, isUploading, anyMedia } = this.props; const fulltext = this.getFulltextForCharacterCounting(); return !(isSubmitting || isUploading || isChangingUpload || length(fulltext) > maxChars || (!fulltext.trim().length && !anyMedia)); - } + }; handleSubmit = (overriddenVisibility = null) => { const { @@ -128,7 +132,7 @@ class ComposeForm extends ImmutablePureComponent { } onSubmit(this.context.router ? this.context.router.history : null); } - } + }; // Changes the text value of the spoiler. handleChangeSpoiler = ({ target: { value } }) => { @@ -136,7 +140,7 @@ class ComposeForm extends ImmutablePureComponent { if (onChangeSpoilerText) { onChangeSpoilerText(value); } - } + }; setRef = c => { this.composeForm = c; @@ -149,7 +153,7 @@ class ComposeForm extends ImmutablePureComponent { if (onPickEmoji) { onPickEmoji(selectionStart, data); } - } + }; // Handles the secondary submit button. handleSecondarySubmit = () => { @@ -157,16 +161,16 @@ class ComposeForm extends ImmutablePureComponent { sideArm, } = this.props; this.handleSubmit(sideArm === 'none' ? null : sideArm); - } + }; // Selects a suggestion from the autofill. onSuggestionSelected = (tokenStart, token, value) => { this.props.onSuggestionSelected(tokenStart, token, value, ['text']); - } + }; onSpoilerSuggestionSelected = (tokenStart, token, value) => { this.props.onSuggestionSelected(tokenStart, token, value, ['spoiler_text']); - } + }; handleKeyDown = (e) => { if (e.keyCode === 13 && (e.ctrlKey || e.metaKey)) { @@ -176,21 +180,21 @@ class ComposeForm extends ImmutablePureComponent { if (e.keyCode == 13 && e.altKey) { this.handleSecondarySubmit(); } - } + }; // Sets a reference to the textarea. setAutosuggestTextarea = (textareaComponent) => { if (textareaComponent) { this.textarea = textareaComponent.textarea; } - } + }; // Sets a reference to the CW field. handleRefSpoilerText = (spoilerComponent) => { if (spoilerComponent) { this.spoilerText = spoilerComponent.input; } - } + }; handleFocus = () => { if (this.composeForm && !this.props.singleColumn) { @@ -199,7 +203,7 @@ class ComposeForm extends ImmutablePureComponent { this.composeForm.scrollIntoView(); } } - } + }; componentDidMount () { this._updateFocusAndSelection({ }); @@ -216,7 +220,7 @@ class ComposeForm extends ImmutablePureComponent { // - Replying to more than one user, selects any usernames past // the first; this provides a convenient shortcut to drop // everyone else from the conversation. - _updateFocusAndSelection = (prevProps) => { + _updateFocusAndSelection = (prevProps) => { const { textarea, spoilerText, @@ -270,7 +274,7 @@ class ComposeForm extends ImmutablePureComponent { } } } - } + }; render () { @@ -325,7 +329,9 @@ class ComposeForm extends ImmutablePureComponent { searchTokens={[':']} id='glitch.composer.spoiler.input' className='spoiler-input__input' + lang={this.props.lang} autoFocus={false} + spellCheck /> </div> @@ -343,6 +349,7 @@ class ComposeForm extends ImmutablePureComponent { onSuggestionSelected={this.onSuggestionSelected} onPaste={onPaste} autoFocus={!showSearch && !isMobile(window.innerWidth, layout)} + lang={this.props.lang} > <EmojiPickerDropdown onPickEmoji={handleEmojiPick} /> <TextareaIcons advancedOptions={advancedOptions} /> @@ -381,3 +388,5 @@ class ComposeForm extends ImmutablePureComponent { } } + +export default injectIntl(ComposeForm); diff --git a/app/javascript/flavours/glitch/features/compose/components/dropdown.js b/app/javascript/flavours/glitch/features/compose/components/dropdown.jsx index d98b311d9..fe4ab36f5 100644 --- a/app/javascript/flavours/glitch/features/compose/components/dropdown.js +++ b/app/javascript/flavours/glitch/features/compose/components/dropdown.jsx @@ -64,7 +64,7 @@ export default class ComposerOptionsDropdown extends React.PureComponent { } this.setState({ open: !this.state.open, openedViaKeyboard: type !== 'click' }); } - } + }; handleKeyDown = (e) => { switch (e.key) { @@ -72,13 +72,13 @@ export default class ComposerOptionsDropdown extends React.PureComponent { this.handleClose(); break; } - } + }; handleMouseDown = () => { if (!this.state.open) { this.activeElement = document.activeElement; } - } + }; handleButtonKeyDown = (e) => { switch(e.key) { @@ -87,7 +87,7 @@ export default class ComposerOptionsDropdown extends React.PureComponent { this.handleMouseDown(); break; } - } + }; handleKeyPress = (e) => { switch(e.key) { @@ -98,14 +98,14 @@ export default class ComposerOptionsDropdown extends React.PureComponent { e.preventDefault(); break; } - } + }; handleClose = () => { if (this.state.open && this.activeElement) { this.activeElement.focus({ preventScroll: true }); } this.setState({ open: false }); - } + }; handleItemClick = (e) => { const { @@ -151,22 +151,22 @@ export default class ComposerOptionsDropdown extends React.PureComponent { ...rest, active: value && name === value, name, - }) + }), ), }; - } + }; setTargetRef = c => { this.target = c; - } + }; findTarget = () => { return this.target; - } + }; handleOverlayEnter = (state) => { this.setState({ placement: state.placement }); - } + }; // Rendering. render () { diff --git a/app/javascript/flavours/glitch/features/compose/components/dropdown_menu.js b/app/javascript/flavours/glitch/features/compose/components/dropdown_menu.jsx index c4895dfd0..1ccccad31 100644 --- a/app/javascript/flavours/glitch/features/compose/components/dropdown_menu.js +++ b/app/javascript/flavours/glitch/features/compose/components/dropdown_menu.jsx @@ -44,12 +44,12 @@ export default class ComposerOptionsDropdownContent extends React.PureComponent if (this.node && !this.node.contains(e.target)) { this.props.onClose(); } - } + }; // Stores our node in `this.node`. setRef = (node) => { this.node = node; - } + }; // On mounting, we add our listeners. componentDidMount () { @@ -84,7 +84,7 @@ export default class ComposerOptionsDropdownContent extends React.PureComponent onClose(); } onChange(name); - } + }; // Handle changes differently whether the dropdown is a list of options or actions handleChange = (name) => { @@ -93,7 +93,7 @@ export default class ComposerOptionsDropdownContent extends React.PureComponent } else { this.setState({ value: name }); } - } + }; handleKeyDown = (e) => { const index = Number(e.currentTarget.getAttribute('data-index')); @@ -135,11 +135,11 @@ export default class ComposerOptionsDropdownContent extends React.PureComponent e.preventDefault(); e.stopPropagation(); } - } + }; setFocusRef = c => { this.focusedItem = c; - } + }; renderItem = (item, i) => { const { name, icon, meta, text } = item; @@ -169,7 +169,7 @@ export default class ComposerOptionsDropdownContent extends React.PureComponent onClick={this.handleClick} onKeyDown={this.handleKeyDown} role='option' - tabIndex='0' + tabIndex={0} key={name} data-index={i} ref={active ? this.setFocusRef : null} @@ -177,7 +177,7 @@ export default class ComposerOptionsDropdownContent extends React.PureComponent {contents} </div> ); - } + }; // Rendering. render () { diff --git a/app/javascript/flavours/glitch/features/compose/components/emoji_picker_dropdown.js b/app/javascript/flavours/glitch/features/compose/components/emoji_picker_dropdown.jsx index 38c735551..1b8991f00 100644 --- a/app/javascript/flavours/glitch/features/compose/components/emoji_picker_dropdown.js +++ b/app/javascript/flavours/glitch/features/compose/components/emoji_picker_dropdown.jsx @@ -58,7 +58,7 @@ class ModifierPickerMenu extends React.PureComponent { handleClick = e => { this.props.onSelect(e.currentTarget.getAttribute('data-index') * 1); - } + }; componentWillReceiveProps (nextProps) { if (nextProps.active) { @@ -76,7 +76,7 @@ class ModifierPickerMenu extends React.PureComponent { if (this.node && !this.node.contains(e.target)) { this.props.onClose(); } - } + }; attachListeners () { document.addEventListener('click', this.handleDocumentClick, false); @@ -90,7 +90,7 @@ class ModifierPickerMenu extends React.PureComponent { setRef = c => { this.node = c; - } + }; render () { const { active } = this.props; @@ -125,12 +125,12 @@ class ModifierPicker extends React.PureComponent { } else { this.props.onOpen(); } - } + }; handleSelect = modifier => { this.props.onChange(modifier); this.props.onClose(); - } + }; render () { const { active, modifier } = this.props; @@ -145,8 +145,7 @@ class ModifierPicker extends React.PureComponent { } -@injectIntl -class EmojiPickerMenu extends React.PureComponent { +class EmojiPickerMenuImpl extends React.PureComponent { static propTypes = { custom_emojis: ImmutablePropTypes.list, @@ -175,7 +174,7 @@ class EmojiPickerMenu extends React.PureComponent { if (this.node && !this.node.contains(e.target)) { this.props.onClose(); } - } + }; componentDidMount () { document.addEventListener('click', this.handleDocumentClick, false); @@ -199,7 +198,7 @@ class EmojiPickerMenu extends React.PureComponent { setRef = c => { this.node = c; - } + }; getI18n = () => { const { intl } = this.props; @@ -220,7 +219,7 @@ class EmojiPickerMenu extends React.PureComponent { custom: intl.formatMessage(messages.custom), }, }; - } + }; handleClick = (emoji, event) => { if (!emoji.native) { @@ -230,19 +229,19 @@ class EmojiPickerMenu extends React.PureComponent { this.props.onClose(); } this.props.onPick(emoji); - } + }; handleModifierOpen = () => { this.setState({ modifierOpen: true }); - } + }; handleModifierClose = () => { this.setState({ modifierOpen: false }); - } + }; handleModifierChange = modifier => { this.props.onSkinTone(modifier); - } + }; render () { const { loading, style, intl, custom_emojis, skinTone, frequentlyUsedEmojis } = this.props; @@ -307,7 +306,8 @@ class EmojiPickerMenu extends React.PureComponent { } -export default @injectIntl +const EmojiPickerMenu = injectIntl(EmojiPickerMenuImpl); + class EmojiPickerDropdown extends React.PureComponent { static propTypes = { @@ -327,7 +327,7 @@ class EmojiPickerDropdown extends React.PureComponent { setRef = (c) => { this.dropdown = c; - } + }; onShowDropdown = () => { this.setState({ active: true }); @@ -344,11 +344,11 @@ class EmojiPickerDropdown extends React.PureComponent { this.setState({ loading: false, active: false }); }); } - } + }; onHideDropdown = () => { this.setState({ active: false }); - } + }; onToggle = (e) => { if (!this.state.loading && (!e.key || e.key === 'Enter')) { @@ -358,21 +358,21 @@ class EmojiPickerDropdown extends React.PureComponent { this.onShowDropdown(e); } } - } + }; handleKeyDown = e => { if (e.key === 'Escape') { this.onHideDropdown(); } - } + }; setTargetRef = c => { this.target = c; - } + }; findTarget = () => { return this.target; - } + }; render () { const { intl, onPickEmoji, onSkinTone, skinTone, frequentlyUsedEmojis, button } = this.props; @@ -411,3 +411,5 @@ class EmojiPickerDropdown extends React.PureComponent { } } + +export default injectIntl(EmojiPickerDropdown); diff --git a/app/javascript/flavours/glitch/features/compose/components/header.js b/app/javascript/flavours/glitch/features/compose/components/header.jsx index 7ecb573ab..764fcec5e 100644 --- a/app/javascript/flavours/glitch/features/compose/components/header.js +++ b/app/javascript/flavours/glitch/features/compose/components/header.jsx @@ -45,8 +45,8 @@ const messages = defineMessages({ }, }); -export default @injectIntl class Header extends ImmutablePureComponent { + static propTypes = { columns: ImmutablePropTypes.list, unreadNotifications: PropTypes.number, @@ -63,7 +63,7 @@ class Header extends ImmutablePureComponent { this.props.onLogout(); return false; - } + }; render () { const { intl, columns, unreadNotifications, showNotificationsBadge, onSettingsClick } = this.props; @@ -71,8 +71,8 @@ class Header extends ImmutablePureComponent { // Only renders the component if the column isn't being shown. const renderForColumn = conditionalRender.bind(null, columnId => !columns || !columns.some( - column => column.get('id') === columnId - ) + column => column.get('id') === columnId, + ), ); // The result. @@ -125,10 +125,13 @@ class Header extends ImmutablePureComponent { <a aria-label={intl.formatMessage(messages.logout)} onClick={this.handleLogoutClick} - href={ signOutLink } + href={signOutLink} title={intl.formatMessage(messages.logout)} ><Icon id='sign-out' /></a> </nav> ); - }; + } + } + +export default injectIntl(Header); diff --git a/app/javascript/flavours/glitch/features/compose/components/language_dropdown.js b/app/javascript/flavours/glitch/features/compose/components/language_dropdown.jsx index 3a1fa0226..05614de01 100644 --- a/app/javascript/flavours/glitch/features/compose/components/language_dropdown.js +++ b/app/javascript/flavours/glitch/features/compose/components/language_dropdown.jsx @@ -40,7 +40,7 @@ class LanguageDropdownMenu extends React.PureComponent { if (this.node && !this.node.contains(e.target)) { this.props.onClose(); } - } + }; componentDidMount () { document.addEventListener('click', this.handleDocumentClick, false); @@ -63,15 +63,15 @@ class LanguageDropdownMenu extends React.PureComponent { setRef = c => { this.node = c; - } + }; setListRef = c => { this.listNode = c; - } + }; handleSearchChange = ({ target }) => { this.setState({ searchValue: target.value }); - } + }; search () { const { languages, value, frequentlyUsedLanguages } = this.props; @@ -122,7 +122,7 @@ class LanguageDropdownMenu extends React.PureComponent { this.props.onClose(); this.props.onChange(value); - } + }; handleKeyDown = e => { const { onClose } = this.props; @@ -163,7 +163,7 @@ class LanguageDropdownMenu extends React.PureComponent { e.preventDefault(); e.stopPropagation(); } - } + }; handleSearchKeyDown = e => { const { onChange, onClose } = this.props; @@ -199,21 +199,21 @@ class LanguageDropdownMenu extends React.PureComponent { break; } - } + }; handleClear = () => { this.setState({ searchValue: '' }); - } + }; renderItem = lang => { const { value } = this.props; return ( - <div key={lang[0]} role='option' tabIndex='0' data-index={lang[0]} className={classNames('language-dropdown__dropdown__results__item', { active: lang[0] === value })} aria-selected={lang[0] === value} onClick={this.handleClick} onKeyDown={this.handleKeyDown}> - <span className='language-dropdown__dropdown__results__item__native-name'>{lang[2]}</span> <span className='language-dropdown__dropdown__results__item__common-name'>({lang[1]})</span> + <div key={lang[0]} role='option' tabIndex={0} data-index={lang[0]} className={classNames('language-dropdown__dropdown__results__item', { active: lang[0] === value })} aria-selected={lang[0] === value} onClick={this.handleClick} onKeyDown={this.handleKeyDown}> + <span className='language-dropdown__dropdown__results__item__native-name' lang={lang[0]}>{lang[2]}</span> <span className='language-dropdown__dropdown__results__item__common-name'>({lang[1]})</span> </div> ); - } + }; render () { const { intl } = this.props; @@ -237,7 +237,6 @@ class LanguageDropdownMenu extends React.PureComponent { } -export default @injectIntl class LanguageDropdown extends React.PureComponent { static propTypes = { @@ -259,7 +258,7 @@ class LanguageDropdown extends React.PureComponent { } this.setState({ open: !this.state.open }); - } + }; handleClose = () => { const { value, onClose } = this.props; @@ -270,24 +269,24 @@ class LanguageDropdown extends React.PureComponent { this.setState({ open: false }); onClose(value); - } + }; handleChange = value => { const { onChange } = this.props; onChange(value); - } + }; setTargetRef = c => { this.target = c; - } + }; findTarget = () => { return this.target; - } + }; handleOverlayEnter = (state) => { this.setState({ placement: state.placement }); - } + }; render () { const { value, intl, frequentlyUsedLanguages } = this.props; @@ -325,3 +324,5 @@ class LanguageDropdown extends React.PureComponent { } } + +export default injectIntl(LanguageDropdown); diff --git a/app/javascript/flavours/glitch/features/compose/components/navigation_bar.js b/app/javascript/flavours/glitch/features/compose/components/navigation_bar.jsx index 1a68f1e12..1a68f1e12 100644 --- a/app/javascript/flavours/glitch/features/compose/components/navigation_bar.js +++ b/app/javascript/flavours/glitch/features/compose/components/navigation_bar.jsx diff --git a/app/javascript/flavours/glitch/features/compose/components/options.js b/app/javascript/flavours/glitch/features/compose/components/options.jsx index b5276c371..19ead2f21 100644 --- a/app/javascript/flavours/glitch/features/compose/components/options.js +++ b/app/javascript/flavours/glitch/features/compose/components/options.jsx @@ -83,8 +83,11 @@ const messages = defineMessages({ }, }); -@connect((state, { name }) => ({ checked: state.getIn(['compose', 'advanced_options', name]) })) -class ToggleOption extends ImmutablePureComponent { +const mapStateToProps = (state, { name }) => ({ + checked: state.getIn(['compose', 'advanced_options', name]), +}); + +class ToggleOptionImpl extends ImmutablePureComponent { static propTypes = { name: PropTypes.string.isRequired, @@ -113,7 +116,8 @@ class ToggleOption extends ImmutablePureComponent { } -export default @injectIntl +const ToggleOption = connect(mapStateToProps)(ToggleOptionImpl); + class ComposerOptions extends ImmutablePureComponent { static propTypes = { @@ -144,7 +148,7 @@ class ComposerOptions extends ImmutablePureComponent { if (files.length && onUpload) { onUpload(files); } - } + }; // Handles attachment clicks. handleClickAttach = (name) => { @@ -164,12 +168,12 @@ class ComposerOptions extends ImmutablePureComponent { } return; } - } + }; // Handles a ref to the file input. handleRefFileElement = (fileElement) => { this.fileElement = fileElement; - } + }; renderToggleItemContents = (item) => { const { onChangeAdvancedOption } = this.props; @@ -315,3 +319,5 @@ class ComposerOptions extends ImmutablePureComponent { } } + +export default injectIntl(ComposerOptions); diff --git a/app/javascript/flavours/glitch/features/compose/components/poll_form.js b/app/javascript/flavours/glitch/features/compose/components/poll_form.jsx index afb5da097..cbd53c4d5 100644 --- a/app/javascript/flavours/glitch/features/compose/components/poll_form.js +++ b/app/javascript/flavours/glitch/features/compose/components/poll_form.jsx @@ -21,11 +21,11 @@ const messages = defineMessages({ days: { id: 'intervals.full.days', defaultMessage: '{number, plural, one {# day} other {# days}}' }, }); -@injectIntl -class Option extends React.PureComponent { +class OptionIntl extends React.PureComponent { static propTypes = { title: PropTypes.string.isRequired, + lang: PropTypes.string, index: PropTypes.number.isRequired, isPollMultiple: PropTypes.bool, autoFocus: PropTypes.bool, @@ -48,18 +48,18 @@ class Option extends React.PureComponent { onSuggestionsClearRequested = () => { this.props.onClearSuggestions(); - } + }; onSuggestionsFetchRequested = (token) => { this.props.onFetchSuggestions(token); - } + }; onSuggestionSelected = (tokenStart, token, value) => { this.props.onSuggestionSelected(tokenStart, token, value, ['poll', 'options', this.props.index]); - } + }; render () { - const { isPollMultiple, title, index, autoFocus, intl } = this.props; + const { isPollMultiple, title, lang, index, autoFocus, intl } = this.props; return ( <li> @@ -70,6 +70,8 @@ class Option extends React.PureComponent { placeholder={intl.formatMessage(messages.option_placeholder, { number: index + 1 })} maxLength={pollLimits.max_option_chars} value={title} + lang={lang} + spellCheck onChange={this.handleOptionTitleChange} suggestions={this.props.suggestions} onSuggestionsFetchRequested={this.onSuggestionsFetchRequested} @@ -89,12 +91,13 @@ class Option extends React.PureComponent { } -export default -@injectIntl +const Option = injectIntl(OptionIntl); + class PollForm extends ImmutablePureComponent { static propTypes = { options: ImmutablePropTypes.list, + lang: PropTypes.string, expiresIn: PropTypes.number, isMultiple: PropTypes.bool, onChangeOption: PropTypes.func.isRequired, @@ -121,7 +124,7 @@ class PollForm extends ImmutablePureComponent { }; render () { - const { options, expiresIn, isMultiple, onChangeOption, onRemoveOption, intl, ...other } = this.props; + const { options, lang, expiresIn, isMultiple, onChangeOption, onRemoveOption, intl, ...other } = this.props; if (!options) { return null; @@ -132,7 +135,7 @@ class PollForm extends ImmutablePureComponent { return ( <div className='compose-form__poll-wrapper'> <ul> - {options.map((title, i) => <Option title={title} key={i} index={i} onChange={onChangeOption} onRemove={onRemoveOption} isPollMultiple={isMultiple} autoFocus={i === autoFocusIndex} {...other} />)} + {options.map((title, i) => <Option title={title} lang={lang} key={i} index={i} onChange={onChangeOption} onRemove={onRemoveOption} isPollMultiple={isMultiple} autoFocus={i === autoFocusIndex} {...other} />)} {options.size < pollLimits.max_options && ( <label className='poll__text editable'> <span className={classNames('poll__input')} style={{ opacity: 0 }} /> @@ -164,3 +167,5 @@ class PollForm extends ImmutablePureComponent { } } + +export default injectIntl(PollForm); diff --git a/app/javascript/flavours/glitch/features/compose/components/privacy_dropdown.js b/app/javascript/flavours/glitch/features/compose/components/privacy_dropdown.jsx index 02cf72289..4bfbb5b8c 100644 --- a/app/javascript/flavours/glitch/features/compose/components/privacy_dropdown.js +++ b/app/javascript/flavours/glitch/features/compose/components/privacy_dropdown.jsx @@ -16,7 +16,6 @@ const messages = defineMessages({ change_privacy: { id: 'privacy.change', defaultMessage: 'Adjust status privacy' }, }); -export default @injectIntl class PrivacyDropdown extends React.PureComponent { static propTypes = { @@ -86,3 +85,5 @@ class PrivacyDropdown extends React.PureComponent { } } + +export default injectIntl(PrivacyDropdown); diff --git a/app/javascript/flavours/glitch/features/compose/components/publisher.js b/app/javascript/flavours/glitch/features/compose/components/publisher.jsx index 9d53b7ee3..3128303c6 100644 --- a/app/javascript/flavours/glitch/features/compose/components/publisher.js +++ b/app/javascript/flavours/glitch/features/compose/components/publisher.jsx @@ -26,7 +26,6 @@ const messages = defineMessages({ saveChanges: { id: 'compose_form.save_changes', defaultMessage: 'Save changes' }, }); -export default @injectIntl class Publisher extends ImmutablePureComponent { static propTypes = { @@ -94,5 +93,8 @@ class Publisher extends ImmutablePureComponent { </div> </div> ); - }; + } + } + +export default injectIntl(Publisher); diff --git a/app/javascript/flavours/glitch/features/compose/components/reply_indicator.js b/app/javascript/flavours/glitch/features/compose/components/reply_indicator.jsx index 7ad9e2b64..179d85ac3 100644 --- a/app/javascript/flavours/glitch/features/compose/components/reply_indicator.js +++ b/app/javascript/flavours/glitch/features/compose/components/reply_indicator.jsx @@ -19,7 +19,6 @@ const messages = defineMessages({ }); -export default @injectIntl class ReplyIndicator extends ImmutablePureComponent { static propTypes = { @@ -33,7 +32,7 @@ class ReplyIndicator extends ImmutablePureComponent { if (onCancel) { onCancel(); } - } + }; // Rendering. render () { @@ -80,3 +79,5 @@ class ReplyIndicator extends ImmutablePureComponent { } } + +export default injectIntl(ReplyIndicator); diff --git a/app/javascript/flavours/glitch/features/compose/components/search.js b/app/javascript/flavours/glitch/features/compose/components/search.jsx index e5874de75..cb6afca8d 100644 --- a/app/javascript/flavours/glitch/features/compose/components/search.js +++ b/app/javascript/flavours/glitch/features/compose/components/search.jsx @@ -45,7 +45,6 @@ class SearchPopout extends React.PureComponent { } // The component. -export default @injectIntl class Search extends React.PureComponent { static contextTypes = { @@ -71,14 +70,14 @@ class Search extends React.PureComponent { setRef = c => { this.searchForm = c; - } + }; handleChange = (e) => { const { onChange } = this.props; if (onChange) { onChange(e.target.value); } - } + }; handleClear = (e) => { const { @@ -90,11 +89,11 @@ class Search extends React.PureComponent { if (onClear && (submitted || value && value.length)) { onClear(); } - } + }; handleBlur = () => { this.setState({ expanded: false }); - } + }; handleFocus = () => { this.setState({ expanded: true }); @@ -106,7 +105,7 @@ class Search extends React.PureComponent { this.searchForm.scrollIntoView(); } } - } + }; handleKeyUp = (e) => { const { onSubmit } = this.props; @@ -121,11 +120,11 @@ class Search extends React.PureComponent { case 'Escape': focusRoot(); } - } + }; findTarget = () => { return this.searchForm; - } + }; render () { const { intl, value, submitted } = this.props; @@ -148,7 +147,7 @@ class Search extends React.PureComponent { onBlur={this.handleBlur} /> - <div role='button' tabIndex='0' className='search__icon' onClick={this.handleClear}> + <div role='button' tabIndex={0} className='search__icon' onClick={this.handleClear}> <Icon id='search' className={hasValue ? '' : 'active'} /> <Icon id='times-circle' className={hasValue ? 'active' : ''} /> </div> @@ -166,3 +165,5 @@ class Search extends React.PureComponent { } } + +export default injectIntl(Search); diff --git a/app/javascript/flavours/glitch/features/compose/components/search_results.js b/app/javascript/flavours/glitch/features/compose/components/search_results.jsx index c2178702c..bf009d13a 100644 --- a/app/javascript/flavours/glitch/features/compose/components/search_results.js +++ b/app/javascript/flavours/glitch/features/compose/components/search_results.jsx @@ -14,7 +14,6 @@ const messages = defineMessages({ dismissSuggestion: { id: 'suggestions.dismiss', defaultMessage: 'Dismiss suggestion' }, }); -export default @injectIntl class SearchResults extends ImmutablePureComponent { static propTypes = { @@ -103,7 +102,7 @@ class SearchResults extends ImmutablePureComponent { <section className='search-results__section'> <h5><Icon id='quote-right' fixedWidth /><FormattedMessage id='search_results.statuses' defaultMessage='Posts' /></h5> - {results.get('statuses').map(statusId => <StatusContainer id={statusId} key={statusId}/>)} + {results.get('statuses').map(statusId => <StatusContainer id={statusId} key={statusId} />)} {results.get('statuses').size >= 5 && <LoadMore visible onClick={this.handleLoadMoreStatuses} />} </section> @@ -136,5 +135,8 @@ class SearchResults extends ImmutablePureComponent { {hashtags} </div> ); - }; + } + } + +export default injectIntl(SearchResults); diff --git a/app/javascript/flavours/glitch/features/compose/components/text_icon_button.js b/app/javascript/flavours/glitch/features/compose/components/text_icon_button.jsx index a35bd4ff5..a35bd4ff5 100644 --- a/app/javascript/flavours/glitch/features/compose/components/text_icon_button.js +++ b/app/javascript/flavours/glitch/features/compose/components/text_icon_button.jsx diff --git a/app/javascript/flavours/glitch/features/compose/components/textarea_icons.js b/app/javascript/flavours/glitch/features/compose/components/textarea_icons.jsx index 25c2443b1..73281fc74 100644 --- a/app/javascript/flavours/glitch/features/compose/components/textarea_icons.js +++ b/app/javascript/flavours/glitch/features/compose/components/textarea_icons.jsx @@ -27,7 +27,6 @@ const iconMap = [ ['threaded_mode', 'comments', messages.threadedMode], ]; -export default @injectIntl class TextareaIcons extends ImmutablePureComponent { static propTypes = { @@ -51,9 +50,12 @@ class TextareaIcons extends ImmutablePureComponent { id={icon} /> </span> - ) : null + ) : null, ) : null} </div> ); } + } + +export default injectIntl(TextareaIcons); diff --git a/app/javascript/flavours/glitch/features/compose/components/upload.js b/app/javascript/flavours/glitch/features/compose/components/upload.jsx index 6528bbc84..7d5784561 100644 --- a/app/javascript/flavours/glitch/features/compose/components/upload.js +++ b/app/javascript/flavours/glitch/features/compose/components/upload.jsx @@ -23,33 +23,38 @@ export default class Upload extends ImmutablePureComponent { handleUndoClick = e => { e.stopPropagation(); this.props.onUndo(this.props.media.get('id')); - } + }; handleFocalPointClick = e => { e.stopPropagation(); this.props.onOpenFocalPoint(this.props.media.get('id')); - } + }; render () { const { media } = this.props; + + if (!media) { + return null; + } + const focusX = media.getIn(['meta', 'focus', 'x']); const focusY = media.getIn(['meta', 'focus', 'y']); const x = ((focusX / 2) + .5) * 100; const y = ((focusY / -2) + .5) * 100; return ( - <div className='compose-form__upload' tabIndex='0' role='button'> - <Motion defaultStyle={{ scale: 0.8 }} style={{ scale: spring(1, { stiffness: 180, damping: 12, }) }}> + <div className='compose-form__upload' tabIndex={0} role='button'> + <Motion defaultStyle={{ scale: 0.8 }} style={{ scale: spring(1, { stiffness: 180, damping: 12 }) }}> {({ scale }) => ( <div className='compose-form__upload-thumbnail' style={{ transform: `scale(${scale})`, backgroundImage: `url(${media.get('preview_url')})`, backgroundPosition: `${x}% ${y}%` }}> <div className='compose-form__upload__actions'> - <button className='icon-button' onClick={this.handleUndoClick}><Icon id='times' /> <FormattedMessage id='upload_form.undo' defaultMessage='Delete' /></button> - {!!media.get('unattached') && (<button className='icon-button' onClick={this.handleFocalPointClick}><Icon id='pencil' /> <FormattedMessage id='upload_form.edit' defaultMessage='Edit' /></button>)} + <button type='button' className='icon-button' onClick={this.handleUndoClick}><Icon id='times' /> <FormattedMessage id='upload_form.undo' defaultMessage='Delete' /></button> + <button type='button' className='icon-button' onClick={this.handleFocalPointClick}><Icon id='pencil' /> <FormattedMessage id='upload_form.edit' defaultMessage='Edit' /></button> </div> - {(media.get('description') || '').length === 0 && !!media.get('unattached') && ( + {(media.get('description') || '').length === 0 && ( <div className='compose-form__upload__warning'> - <button className='icon-button' onClick={this.handleFocalPointClick}><Icon id='info-circle' /> <FormattedMessage id='upload_form.description_missing' defaultMessage='No description added' /></button> + <button type='button' className='icon-button' onClick={this.handleFocalPointClick}><Icon id='info-circle' /> <FormattedMessage id='upload_form.description_missing' defaultMessage='No description added' /></button> </div> )} </div> diff --git a/app/javascript/flavours/glitch/features/compose/components/upload_form.js b/app/javascript/flavours/glitch/features/compose/components/upload_form.jsx index 7ebbac963..f2e7fe7a2 100644 --- a/app/javascript/flavours/glitch/features/compose/components/upload_form.js +++ b/app/javascript/flavours/glitch/features/compose/components/upload_form.jsx @@ -6,6 +6,7 @@ import UploadContainer from '../containers/upload_container'; import SensitiveButtonContainer from '../containers/sensitive_button_container'; export default class UploadForm extends ImmutablePureComponent { + static propTypes = { mediaIds: ImmutablePropTypes.list.isRequired, }; diff --git a/app/javascript/flavours/glitch/features/compose/components/upload_progress.js b/app/javascript/flavours/glitch/features/compose/components/upload_progress.jsx index 39ac31053..39ac31053 100644 --- a/app/javascript/flavours/glitch/features/compose/components/upload_progress.js +++ b/app/javascript/flavours/glitch/features/compose/components/upload_progress.jsx diff --git a/app/javascript/flavours/glitch/features/compose/components/warning.js b/app/javascript/flavours/glitch/features/compose/components/warning.jsx index 803b7f86a..803b7f86a 100644 --- a/app/javascript/flavours/glitch/features/compose/components/warning.js +++ b/app/javascript/flavours/glitch/features/compose/components/warning.jsx diff --git a/app/javascript/flavours/glitch/features/compose/containers/compose_form_container.js b/app/javascript/flavours/glitch/features/compose/containers/compose_form_container.js index d12c98c01..ddcdb367a 100644 --- a/app/javascript/flavours/glitch/features/compose/containers/compose_form_container.js +++ b/app/javascript/flavours/glitch/features/compose/containers/compose_form_container.js @@ -21,12 +21,18 @@ import { changeLocalSetting } from 'flavours/glitch/actions/local_settings'; import { privacyPreference } from 'flavours/glitch/utils/privacy_preference'; const messages = defineMessages({ - missingDescriptionMessage: { id: 'confirmations.missing_media_description.message', - defaultMessage: 'At least one media attachment is lacking a description. Consider describing all media attachments for the visually impaired before sending your toot.' }, - missingDescriptionConfirm: { id: 'confirmations.missing_media_description.confirm', - defaultMessage: 'Send anyway' }, - missingDescriptionEdit: { id: 'confirmations.missing_media_description.edit', - defaultMessage: 'Edit media' }, + missingDescriptionMessage: { + id: 'confirmations.missing_media_description.message', + defaultMessage: 'At least one media attachment is lacking a description. Consider describing all media attachments for the visually impaired before sending your toot.', + }, + missingDescriptionConfirm: { + id: 'confirmations.missing_media_description.confirm', + defaultMessage: 'Send anyway', + }, + missingDescriptionEdit: { + id: 'confirmations.missing_media_description.edit', + defaultMessage: 'Edit media', + }, }); // State mapping. @@ -38,12 +44,12 @@ function mapStateToProps (state) { const sideArmRestrictedPrivacy = replyPrivacy ? privacyPreference(replyPrivacy, sideArmBasePrivacy) : null; let sideArmPrivacy = null; switch (state.getIn(['local_settings', 'side_arm_reply_mode'])) { - case 'copy': - sideArmPrivacy = replyPrivacy; - break; - case 'restrict': - sideArmPrivacy = sideArmRestrictedPrivacy; - break; + case 'copy': + sideArmPrivacy = replyPrivacy; + break; + case 'restrict': + sideArmPrivacy = sideArmRestrictedPrivacy; + break; } sideArmPrivacy = sideArmPrivacy || sideArmBasePrivacy; return { @@ -70,8 +76,9 @@ function mapStateToProps (state) { mediaDescriptionConfirmation: state.getIn(['local_settings', 'confirm_missing_media_description']), preselectOnReply: state.getIn(['local_settings', 'preselect_on_reply']), isInReply: state.getIn(['compose', 'in_reply_to']) !== null, + lang: state.getIn(['compose', 'language']), }; -}; +} // Dispatch mapping. const mapDispatchToProps = (dispatch, { intl }) => ({ @@ -123,7 +130,7 @@ const mapDispatchToProps = (dispatch, { intl }) => ({ onConfirm: () => { if (overriddenVisibility) { dispatch(changeComposeVisibility(overriddenVisibility)); - }; + } dispatch(submitCompose(routerHistory)); }, secondary: intl.formatMessage(messages.missingDescriptionEdit), diff --git a/app/javascript/flavours/glitch/features/compose/containers/options_container.js b/app/javascript/flavours/glitch/features/compose/containers/options_container.js index 5de9f5419..19a90ac8b 100644 --- a/app/javascript/flavours/glitch/features/compose/containers/options_container.js +++ b/app/javascript/flavours/glitch/features/compose/containers/options_container.js @@ -23,7 +23,7 @@ function mapStateToProps (state) { showContentTypeChoice: state.getIn(['local_settings', 'show_content_type_choice']), contentType: state.getIn(['compose', 'content_type']), }; -}; +} const mapDispatchToProps = (dispatch) => ({ diff --git a/app/javascript/flavours/glitch/features/compose/containers/poll_form_container.js b/app/javascript/flavours/glitch/features/compose/containers/poll_form_container.js index e87e58771..14038b3e8 100644 --- a/app/javascript/flavours/glitch/features/compose/containers/poll_form_container.js +++ b/app/javascript/flavours/glitch/features/compose/containers/poll_form_container.js @@ -1,7 +1,10 @@ import { connect } from 'react-redux'; import PollForm from '../components/poll_form'; -import { addPollOption, removePollOption, changePollOption, changePollSettings } from 'flavours/glitch/actions/compose'; import { + addPollOption, + removePollOption, + changePollOption, + changePollSettings, clearComposeSuggestions, fetchComposeSuggestions, selectComposeSuggestion, @@ -10,6 +13,7 @@ import { const mapStateToProps = state => ({ suggestions: state.getIn(['compose', 'suggestions']), options: state.getIn(['compose', 'poll', 'options']), + lang: state.getIn(['compose', 'language']), expiresIn: state.getIn(['compose', 'poll', 'expires_in']), isMultiple: state.getIn(['compose', 'poll', 'multiple']), }); diff --git a/app/javascript/flavours/glitch/features/compose/containers/sensitive_button_container.js b/app/javascript/flavours/glitch/features/compose/containers/sensitive_button_container.jsx index 9c23d3f47..9c23d3f47 100644 --- a/app/javascript/flavours/glitch/features/compose/containers/sensitive_button_container.js +++ b/app/javascript/flavours/glitch/features/compose/containers/sensitive_button_container.jsx diff --git a/app/javascript/flavours/glitch/features/compose/containers/upload_container.js b/app/javascript/flavours/glitch/features/compose/containers/upload_container.js index f3ca4ce7b..2189c870b 100644 --- a/app/javascript/flavours/glitch/features/compose/containers/upload_container.js +++ b/app/javascript/flavours/glitch/features/compose/containers/upload_container.js @@ -1,7 +1,6 @@ import { connect } from 'react-redux'; import Upload from '../components/upload'; -import { undoUploadCompose, initMediaEditModal } from 'flavours/glitch/actions/compose'; -import { submitCompose } from 'flavours/glitch/actions/compose'; +import { undoUploadCompose, initMediaEditModal, submitCompose } from 'flavours/glitch/actions/compose'; const mapStateToProps = (state, { id }) => ({ media: state.getIn(['compose', 'media_attachments']).find(item => item.get('id') === id), diff --git a/app/javascript/flavours/glitch/features/compose/containers/warning_container.js b/app/javascript/flavours/glitch/features/compose/containers/warning_container.jsx index b2ed40b82..5b48c45e4 100644 --- a/app/javascript/flavours/glitch/features/compose/containers/warning_container.js +++ b/app/javascript/flavours/glitch/features/compose/containers/warning_container.jsx @@ -8,7 +8,7 @@ import { profileLink, termsLink } from 'flavours/glitch/utils/backend_links'; const buildHashtagRE = () => { try { - const HASHTAG_SEPARATORS = "_\\u00b7\\u200c"; + const HASHTAG_SEPARATORS = '_\\u00b7\\u200c'; const ALPHA = '\\p{L}\\p{M}'; const WORD = '\\p{L}\\p{M}\\p{N}\\p{Pc}'; return new RegExp( @@ -22,10 +22,10 @@ const buildHashtagRE = () => { '[' + WORD + '_]*' + '[' + ALPHA + ']' + '[' + WORD + '_]*' + - '))', 'iu' + '))', 'iu', ); } catch { - return /(?:^|[^\/\)\w])#(\w*[a-zA-Z·]\w*)/i; + return /(?:^|[^/)\w])#(\w*[a-zA-Z·]\w*)/i; } }; diff --git a/app/javascript/flavours/glitch/features/compose/index.js b/app/javascript/flavours/glitch/features/compose/index.jsx index 8ca378672..5547a1210 100644 --- a/app/javascript/flavours/glitch/features/compose/index.js +++ b/app/javascript/flavours/glitch/features/compose/index.jsx @@ -4,7 +4,7 @@ import NavigationContainer from './containers/navigation_container'; import PropTypes from 'prop-types'; import ImmutablePropTypes from 'react-immutable-proptypes'; import { connect } from 'react-redux'; -import { mountCompose, unmountCompose } from 'flavours/glitch/actions/compose'; +import { mountCompose, unmountCompose, cycleElefriendCompose } from 'flavours/glitch/actions/compose'; import { injectIntl, defineMessages } from 'react-intl'; import classNames from 'classnames'; import SearchContainer from './containers/search_container'; @@ -12,7 +12,6 @@ import Motion from '../ui/util/optional_motion'; import spring from 'react-motion/lib/spring'; import SearchResultsContainer from './containers/search_results_container'; import { me, mascot } from 'flavours/glitch/initial_state'; -import { cycleElefriendCompose } from 'flavours/glitch/actions/compose'; import HeaderContainer from './containers/header_container'; import Column from 'flavours/glitch/components/column'; import { Helmet } from 'react-helmet'; @@ -40,9 +39,8 @@ const mapDispatchToProps = (dispatch, { intl }) => ({ }, }); -export default @connect(mapStateToProps, mapDispatchToProps) -@injectIntl class Compose extends React.PureComponent { + static propTypes = { multiColumn: PropTypes.bool, showSearch: PropTypes.bool, @@ -114,3 +112,5 @@ class Compose extends React.PureComponent { } } + +export default connect(mapStateToProps, mapDispatchToProps)(injectIntl(Compose)); diff --git a/app/javascript/flavours/glitch/features/compose/util/counter.js b/app/javascript/flavours/glitch/features/compose/util/counter.js index 7aa9e87b1..ec2431096 100644 --- a/app/javascript/flavours/glitch/features/compose/util/counter.js +++ b/app/javascript/flavours/glitch/features/compose/util/counter.js @@ -5,5 +5,5 @@ const urlPlaceholder = '$2xxxxxxxxxxxxxxxxxxxxxxx'; export function countableText(inputText) { return inputText .replace(urlRegex, urlPlaceholder) - .replace(/(^|[^\/\w])@(([a-z0-9_]+)@[a-z0-9\.\-]+[a-z0-9]+)/ig, '$1@$3'); -}; + .replace(/(^|[^/\w])@(([a-z0-9_]+)@[a-z0-9.-]+[a-z0-9]+)/ig, '$1@$3'); +} |