1 line
No EOL
118 KiB
Text
1 line
No EOL
118 KiB
Text
{"version":3,"sources":["webpack:///app/javascript/tank/sources/git/git.pleroma.social/pleroma/mastofe/app/javascript/mastodon/components/autosuggest_emoji.js","webpack:///app/javascript/tank/sources/git/git.pleroma.social/pleroma/mastofe/app/javascript/mastodon/features/compose/components/reply_indicator.js","webpack:///app/javascript/tank/sources/git/git.pleroma.social/pleroma/mastofe/app/javascript/mastodon/features/compose/containers/reply_indicator_container.js","webpack:///app/javascript/tank/sources/git/git.pleroma.social/pleroma/mastofe/app/javascript/mastodon/features/compose/components/autosuggest_account.js","webpack:///app/javascript/tank/sources/git/git.pleroma.social/pleroma/mastofe/app/javascript/mastodon/features/compose/containers/autosuggest_account_container.js","webpack:///app/javascript/tank/sources/git/git.pleroma.social/pleroma/mastofe/app/javascript/mastodon/components/autosuggest_hashtag.js","webpack:///app/javascript/tank/sources/git/git.pleroma.social/pleroma/mastofe/app/javascript/mastodon/components/autosuggest_textarea.js","webpack:///app/javascript/tank/sources/git/git.pleroma.social/pleroma/mastofe/app/javascript/mastodon/components/autosuggest_input.js","webpack:///app/javascript/tank/sources/git/git.pleroma.social/pleroma/mastofe/app/javascript/mastodon/features/compose/components/poll_button.js","webpack:///app/javascript/tank/sources/git/git.pleroma.social/pleroma/mastofe/app/javascript/mastodon/features/compose/containers/poll_button_container.js","webpack:///app/javascript/tank/sources/git/git.pleroma.social/pleroma/mastofe/app/javascript/mastodon/features/compose/components/upload_button.js","webpack:///app/javascript/tank/sources/git/git.pleroma.social/pleroma/mastofe/app/javascript/mastodon/features/compose/containers/upload_button_container.js","webpack:///app/javascript/tank/sources/git/git.pleroma.social/pleroma/mastofe/app/javascript/mastodon/features/compose/components/text_icon_button.js","webpack:///app/javascript/tank/sources/git/git.pleroma.social/pleroma/mastofe/app/javascript/mastodon/features/compose/containers/spoiler_button_container.js","webpack:///app/javascript/tank/sources/git/git.pleroma.social/pleroma/mastofe/app/javascript/mastodon/features/compose/components/privacy_dropdown.js","webpack:///app/javascript/tank/sources/git/git.pleroma.social/pleroma/mastofe/app/javascript/mastodon/features/compose/containers/privacy_dropdown_container.js","webpack:///app/javascript/tank/sources/git/git.pleroma.social/pleroma/mastofe/app/javascript/mastodon/features/compose/components/poll_form.js","webpack:///app/javascript/tank/sources/git/git.pleroma.social/pleroma/mastofe/app/javascript/mastodon/features/compose/containers/poll_form_container.js","webpack:///app/javascript/tank/sources/git/git.pleroma.social/pleroma/mastofe/app/javascript/mastodon/features/compose/containers/upload_progress_container.js","webpack:///app/javascript/tank/sources/git/git.pleroma.social/pleroma/mastofe/app/javascript/mastodon/features/compose/components/upload.js","webpack:///app/javascript/tank/sources/git/git.pleroma.social/pleroma/mastofe/app/javascript/mastodon/features/compose/containers/upload_container.js","webpack:///app/javascript/tank/sources/git/git.pleroma.social/pleroma/mastofe/app/javascript/mastodon/features/compose/containers/sensitive_button_container.js","webpack:///app/javascript/tank/sources/git/git.pleroma.social/pleroma/mastofe/app/javascript/mastodon/features/compose/components/upload_form.js","webpack:///app/javascript/tank/sources/git/git.pleroma.social/pleroma/mastofe/app/javascript/mastodon/features/compose/containers/upload_form_container.js","webpack:///app/javascript/tank/sources/git/git.pleroma.social/pleroma/mastofe/app/javascript/mastodon/features/compose/components/warning.js","webpack:///app/javascript/tank/sources/git/git.pleroma.social/pleroma/mastofe/app/javascript/mastodon/features/compose/containers/warning_container.js","webpack:///app/javascript/tank/sources/git/git.pleroma.social/pleroma/mastofe/app/javascript/mastodon/features/compose/components/compose_form.js","webpack:///app/javascript/tank/sources/git/git.pleroma.social/pleroma/mastofe/app/javascript/mastodon/features/compose/containers/compose_form_container.js","webpack:///app/javascript/tank/sources/git/git.pleroma.social/pleroma/mastofe/app/javascript/mastodon/features/compose/containers/navigation_container.js","webpack:///app/javascript/tank/sources/git/git.pleroma.social/pleroma/mastofe/app/javascript/mastodon/features/compose/index.js"],"names":["assetHost","process","env","CDN_HOST","AutosuggestEmoji","render","url","emoji","this","props","custom","imageUrl","mapping","unicodeMapping","native","replace","filename","className","src","alt","colons","React","PureComponent","messages","defineMessages","cancel","ReplyIndicator","injectIntl","onCancel","e","button","ctrlKey","metaKey","preventDefault","context","router","history","push","status","getIn","intl","content","__html","get","style","direction","isRtl","title","formatMessage","icon","onClick","handleClick","inverted","href","handleAccountClick","account","size","dangerouslySetInnerHTML","compact","media","ImmutablePureComponent","PropTypes","object","ImmutablePropTypes","map","func","isRequired","connect","getStatus","makeGetStatus","state","id","dispatch","cancelReplyCompose","AutosuggestAccount","getAccount","makeGetAccount","AutosuggestHashtag","tag","weeklyUses","shortNumberFormat","reduce","total","day","uses","name","undefined","defaultMessage","values","count","textAtCursorMatchesToken","str","caretPosition","word","left","slice","search","right","trim","length","indexOf","toLowerCase","AutosuggestTextarea","suggestionsHidden","focused","selectedSuggestion","lastToken","tokenStart","target","value","selectionStart","token","setState","onSuggestionsFetchRequested","onSuggestionsClearRequested","onChange","suggestions","disabled","which","isComposing","key","document","querySelector","parentElement","focus","Math","min","max","stopPropagation","onSuggestionSelected","defaultPrevented","onKeyDown","onFocus","suggestion","currentTarget","getAttribute","textarea","c","clipboardData","files","onPaste","i","inner","type","role","tabIndex","data-index","classNames","selected","onMouseDown","onSuggestionClick","componentWillReceiveProps","nextProps","placeholder","onKeyUp","autoFocus","children","display","inputRef","setTextarea","onBlur","aria-autocomplete","isEmpty","renderSuggestion","string","list","bool","searchTokens","AutosuggestInput","input","maxLength","ref","setInput","arrayOf","number","ImmutableList","add_poll","remove_poll","iconStyle","height","lineHeight","PollButton","active","unavailable","_","getState","removePoll","addPoll","upload","UploadButton","acceptContentTypes","onSelectFile","fileElement","click","resetFileKey","formats","setRef","multiple","handleChange","listOf","some","m","includes","uploadCompose","width","TextIconButton","label","ariaControls","aria-label","aria-expanded","aria-controls","marked","unmarked","changeComposeSpoilerness","public_short","public_long","unlisted_short","unlisted_long","private_short","private_long","direct_short","direct_long","change_privacy","listenerOptions","detectPassiveEvents","hasSupport","passive","PrivacyDropdownMenu","mounted","node","contains","onClose","element","items","index","findIndex","item","childNodes","shiftKey","lastChild","firstChild","focusedItem","componentDidMount","addEventListener","handleDocumentClick","componentWillUnmount","removeEventListener","placement","defaultStyle","opacity","scaleX","scaleY","spring","damping","stiffness","transform","zIndex","handleKeyDown","aria-selected","setFocusRef","fixedWidth","text","meta","PrivacyDropdown","open","isUserTouching","onModalClose","onModalOpen","actions","options","option","handleModalActionClick","top","getBoundingClientRect","activeElement","innerHeight","handleClose","handleMouseDown","componentWillMount","valueOption","find","expanded","handleToggle","handleButtonKeyDown","show","isModalOpen","modalType","changeComposeVisibility","openModal","closeModal","option_placeholder","add_option","remove_option","poll_duration","switchToMultiple","switchToSingle","minutes","hours","days","Option","onRemove","onToggleMultiple","handleToggleMultiple","onClearSuggestions","onFetchSuggestions","isPollMultiple","checkbox","onKeyPress","handleCheckboxKeypress","handleOptionTitleChange","handleOptionRemove","PollForm","onAddOption","onChangeSettings","isMultiple","expiresIn","onChangeOption","onRemoveOption","other","handleAddOption","handleSelectDuration","addPollOption","removePollOption","changePollOption","changePollSettings","clearComposeSuggestions","fetchComposeSuggestions","position","accountId","path","selectComposeSuggestion","progress","UploadProgress","Upload","onUndo","onOpenFocalPoint","focusX","focusY","x","y","scale","backgroundImage","backgroundPosition","handleUndoClick","handleFocalPointClick","undoUploadCompose","onSubmit","submitCompose","SensitiveButton","checked","changeComposeSensitivity","UploadForm","mediaIds","message","Warning","APPROX_HASHTAG_RE","needsLockWarning","me","hashtagWarning","test","directMessageWarning","locked","allowedAroundShortCode","spoiler_placeholder","publish","publishLoud","ComposeForm","keyCode","handleSubmit","autosuggestTextarea","isSubmitting","isChangingUpload","isUploading","anyMedia","fulltext","spoilerText","join","maxChars","onChangeSpoilerText","composeForm","singleColumn","window","innerWidth","documentElement","clientWidth","scrollIntoView","data","needsSpace","onPickEmoji","componentDidUpdate","prevProps","selectionEnd","focusDate","preselectDate","setSelectionRange","spoiler","showSearch","disabledButton","publishText","privacy","handleChangeSpoilerText","setSpoilerText","onSpoilerSuggestionSelected","setAutosuggestTextarea","handleFocus","isMobile","handleEmojiPick","block","instanceOf","Date","changeCompose","changeComposeSpoilerText","insertEmojiCompose","logoutMessage","logoutConfirm","onLogout","confirm","onConfirm","logOut","NavigationBar","start","home_timeline","notifications","public","community","preferences","logout","compose","Compose","ownProps","columns","multiColumn","isSearchPage","changeComposing","mountCompose","unmountCompose","header","to","column","handleLogoutClick","draggable","mascot","visibility"],"mappings":"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","file":"features/compose.js","sourcesContent":["import React from 'react';\nimport PropTypes from 'prop-types';\nimport unicodeMapping from '../features/emoji/emoji_unicode_mapping_light';\n\nconst assetHost = process.env.CDN_HOST || '';\n\nexport default class AutosuggestEmoji extends React.PureComponent {\n\n static propTypes = {\n emoji: PropTypes.object.isRequired,\n };\n\n render () {\n const { emoji } = this.props;\n let url;\n\n if (emoji.custom) {\n url = emoji.imageUrl;\n } else {\n const mapping = unicodeMapping[emoji.native] || unicodeMapping[emoji.native.replace(/\\uFE0F$/, '')];\n\n if (!mapping) {\n return null;\n }\n\n url = `${assetHost}/emoji/${mapping.filename}.svg`;\n }\n\n return (\n <div className='autosuggest-emoji'>\n <img\n className='emojione'\n src={url}\n alt={emoji.native || emoji.colons}\n />\n\n {emoji.colons}\n </div>\n );\n }\n\n}\n","import React from 'react';\nimport ImmutablePropTypes from 'react-immutable-proptypes';\nimport PropTypes from 'prop-types';\nimport Avatar from '../../../components/avatar';\nimport IconButton from '../../../components/icon_button';\nimport DisplayName from '../../../components/display_name';\nimport { defineMessages, injectIntl } from 'react-intl';\nimport ImmutablePureComponent from 'react-immutable-pure-component';\nimport { isRtl } from '../../../rtl';\nimport AttachmentList from 'mastodon/components/attachment_list';\n\nconst messages = defineMessages({\n cancel: { id: 'reply_indicator.cancel', defaultMessage: 'Cancel' },\n});\n\nexport default @injectIntl\nclass ReplyIndicator extends ImmutablePureComponent {\n\n static contextTypes = {\n router: PropTypes.object,\n };\n\n static propTypes = {\n status: ImmutablePropTypes.map,\n onCancel: PropTypes.func.isRequired,\n intl: PropTypes.object.isRequired,\n };\n\n handleClick = () => {\n this.props.onCancel();\n }\n\n handleAccountClick = (e) => {\n if (e.button === 0 && !(e.ctrlKey || e.metaKey)) {\n e.preventDefault();\n this.context.router.history.push(`/accounts/${this.props.status.getIn(['account', 'id'])}`);\n }\n }\n\n render () {\n const { status, intl } = this.props;\n\n if (!status) {\n return null;\n }\n\n const content = { __html: status.get('contentHtml') };\n const style = {\n direction: isRtl(status.get('search_index')) ? 'rtl' : 'ltr',\n };\n\n return (\n <div className='reply-indicator'>\n <div className='reply-indicator__header'>\n <div className='reply-indicator__cancel'><IconButton title={intl.formatMessage(messages.cancel)} icon='times' onClick={this.handleClick} inverted /></div>\n\n <a href={status.getIn(['account', 'url'])} onClick={this.handleAccountClick} className='reply-indicator__display-name'>\n <div className='reply-indicator__display-avatar'><Avatar account={status.get('account')} size={24} /></div>\n <DisplayName account={status.get('account')} />\n </a>\n </div>\n\n <div className='reply-indicator__content' style={style} dangerouslySetInnerHTML={content} />\n\n {status.get('media_attachments').size > 0 && (\n <AttachmentList\n compact\n media={status.get('media_attachments')}\n />\n )}\n </div>\n );\n }\n\n}\n","import { connect } from 'react-redux';\nimport { cancelReplyCompose } from '../../../actions/compose';\nimport { makeGetStatus } from '../../../selectors';\nimport ReplyIndicator from '../components/reply_indicator';\n\nconst makeMapStateToProps = () => {\n const getStatus = makeGetStatus();\n\n const mapStateToProps = state => ({\n status: getStatus(state, { id: state.getIn(['compose', 'in_reply_to']) }),\n });\n\n return mapStateToProps;\n};\n\nconst mapDispatchToProps = dispatch => ({\n\n onCancel () {\n dispatch(cancelReplyCompose());\n },\n\n});\n\nexport default connect(makeMapStateToProps, mapDispatchToProps)(ReplyIndicator);\n","import React from 'react';\nimport Avatar from '../../../components/avatar';\nimport DisplayName from '../../../components/display_name';\nimport ImmutablePropTypes from 'react-immutable-proptypes';\nimport ImmutablePureComponent from 'react-immutable-pure-component';\n\nexport default class AutosuggestAccount extends ImmutablePureComponent {\n\n static propTypes = {\n account: ImmutablePropTypes.map.isRequired,\n };\n\n render () {\n const { account } = this.props;\n\n return (\n <div className='autosuggest-account' title={account.get('acct')}>\n <div className='autosuggest-account-icon'><Avatar account={account} size={18} /></div>\n <DisplayName account={account} />\n </div>\n );\n }\n\n}\n","import { connect } from 'react-redux';\nimport AutosuggestAccount from '../components/autosuggest_account';\nimport { makeGetAccount } from '../../../selectors';\n\nconst makeMapStateToProps = () => {\n const getAccount = makeGetAccount();\n\n const mapStateToProps = (state, { id }) => ({\n account: getAccount(state, id),\n });\n\n return mapStateToProps;\n};\n\nexport default connect(makeMapStateToProps)(AutosuggestAccount);\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport { shortNumberFormat } from 'mastodon/utils/numbers';\nimport { FormattedMessage } from 'react-intl';\n\nexport default class AutosuggestHashtag extends React.PureComponent {\n\n static propTypes = {\n tag: PropTypes.shape({\n name: PropTypes.string.isRequired,\n url: PropTypes.string,\n history: PropTypes.array,\n }).isRequired,\n };\n\n render () {\n const { tag } = this.props;\n const weeklyUses = tag.history && shortNumberFormat(tag.history.reduce((total, day) => total + (day.uses * 1), 0));\n\n return (\n <div className='autosuggest-hashtag'>\n <div className='autosuggest-hashtag__name'>#<strong>{tag.name}</strong></div>\n {tag.history !== undefined && <div className='autosuggest-hashtag__uses'><FormattedMessage id='autosuggest_hashtag.per_week' defaultMessage='{count} per week' values={{ count: weeklyUses }} /></div>}\n </div>\n );\n }\n\n}\n","import React from 'react';\nimport AutosuggestAccountContainer from '../features/compose/containers/autosuggest_account_container';\nimport AutosuggestEmoji from './autosuggest_emoji';\nimport AutosuggestHashtag from './autosuggest_hashtag';\nimport ImmutablePropTypes from 'react-immutable-proptypes';\nimport PropTypes from 'prop-types';\nimport { isRtl } from '../rtl';\nimport ImmutablePureComponent from 'react-immutable-pure-component';\nimport Textarea from 'react-textarea-autosize';\nimport classNames from 'classnames';\n\nconst textAtCursorMatchesToken = (str, caretPosition) => {\n let word;\n\n let left = str.slice(0, caretPosition).search(/\\S+$/);\n let right = str.slice(caretPosition).search(/\\s/);\n\n if (right < 0) {\n word = str.slice(left);\n } else {\n word = str.slice(left, right + caretPosition);\n }\n\n if (!word || word.trim().length < 3 || ['@', ':', '#'].indexOf(word[0]) === -1) {\n return [null, null];\n }\n\n word = word.trim().toLowerCase();\n\n if (word.length > 0) {\n return [left + 1, word];\n } else {\n return [null, null];\n }\n};\n\nexport default class AutosuggestTextarea extends ImmutablePureComponent {\n\n static propTypes = {\n value: PropTypes.string,\n suggestions: ImmutablePropTypes.list,\n disabled: PropTypes.bool,\n placeholder: PropTypes.string,\n onSuggestionSelected: PropTypes.func.isRequired,\n onSuggestionsClearRequested: PropTypes.func.isRequired,\n onSuggestionsFetchRequested: PropTypes.func.isRequired,\n onChange: PropTypes.func.isRequired,\n onKeyUp: PropTypes.func,\n onKeyDown: PropTypes.func,\n onPaste: PropTypes.func.isRequired,\n autoFocus: PropTypes.bool,\n };\n\n static defaultProps = {\n autoFocus: true,\n };\n\n state = {\n suggestionsHidden: true,\n focused: false,\n selectedSuggestion: 0,\n lastToken: null,\n tokenStart: 0,\n };\n\n onChange = (e) => {\n const [ tokenStart, token ] = textAtCursorMatchesToken(e.target.value, e.target.selectionStart);\n\n if (token !== null && this.state.lastToken !== token) {\n this.setState({ lastToken: token, selectedSuggestion: 0, tokenStart });\n this.props.onSuggestionsFetchRequested(token);\n } else if (token === null) {\n this.setState({ lastToken: null });\n this.props.onSuggestionsClearRequested();\n }\n\n this.props.onChange(e);\n }\n\n onKeyDown = (e) => {\n const { suggestions, disabled } = this.props;\n const { selectedSuggestion, suggestionsHidden } = this.state;\n\n if (disabled) {\n e.preventDefault();\n return;\n }\n\n if (e.which === 229 || e.isComposing) {\n // Ignore key events during text composition\n // e.key may be a name of the physical key even in this case (e.x. Safari / Chrome on Mac)\n return;\n }\n\n switch(e.key) {\n case 'Escape':\n if (suggestions.size === 0 || suggestionsHidden) {\n document.querySelector('.ui').parentElement.focus();\n } else {\n e.preventDefault();\n this.setState({ suggestionsHidden: true });\n }\n\n break;\n case 'ArrowDown':\n if (suggestions.size > 0 && !suggestionsHidden) {\n e.preventDefault();\n this.setState({ selectedSuggestion: Math.min(selectedSuggestion + 1, suggestions.size - 1) });\n }\n\n break;\n case 'ArrowUp':\n if (suggestions.size > 0 && !suggestionsHidden) {\n e.preventDefault();\n this.setState({ selectedSuggestion: Math.max(selectedSuggestion - 1, 0) });\n }\n\n break;\n case 'Enter':\n case 'Tab':\n // Select suggestion\n if (this.state.lastToken !== null && suggestions.size > 0 && !suggestionsHidden) {\n e.preventDefault();\n e.stopPropagation();\n this.props.onSuggestionSelected(this.state.tokenStart, this.state.lastToken, suggestions.get(selectedSuggestion));\n }\n\n break;\n }\n\n if (e.defaultPrevented || !this.props.onKeyDown) {\n return;\n }\n\n this.props.onKeyDown(e);\n }\n\n onBlur = () => {\n this.setState({ suggestionsHidden: true, focused: false });\n }\n\n onFocus = (e) => {\n this.setState({ focused: true });\n if (this.props.onFocus) {\n this.props.onFocus(e);\n }\n }\n\n onSuggestionClick = (e) => {\n const suggestion = this.props.suggestions.get(e.currentTarget.getAttribute('data-index'));\n e.preventDefault();\n this.props.onSuggestionSelected(this.state.tokenStart, this.state.lastToken, suggestion);\n this.textarea.focus();\n }\n\n componentWillReceiveProps (nextProps) {\n if (nextProps.suggestions !== this.props.suggestions && nextProps.suggestions.size > 0 && this.state.suggestionsHidden && this.state.focused) {\n this.setState({ suggestionsHidden: false });\n }\n }\n\n setTextarea = (c) => {\n this.textarea = c;\n }\n\n onPaste = (e) => {\n if (e.clipboardData && e.clipboardData.files.length === 1) {\n this.props.onPaste(e.clipboardData.files);\n e.preventDefault();\n }\n }\n\n renderSuggestion = (suggestion, i) => {\n const { selectedSuggestion } = this.state;\n let inner, key;\n\n if (suggestion.type === 'emoji') {\n inner = <AutosuggestEmoji emoji={suggestion} />;\n key = suggestion.id;\n } else if (suggestion.type === 'hashtag') {\n inner = <AutosuggestHashtag tag={suggestion} />;\n key = suggestion.name;\n } else if (suggestion.type === 'account') {\n inner = <AutosuggestAccountContainer id={suggestion.id} />;\n key = suggestion.id;\n }\n\n return (\n <div role='button' tabIndex='0' key={key} data-index={i} className={classNames('autosuggest-textarea__suggestions__item', { selected: i === selectedSuggestion })} onMouseDown={this.onSuggestionClick}>\n {inner}\n </div>\n );\n }\n\n render () {\n const { value, suggestions, disabled, placeholder, onKeyUp, autoFocus, children } = this.props;\n const { suggestionsHidden } = this.state;\n const style = { direction: 'ltr' };\n\n if (isRtl(value)) {\n style.direction = 'rtl';\n }\n\n return [\n <div className='compose-form__autosuggest-wrapper' key='autosuggest-wrapper'>\n <div className='autosuggest-textarea'>\n <label>\n <span style={{ display: 'none' }}>{placeholder}</span>\n\n <Textarea\n inputRef={this.setTextarea}\n className='autosuggest-textarea__textarea'\n disabled={disabled}\n placeholder={placeholder}\n autoFocus={autoFocus}\n value={value}\n onChange={this.onChange}\n onKeyDown={this.onKeyDown}\n onKeyUp={onKeyUp}\n onFocus={this.onFocus}\n onBlur={this.onBlur}\n onPaste={this.onPaste}\n style={style}\n aria-autocomplete='list'\n />\n </label>\n </div>\n {children}\n </div>,\n\n <div className='autosuggest-textarea__suggestions-wrapper' key='suggestions-wrapper'>\n <div className={`autosuggest-textarea__suggestions ${suggestionsHidden || suggestions.isEmpty() ? '' : 'autosuggest-textarea__suggestions--visible'}`}>\n {suggestions.map(this.renderSuggestion)}\n </div>\n </div>,\n ];\n }\n\n}\n","import React from 'react';\nimport AutosuggestAccountContainer from '../features/compose/containers/autosuggest_account_container';\nimport AutosuggestEmoji from './autosuggest_emoji';\nimport AutosuggestHashtag from './autosuggest_hashtag';\nimport ImmutablePropTypes from 'react-immutable-proptypes';\nimport PropTypes from 'prop-types';\nimport { isRtl } from '../rtl';\nimport ImmutablePureComponent from 'react-immutable-pure-component';\nimport classNames from 'classnames';\nimport { List as ImmutableList } from 'immutable';\n\nconst textAtCursorMatchesToken = (str, caretPosition, searchTokens) => {\n let word;\n\n let left = str.slice(0, caretPosition).search(/\\S+$/);\n let right = str.slice(caretPosition).search(/\\s/);\n\n if (right < 0) {\n word = str.slice(left);\n } else {\n word = str.slice(left, right + caretPosition);\n }\n\n if (!word || word.trim().length < 3 || searchTokens.indexOf(word[0]) === -1) {\n return [null, null];\n }\n\n word = word.trim().toLowerCase();\n\n if (word.length > 0) {\n return [left + 1, word];\n } else {\n return [null, null];\n }\n};\n\nexport default class AutosuggestInput extends ImmutablePureComponent {\n\n static propTypes = {\n value: PropTypes.string,\n suggestions: ImmutablePropTypes.list,\n disabled: PropTypes.bool,\n placeholder: PropTypes.string,\n onSuggestionSelected: PropTypes.func.isRequired,\n onSuggestionsClearRequested: PropTypes.func.isRequired,\n onSuggestionsFetchRequested: PropTypes.func.isRequired,\n onChange: PropTypes.func.isRequired,\n onKeyUp: PropTypes.func,\n onKeyDown: PropTypes.func,\n autoFocus: PropTypes.bool,\n className: PropTypes.string,\n id: PropTypes.string,\n searchTokens: PropTypes.arrayOf(PropTypes.string),\n maxLength: PropTypes.number,\n };\n\n static defaultProps = {\n autoFocus: true,\n searchTokens: ImmutableList(['@', ':', '#']),\n };\n\n state = {\n suggestionsHidden: true,\n focused: false,\n selectedSuggestion: 0,\n lastToken: null,\n tokenStart: 0,\n };\n\n onChange = (e) => {\n const [ tokenStart, token ] = textAtCursorMatchesToken(e.target.value, e.target.selectionStart, this.props.searchTokens);\n\n if (token !== null && this.state.lastToken !== token) {\n this.setState({ lastToken: token, selectedSuggestion: 0, tokenStart });\n this.props.onSuggestionsFetchRequested(token);\n } else if (token === null) {\n this.setState({ lastToken: null });\n this.props.onSuggestionsClearRequested();\n }\n\n this.props.onChange(e);\n }\n\n onKeyDown = (e) => {\n const { suggestions, disabled } = this.props;\n const { selectedSuggestion, suggestionsHidden } = this.state;\n\n if (disabled) {\n e.preventDefault();\n return;\n }\n\n if (e.which === 229 || e.isComposing) {\n // Ignore key events during text composition\n // e.key may be a name of the physical key even in this case (e.x. Safari / Chrome on Mac)\n return;\n }\n\n switch(e.key) {\n case 'Escape':\n if (suggestions.size === 0 || suggestionsHidden) {\n document.querySelector('.ui').parentElement.focus();\n } else {\n e.preventDefault();\n this.setState({ suggestionsHidden: true });\n }\n\n break;\n case 'ArrowDown':\n if (suggestions.size > 0 && !suggestionsHidden) {\n e.preventDefault();\n this.setState({ selectedSuggestion: Math.min(selectedSuggestion + 1, suggestions.size - 1) });\n }\n\n break;\n case 'ArrowUp':\n if (suggestions.size > 0 && !suggestionsHidden) {\n e.preventDefault();\n this.setState({ selectedSuggestion: Math.max(selectedSuggestion - 1, 0) });\n }\n\n break;\n case 'Enter':\n case 'Tab':\n // Select suggestion\n if (this.state.lastToken !== null && suggestions.size > 0 && !suggestionsHidden) {\n e.preventDefault();\n e.stopPropagation();\n this.props.onSuggestionSelected(this.state.tokenStart, this.state.lastToken, suggestions.get(selectedSuggestion));\n }\n\n break;\n }\n\n if (e.defaultPrevented || !this.props.onKeyDown) {\n return;\n }\n\n this.props.onKeyDown(e);\n }\n\n onBlur = () => {\n this.setState({ suggestionsHidden: true, focused: false });\n }\n\n onFocus = () => {\n this.setState({ focused: true });\n }\n\n onSuggestionClick = (e) => {\n const suggestion = this.props.suggestions.get(e.currentTarget.getAttribute('data-index'));\n e.preventDefault();\n this.props.onSuggestionSelected(this.state.tokenStart, this.state.lastToken, suggestion);\n this.input.focus();\n }\n\n componentWillReceiveProps (nextProps) {\n if (nextProps.suggestions !== this.props.suggestions && nextProps.suggestions.size > 0 && this.state.suggestionsHidden && this.state.focused) {\n this.setState({ suggestionsHidden: false });\n }\n }\n\n setInput = (c) => {\n this.input = c;\n }\n\n renderSuggestion = (suggestion, i) => {\n const { selectedSuggestion } = this.state;\n let inner, key;\n\n if (suggestion.type === 'emoji') {\n inner = <AutosuggestEmoji emoji={suggestion} />;\n key = suggestion.id;\n } else if (suggestion.type ==='hashtag') {\n inner = <AutosuggestHashtag tag={suggestion} />;\n key = suggestion.name;\n } else if (suggestion.type === 'account') {\n inner = <AutosuggestAccountContainer id={suggestion.id} />;\n key = suggestion.id;\n }\n\n return (\n <div role='button' tabIndex='0' key={key} data-index={i} className={classNames('autosuggest-textarea__suggestions__item', { selected: i === selectedSuggestion })} onMouseDown={this.onSuggestionClick}>\n {inner}\n </div>\n );\n }\n\n render () {\n const { value, suggestions, disabled, placeholder, onKeyUp, autoFocus, className, id, maxLength } = this.props;\n const { suggestionsHidden } = this.state;\n const style = { direction: 'ltr' };\n\n if (isRtl(value)) {\n style.direction = 'rtl';\n }\n\n return (\n <div className='autosuggest-input'>\n <label>\n <span style={{ display: 'none' }}>{placeholder}</span>\n\n <input\n type='text'\n ref={this.setInput}\n disabled={disabled}\n placeholder={placeholder}\n autoFocus={autoFocus}\n value={value}\n onChange={this.onChange}\n onKeyDown={this.onKeyDown}\n onKeyUp={onKeyUp}\n onFocus={this.onFocus}\n onBlur={this.onBlur}\n style={style}\n aria-autocomplete='list'\n id={id}\n className={className}\n maxLength={maxLength}\n />\n </label>\n\n <div className={`autosuggest-textarea__suggestions ${suggestionsHidden || suggestions.isEmpty() ? '' : 'autosuggest-textarea__suggestions--visible'}`}>\n {suggestions.map(this.renderSuggestion)}\n </div>\n </div>\n );\n }\n\n}\n","import React from 'react';\nimport IconButton from '../../../components/icon_button';\nimport PropTypes from 'prop-types';\nimport { defineMessages, injectIntl } from 'react-intl';\n\nconst messages = defineMessages({\n add_poll: { id: 'poll_button.add_poll', defaultMessage: 'Add a poll' },\n remove_poll: { id: 'poll_button.remove_poll', defaultMessage: 'Remove poll' },\n});\n\nconst iconStyle = {\n height: null,\n lineHeight: '27px',\n};\n\nexport default\n@injectIntl\nclass PollButton extends React.PureComponent {\n\n static propTypes = {\n disabled: PropTypes.bool,\n unavailable: PropTypes.bool,\n active: PropTypes.bool,\n onClick: PropTypes.func.isRequired,\n intl: PropTypes.object.isRequired,\n };\n\n handleClick = () => {\n this.props.onClick();\n }\n\n render () {\n const { intl, active, unavailable, disabled } = this.props;\n\n if (unavailable) {\n return null;\n }\n\n return (\n <div className='compose-form__poll-button'>\n <IconButton\n icon='tasks'\n title={intl.formatMessage(active ? messages.remove_poll : messages.add_poll)}\n disabled={disabled}\n onClick={this.handleClick}\n className={`compose-form__poll-button-icon ${active ? 'active' : ''}`}\n size={18}\n inverted\n style={iconStyle}\n />\n </div>\n );\n }\n\n}\n","import { connect } from 'react-redux';\nimport PollButton from '../components/poll_button';\nimport { addPoll, removePoll } from '../../../actions/compose';\n\nconst mapStateToProps = state => ({\n unavailable: state.getIn(['compose', 'is_uploading']) || (state.getIn(['compose', 'media_attachments']).size > 0),\n active: state.getIn(['compose', 'poll']) !== null,\n});\n\nconst mapDispatchToProps = dispatch => ({\n\n onClick () {\n dispatch((_, getState) => {\n if (getState().getIn(['compose', 'poll'])) {\n dispatch(removePoll());\n } else {\n dispatch(addPoll());\n }\n });\n },\n\n});\n\nexport default connect(mapStateToProps, mapDispatchToProps)(PollButton);\n","import React from 'react';\nimport IconButton from '../../../components/icon_button';\nimport PropTypes from 'prop-types';\nimport { defineMessages, injectIntl } from 'react-intl';\nimport { connect } from 'react-redux';\nimport ImmutablePureComponent from 'react-immutable-pure-component';\nimport ImmutablePropTypes from 'react-immutable-proptypes';\n\nconst messages = defineMessages({\n upload: { id: 'upload_button.label', defaultMessage: 'Add media ({formats})' },\n});\n\nconst SUPPORTED_FORMATS = 'JPEG, PNG, GIF, WebM, MP4, MOV, OGG, WAV, MP3, FLAC';\n\nconst makeMapStateToProps = () => {\n const mapStateToProps = state => ({\n acceptContentTypes: state.getIn(['media_attachments', 'accept_content_types']),\n });\n\n return mapStateToProps;\n};\n\nconst iconStyle = {\n height: null,\n lineHeight: '27px',\n};\n\nexport default @connect(makeMapStateToProps)\n@injectIntl\nclass UploadButton extends ImmutablePureComponent {\n\n static propTypes = {\n disabled: PropTypes.bool,\n unavailable: PropTypes.bool,\n onSelectFile: PropTypes.func.isRequired,\n style: PropTypes.object,\n resetFileKey: PropTypes.number,\n acceptContentTypes: ImmutablePropTypes.listOf(PropTypes.string).isRequired,\n intl: PropTypes.object.isRequired,\n };\n\n handleChange = (e) => {\n if (e.target.files.length > 0) {\n this.props.onSelectFile(e.target.files);\n }\n }\n\n handleClick = () => {\n this.fileElement.click();\n }\n\n setRef = (c) => {\n this.fileElement = c;\n }\n\n render () {\n const { intl, resetFileKey, unavailable, disabled, acceptContentTypes } = this.props;\n\n if (unavailable) {\n return null;\n }\n\n return (\n <div className='compose-form__upload-button'>\n <IconButton icon='paperclip' title={intl.formatMessage(messages.upload, { formats: SUPPORTED_FORMATS })} disabled={disabled} onClick={this.handleClick} className='compose-form__upload-button-icon' size={18} inverted style={iconStyle} />\n <label>\n <span style={{ display: 'none' }}>{intl.formatMessage(messages.upload, { formats: SUPPORTED_FORMATS })}</span>\n <input\n key={resetFileKey}\n ref={this.setRef}\n type='file'\n multiple\n onChange={this.handleChange}\n disabled={disabled}\n style={{ display: 'none' }}\n />\n </label>\n </div>\n );\n }\n\n}\n","import { connect } from 'react-redux';\nimport UploadButton from '../components/upload_button';\nimport { uploadCompose } from '../../../actions/compose';\n\nconst mapStateToProps = state => ({\n disabled: state.getIn(['compose', 'is_uploading']) || (state.getIn(['compose', 'media_attachments']).size + state.getIn(['compose', 'pending_media_attachments']) > 3 || state.getIn(['compose', 'media_attachments']).some(m => ['video', 'audio'].includes(m.get('type')))),\n unavailable: state.getIn(['compose', 'poll']) !== null,\n resetFileKey: state.getIn(['compose', 'resetFileKey']),\n});\n\nconst mapDispatchToProps = dispatch => ({\n\n onSelectFile (files) {\n dispatch(uploadCompose(files));\n },\n\n});\n\nexport default connect(mapStateToProps, mapDispatchToProps)(UploadButton);\n","import React from 'react';\nimport PropTypes from 'prop-types';\n\nconst iconStyle = {\n height: null,\n lineHeight: '27px',\n width: `${18 * 1.28571429}px`,\n};\n\nexport default class TextIconButton extends React.PureComponent {\n\n static propTypes = {\n label: PropTypes.string.isRequired,\n title: PropTypes.string,\n active: PropTypes.bool,\n onClick: PropTypes.func.isRequired,\n ariaControls: PropTypes.string,\n };\n\n handleClick = (e) => {\n e.preventDefault();\n this.props.onClick();\n }\n\n render () {\n const { label, title, active, ariaControls } = this.props;\n\n return (\n <button\n title={title}\n aria-label={title}\n className={`text-icon-button ${active ? 'active' : ''}`}\n aria-expanded={active}\n onClick={this.handleClick}\n aria-controls={ariaControls} style={iconStyle}\n >\n {label}\n </button>\n );\n }\n\n}\n","import { connect } from 'react-redux';\nimport TextIconButton from '../components/text_icon_button';\nimport { changeComposeSpoilerness } from '../../../actions/compose';\nimport { injectIntl, defineMessages } from 'react-intl';\n\nconst messages = defineMessages({\n marked: { id: 'compose_form.spoiler.marked', defaultMessage: 'Text is hidden behind warning' },\n unmarked: { id: 'compose_form.spoiler.unmarked', defaultMessage: 'Text is not hidden' },\n});\n\nconst mapStateToProps = (state, { intl }) => ({\n label: 'CW',\n title: intl.formatMessage(state.getIn(['compose', 'spoiler']) ? messages.marked : messages.unmarked),\n active: state.getIn(['compose', 'spoiler']),\n ariaControls: 'cw-spoiler-input',\n});\n\nconst mapDispatchToProps = dispatch => ({\n\n onClick () {\n dispatch(changeComposeSpoilerness());\n },\n\n});\n\nexport default injectIntl(connect(mapStateToProps, mapDispatchToProps)(TextIconButton));\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport { injectIntl, defineMessages } from 'react-intl';\nimport IconButton from '../../../components/icon_button';\nimport Overlay from 'react-overlays/lib/Overlay';\nimport Motion from '../../ui/util/optional_motion';\nimport spring from 'react-motion/lib/spring';\nimport detectPassiveEvents from 'detect-passive-events';\nimport classNames from 'classnames';\nimport Icon from 'mastodon/components/icon';\n\nconst messages = defineMessages({\n public_short: { id: 'privacy.public.short', defaultMessage: 'Public' },\n public_long: { id: 'privacy.public.long', defaultMessage: 'Visible for all, shown in public timelines' },\n unlisted_short: { id: 'privacy.unlisted.short', defaultMessage: 'Unlisted' },\n unlisted_long: { id: 'privacy.unlisted.long', defaultMessage: 'Visible for all, but not in public timelines' },\n private_short: { id: 'privacy.private.short', defaultMessage: 'Followers-only' },\n private_long: { id: 'privacy.private.long', defaultMessage: 'Visible for followers only' },\n direct_short: { id: 'privacy.direct.short', defaultMessage: 'Direct' },\n direct_long: { id: 'privacy.direct.long', defaultMessage: 'Visible for mentioned users only' },\n change_privacy: { id: 'privacy.change', defaultMessage: 'Adjust status privacy' },\n});\n\nconst listenerOptions = detectPassiveEvents.hasSupport ? { passive: true } : false;\n\nclass PrivacyDropdownMenu extends React.PureComponent {\n\n static propTypes = {\n style: PropTypes.object,\n items: PropTypes.array.isRequired,\n value: PropTypes.string.isRequired,\n placement: PropTypes.string.isRequired,\n onClose: PropTypes.func.isRequired,\n onChange: PropTypes.func.isRequired,\n };\n\n state = {\n mounted: false,\n };\n\n handleDocumentClick = e => {\n if (this.node && !this.node.contains(e.target)) {\n this.props.onClose();\n }\n }\n\n handleKeyDown = e => {\n const { items } = this.props;\n const value = e.currentTarget.getAttribute('data-index');\n const index = items.findIndex(item => {\n return (item.value === value);\n });\n let element;\n\n switch(e.key) {\n case 'Escape':\n this.props.onClose();\n break;\n case 'Enter':\n this.handleClick(e);\n break;\n case 'ArrowDown':\n element = this.node.childNodes[index + 1];\n if (element) {\n element.focus();\n this.props.onChange(element.getAttribute('data-index'));\n }\n break;\n case 'ArrowUp':\n element = this.node.childNodes[index - 1];\n if (element) {\n element.focus();\n this.props.onChange(element.getAttribute('data-index'));\n }\n break;\n case 'Tab':\n if (e.shiftKey) {\n element = this.node.childNodes[index - 1] || this.node.lastChild;\n } else {\n element = this.node.childNodes[index + 1] || this.node.firstChild;\n }\n if (element) {\n element.focus();\n this.props.onChange(element.getAttribute('data-index'));\n e.preventDefault();\n e.stopPropagation();\n }\n break;\n case 'Home':\n element = this.node.firstChild;\n if (element) {\n element.focus();\n this.props.onChange(element.getAttribute('data-index'));\n }\n break;\n case 'End':\n element = this.node.lastChild;\n if (element) {\n element.focus();\n this.props.onChange(element.getAttribute('data-index'));\n }\n break;\n }\n }\n\n handleClick = e => {\n const value = e.currentTarget.getAttribute('data-index');\n\n e.preventDefault();\n\n this.props.onClose();\n this.props.onChange(value);\n }\n\n componentDidMount () {\n document.addEventListener('click', this.handleDocumentClick, false);\n document.addEventListener('touchend', this.handleDocumentClick, listenerOptions);\n if (this.focusedItem) this.focusedItem.focus();\n this.setState({ mounted: true });\n }\n\n componentWillUnmount () {\n document.removeEventListener('click', this.handleDocumentClick, false);\n document.removeEventListener('touchend', this.handleDocumentClick, listenerOptions);\n }\n\n setRef = c => {\n this.node = c;\n }\n\n setFocusRef = c => {\n this.focusedItem = c;\n }\n\n render () {\n const { mounted } = this.state;\n const { style, items, placement, value } = this.props;\n\n return (\n <Motion defaultStyle={{ opacity: 0, scaleX: 0.85, scaleY: 0.75 }} style={{ opacity: spring(1, { damping: 35, stiffness: 400 }), scaleX: spring(1, { damping: 35, stiffness: 400 }), scaleY: spring(1, { damping: 35, stiffness: 400 }) }}>\n {({ opacity, scaleX, scaleY }) => (\n // It should not be transformed when mounting because the resulting\n // size will be used to determine the coordinate of the menu by\n // react-overlays\n <div className={`privacy-dropdown__dropdown ${placement}`} style={{ ...style, opacity: opacity, transform: mounted ? `scale(${scaleX}, ${scaleY})` : null, zIndex: 2 }} role='listbox' ref={this.setRef}>\n {items.map(item => (\n <div role='option' tabIndex='0' key={item.value} data-index={item.value} onKeyDown={this.handleKeyDown} onClick={this.handleClick} className={classNames('privacy-dropdown__option', { active: item.value === value })} aria-selected={item.value === value} ref={item.value === value ? this.setFocusRef : null}>\n <div className='privacy-dropdown__option__icon'>\n <Icon id={item.icon} fixedWidth />\n </div>\n\n <div className='privacy-dropdown__option__content'>\n <strong>{item.text}</strong>\n {item.meta}\n </div>\n </div>\n ))}\n </div>\n )}\n </Motion>\n );\n }\n\n}\n\nexport default @injectIntl\nclass PrivacyDropdown extends React.PureComponent {\n\n static propTypes = {\n isUserTouching: PropTypes.func,\n isModalOpen: PropTypes.bool.isRequired,\n onModalOpen: PropTypes.func,\n onModalClose: PropTypes.func,\n value: PropTypes.string.isRequired,\n onChange: PropTypes.func.isRequired,\n intl: PropTypes.object.isRequired,\n };\n\n state = {\n open: false,\n placement: 'bottom',\n };\n\n handleToggle = ({ target }) => {\n if (this.props.isUserTouching()) {\n if (this.state.open) {\n this.props.onModalClose();\n } else {\n this.props.onModalOpen({\n actions: this.options.map(option => ({ ...option, active: option.value === this.props.value })),\n onClick: this.handleModalActionClick,\n });\n }\n } else {\n const { top } = target.getBoundingClientRect();\n if (this.state.open && this.activeElement) {\n this.activeElement.focus();\n }\n this.setState({ placement: top * 2 < innerHeight ? 'bottom' : 'top' });\n this.setState({ open: !this.state.open });\n }\n }\n\n handleModalActionClick = (e) => {\n e.preventDefault();\n\n const { value } = this.options[e.currentTarget.getAttribute('data-index')];\n\n this.props.onModalClose();\n this.props.onChange(value);\n }\n\n handleKeyDown = e => {\n switch(e.key) {\n case 'Escape':\n this.handleClose();\n break;\n }\n }\n\n handleMouseDown = () => {\n if (!this.state.open) {\n this.activeElement = document.activeElement;\n }\n }\n\n handleButtonKeyDown = (e) => {\n switch(e.key) {\n case ' ':\n case 'Enter':\n this.handleMouseDown();\n break;\n }\n }\n\n handleClose = () => {\n if (this.state.open && this.activeElement) {\n this.activeElement.focus();\n }\n this.setState({ open: false });\n }\n\n handleChange = value => {\n this.props.onChange(value);\n }\n\n componentWillMount () {\n const { intl: { formatMessage } } = this.props;\n\n this.options = [\n { icon: 'globe', value: 'public', text: formatMessage(messages.public_short), meta: formatMessage(messages.public_long) },\n { icon: 'unlock', value: 'unlisted', text: formatMessage(messages.unlisted_short), meta: formatMessage(messages.unlisted_long) },\n { icon: 'lock', value: 'private', text: formatMessage(messages.private_short), meta: formatMessage(messages.private_long) },\n { icon: 'envelope', value: 'direct', text: formatMessage(messages.direct_short), meta: formatMessage(messages.direct_long) },\n ];\n }\n\n render () {\n const { value, intl } = this.props;\n const { open, placement } = this.state;\n\n const valueOption = this.options.find(item => item.value === value);\n\n return (\n <div className={classNames('privacy-dropdown', placement, { active: open })} onKeyDown={this.handleKeyDown}>\n <div className={classNames('privacy-dropdown__value', { active: this.options.indexOf(valueOption) === (placement === 'bottom' ? 0 : (this.options.length - 1)) })}>\n <IconButton\n className='privacy-dropdown__value-icon'\n icon={valueOption.icon}\n title={intl.formatMessage(messages.change_privacy)}\n size={18}\n expanded={open}\n active={open}\n inverted\n onClick={this.handleToggle}\n onMouseDown={this.handleMouseDown}\n onKeyDown={this.handleButtonKeyDown}\n style={{ height: null, lineHeight: '27px' }}\n />\n </div>\n\n <Overlay show={open} placement={placement} target={this}>\n <PrivacyDropdownMenu\n items={this.options}\n value={value}\n onClose={this.handleClose}\n onChange={this.handleChange}\n placement={placement}\n />\n </Overlay>\n </div>\n );\n }\n\n}\n","import { connect } from 'react-redux';\nimport PrivacyDropdown from '../components/privacy_dropdown';\nimport { changeComposeVisibility } from '../../../actions/compose';\nimport { openModal, closeModal } from '../../../actions/modal';\nimport { isUserTouching } from '../../../is_mobile';\n\nconst mapStateToProps = state => ({\n isModalOpen: state.get('modal').modalType === 'ACTIONS',\n value: state.getIn(['compose', 'privacy']),\n});\n\nconst mapDispatchToProps = dispatch => ({\n\n onChange (value) {\n dispatch(changeComposeVisibility(value));\n },\n\n isUserTouching,\n onModalOpen: props => dispatch(openModal('ACTIONS', props)),\n onModalClose: () => dispatch(closeModal()),\n\n});\n\nexport default connect(mapStateToProps, mapDispatchToProps)(PrivacyDropdown);\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport ImmutablePropTypes from 'react-immutable-proptypes';\nimport ImmutablePureComponent from 'react-immutable-pure-component';\nimport { defineMessages, injectIntl, FormattedMessage } from 'react-intl';\nimport IconButton from 'mastodon/components/icon_button';\nimport Icon from 'mastodon/components/icon';\nimport AutosuggestInput from 'mastodon/components/autosuggest_input';\nimport classNames from 'classnames';\n\nconst messages = defineMessages({\n option_placeholder: { id: 'compose_form.poll.option_placeholder', defaultMessage: 'Choice {number}' },\n add_option: { id: 'compose_form.poll.add_option', defaultMessage: 'Add a choice' },\n remove_option: { id: 'compose_form.poll.remove_option', defaultMessage: 'Remove this choice' },\n poll_duration: { id: 'compose_form.poll.duration', defaultMessage: 'Poll duration' },\n switchToMultiple: { id: 'compose_form.poll.switch_to_multiple', defaultMessage: 'Change poll to allow multiple choices' },\n switchToSingle: { id: 'compose_form.poll.switch_to_single', defaultMessage: 'Change poll to allow for a single choice' },\n minutes: { id: 'intervals.full.minutes', defaultMessage: '{number, plural, one {# minute} other {# minutes}}' },\n hours: { id: 'intervals.full.hours', defaultMessage: '{number, plural, one {# hour} other {# hours}}' },\n days: { id: 'intervals.full.days', defaultMessage: '{number, plural, one {# day} other {# days}}' },\n});\n\n@injectIntl\nclass Option extends React.PureComponent {\n\n static propTypes = {\n title: PropTypes.string.isRequired,\n index: PropTypes.number.isRequired,\n isPollMultiple: PropTypes.bool,\n onChange: PropTypes.func.isRequired,\n onRemove: PropTypes.func.isRequired,\n onToggleMultiple: PropTypes.func.isRequired,\n suggestions: ImmutablePropTypes.list,\n onClearSuggestions: PropTypes.func.isRequired,\n onFetchSuggestions: PropTypes.func.isRequired,\n onSuggestionSelected: PropTypes.func.isRequired,\n intl: PropTypes.object.isRequired,\n };\n\n handleOptionTitleChange = e => {\n this.props.onChange(this.props.index, e.target.value);\n };\n\n handleOptionRemove = () => {\n this.props.onRemove(this.props.index);\n };\n\n\n handleToggleMultiple = e => {\n this.props.onToggleMultiple();\n e.preventDefault();\n e.stopPropagation();\n };\n\n handleCheckboxKeypress = e => {\n if (e.key === 'Enter' || e.key === ' ') {\n this.handleToggleMultiple(e);\n }\n }\n\n onSuggestionsClearRequested = () => {\n this.props.onClearSuggestions();\n }\n\n onSuggestionsFetchRequested = (token) => {\n this.props.onFetchSuggestions(token);\n }\n\n onSuggestionSelected = (tokenStart, token, value) => {\n this.props.onSuggestionSelected(tokenStart, token, value, ['poll', 'options', this.props.index]);\n }\n\n render () {\n const { isPollMultiple, title, index, intl } = this.props;\n\n return (\n <li>\n <label className='poll__option editable'>\n <span\n className={classNames('poll__input', { checkbox: isPollMultiple })}\n onClick={this.handleToggleMultiple}\n onKeyPress={this.handleCheckboxKeypress}\n role='button'\n tabIndex='0'\n title={intl.formatMessage(isPollMultiple ? messages.switchToSingle : messages.switchToMultiple)}\n aria-label={intl.formatMessage(isPollMultiple ? messages.switchToSingle : messages.switchToMultiple)}\n />\n\n <AutosuggestInput\n placeholder={intl.formatMessage(messages.option_placeholder, { number: index + 1 })}\n maxLength={100}\n value={title}\n onChange={this.handleOptionTitleChange}\n suggestions={this.props.suggestions}\n onSuggestionsFetchRequested={this.onSuggestionsFetchRequested}\n onSuggestionsClearRequested={this.onSuggestionsClearRequested}\n onSuggestionSelected={this.onSuggestionSelected}\n searchTokens={[':']}\n />\n </label>\n\n <div className='poll__cancel'>\n <IconButton disabled={index <= 1} title={intl.formatMessage(messages.remove_option)} icon='times' onClick={this.handleOptionRemove} />\n </div>\n </li>\n );\n }\n\n}\n\nexport default\n@injectIntl\nclass PollForm extends ImmutablePureComponent {\n\n static propTypes = {\n options: ImmutablePropTypes.list,\n expiresIn: PropTypes.number,\n isMultiple: PropTypes.bool,\n onChangeOption: PropTypes.func.isRequired,\n onAddOption: PropTypes.func.isRequired,\n onRemoveOption: PropTypes.func.isRequired,\n onChangeSettings: PropTypes.func.isRequired,\n suggestions: ImmutablePropTypes.list,\n onClearSuggestions: PropTypes.func.isRequired,\n onFetchSuggestions: PropTypes.func.isRequired,\n onSuggestionSelected: PropTypes.func.isRequired,\n intl: PropTypes.object.isRequired,\n };\n\n handleAddOption = () => {\n this.props.onAddOption('');\n };\n\n handleSelectDuration = e => {\n this.props.onChangeSettings(e.target.value, this.props.isMultiple);\n };\n\n handleToggleMultiple = () => {\n this.props.onChangeSettings(this.props.expiresIn, !this.props.isMultiple);\n };\n\n render () {\n const { options, expiresIn, isMultiple, onChangeOption, onRemoveOption, intl, ...other } = this.props;\n\n if (!options) {\n return null;\n }\n\n return (\n <div className='compose-form__poll-wrapper'>\n <ul>\n {options.map((title, i) => <Option title={title} key={i} index={i} onChange={onChangeOption} onRemove={onRemoveOption} isPollMultiple={isMultiple} onToggleMultiple={this.handleToggleMultiple} {...other} />)}\n </ul>\n\n <div className='poll__footer'>\n <button disabled={options.size >= 5} className='button button-secondary' onClick={this.handleAddOption}><Icon id='plus' /> <FormattedMessage {...messages.add_option} /></button>\n\n {/* eslint-disable-next-line jsx-a11y/no-onchange */}\n <select value={expiresIn} onChange={this.handleSelectDuration}>\n <option value={300}>{intl.formatMessage(messages.minutes, { number: 5 })}</option>\n <option value={1800}>{intl.formatMessage(messages.minutes, { number: 30 })}</option>\n <option value={3600}>{intl.formatMessage(messages.hours, { number: 1 })}</option>\n <option value={21600}>{intl.formatMessage(messages.hours, { number: 6 })}</option>\n <option value={86400}>{intl.formatMessage(messages.days, { number: 1 })}</option>\n <option value={259200}>{intl.formatMessage(messages.days, { number: 3 })}</option>\n <option value={604800}>{intl.formatMessage(messages.days, { number: 7 })}</option>\n </select>\n </div>\n </div>\n );\n }\n\n}\n","import { connect } from 'react-redux';\nimport PollForm from '../components/poll_form';\nimport { addPollOption, removePollOption, changePollOption, changePollSettings } from '../../../actions/compose';\nimport {\n clearComposeSuggestions,\n fetchComposeSuggestions,\n selectComposeSuggestion,\n} from '../../../actions/compose';\n\nconst mapStateToProps = state => ({\n suggestions: state.getIn(['compose', 'suggestions']),\n options: state.getIn(['compose', 'poll', 'options']),\n expiresIn: state.getIn(['compose', 'poll', 'expires_in']),\n isMultiple: state.getIn(['compose', 'poll', 'multiple']),\n});\n\nconst mapDispatchToProps = dispatch => ({\n onAddOption(title) {\n dispatch(addPollOption(title));\n },\n\n onRemoveOption(index) {\n dispatch(removePollOption(index));\n },\n\n onChangeOption(index, title) {\n dispatch(changePollOption(index, title));\n },\n\n onChangeSettings(expiresIn, isMultiple) {\n dispatch(changePollSettings(expiresIn, isMultiple));\n },\n\n onClearSuggestions () {\n dispatch(clearComposeSuggestions());\n },\n\n onFetchSuggestions (token) {\n dispatch(fetchComposeSuggestions(token));\n },\n\n onSuggestionSelected (position, token, accountId, path) {\n dispatch(selectComposeSuggestion(position, token, accountId, path));\n },\n\n});\n\nexport default connect(mapStateToProps, mapDispatchToProps)(PollForm);\n","import { connect } from 'react-redux';\nimport UploadProgress from '../components/upload_progress';\n\nconst mapStateToProps = state => ({\n active: state.getIn(['compose', 'is_uploading']),\n progress: state.getIn(['compose', 'progress']),\n});\n\nexport default connect(mapStateToProps)(UploadProgress);\n","import React from 'react';\nimport ImmutablePropTypes from 'react-immutable-proptypes';\nimport PropTypes from 'prop-types';\nimport Motion from '../../ui/util/optional_motion';\nimport spring from 'react-motion/lib/spring';\nimport ImmutablePureComponent from 'react-immutable-pure-component';\nimport { FormattedMessage } from 'react-intl';\nimport classNames from 'classnames';\nimport Icon from 'mastodon/components/icon';\n\nexport default class Upload extends ImmutablePureComponent {\n\n static contextTypes = {\n router: PropTypes.object,\n };\n\n static propTypes = {\n media: ImmutablePropTypes.map.isRequired,\n onUndo: PropTypes.func.isRequired,\n onOpenFocalPoint: PropTypes.func.isRequired,\n };\n\n handleUndoClick = e => {\n e.stopPropagation();\n this.props.onUndo(this.props.media.get('id'));\n }\n\n handleFocalPointClick = e => {\n e.stopPropagation();\n this.props.onOpenFocalPoint(this.props.media.get('id'));\n }\n\n render () {\n const { media } = this.props;\n const focusX = media.getIn(['meta', 'focus', 'x']);\n const focusY = media.getIn(['meta', 'focus', 'y']);\n const x = ((focusX / 2) + .5) * 100;\n const y = ((focusY / -2) + .5) * 100;\n\n return (\n <div className='compose-form__upload' tabIndex='0' role='button'>\n <Motion defaultStyle={{ scale: 0.8 }} style={{ scale: spring(1, { stiffness: 180, damping: 12 }) }}>\n {({ scale }) => (\n <div className='compose-form__upload-thumbnail' style={{ transform: `scale(${scale})`, backgroundImage: `url(${media.get('preview_url')})`, backgroundPosition: `${x}% ${y}%` }}>\n <div className={classNames('compose-form__upload__actions', { active: true })}>\n <button className='icon-button' onClick={this.handleUndoClick}><Icon id='times' /> <FormattedMessage id='upload_form.undo' defaultMessage='Delete' /></button>\n <button className='icon-button' onClick={this.handleFocalPointClick}><Icon id='pencil' /> <FormattedMessage id='upload_form.edit' defaultMessage='Edit' /></button>\n </div>\n </div>\n )}\n </Motion>\n </div>\n );\n }\n\n}\n","import { connect } from 'react-redux';\nimport Upload from '../components/upload';\nimport { undoUploadCompose } from '../../../actions/compose';\nimport { openModal } from '../../../actions/modal';\nimport { submitCompose } from '../../../actions/compose';\n\nconst mapStateToProps = (state, { id }) => ({\n media: state.getIn(['compose', 'media_attachments']).find(item => item.get('id') === id),\n});\n\nconst mapDispatchToProps = dispatch => ({\n\n onUndo: id => {\n dispatch(undoUploadCompose(id));\n },\n\n onOpenFocalPoint: id => {\n dispatch(openModal('FOCAL_POINT', { id }));\n },\n\n onSubmit (router) {\n dispatch(submitCompose(router));\n },\n\n});\n\nexport default connect(mapStateToProps, mapDispatchToProps)(Upload);\n","import React from 'react';\nimport { connect } from 'react-redux';\nimport PropTypes from 'prop-types';\nimport classNames from 'classnames';\nimport { changeComposeSensitivity } from 'mastodon/actions/compose';\nimport { injectIntl, defineMessages, FormattedMessage } from 'react-intl';\n\nconst messages = defineMessages({\n marked: { id: 'compose_form.sensitive.marked', defaultMessage: 'Media is marked as sensitive' },\n unmarked: { id: 'compose_form.sensitive.unmarked', defaultMessage: 'Media is not marked as sensitive' },\n});\n\nconst mapStateToProps = state => ({\n active: state.getIn(['compose', 'sensitive']),\n disabled: state.getIn(['compose', 'spoiler']),\n});\n\nconst mapDispatchToProps = dispatch => ({\n\n onClick () {\n dispatch(changeComposeSensitivity());\n },\n\n});\n\nclass SensitiveButton extends React.PureComponent {\n\n static propTypes = {\n active: PropTypes.bool,\n disabled: PropTypes.bool,\n onClick: PropTypes.func.isRequired,\n intl: PropTypes.object.isRequired,\n };\n\n render () {\n const { active, disabled, onClick, intl } = this.props;\n\n return (\n <div className='compose-form__sensitive-button'>\n <label className={classNames('icon-button', { active })} title={intl.formatMessage(active ? messages.marked : messages.unmarked)}>\n <input\n name='mark-sensitive'\n type='checkbox'\n checked={active}\n onChange={onClick}\n disabled={disabled}\n />\n\n <span className={classNames('checkbox', { active })} />\n\n <FormattedMessage id='compose_form.sensitive.hide' defaultMessage='Mark media as sensitive' />\n </label>\n </div>\n );\n }\n\n}\n\nexport default connect(mapStateToProps, mapDispatchToProps)(injectIntl(SensitiveButton));\n","import React from 'react';\nimport ImmutablePropTypes from 'react-immutable-proptypes';\nimport UploadProgressContainer from '../containers/upload_progress_container';\nimport ImmutablePureComponent from 'react-immutable-pure-component';\nimport UploadContainer from '../containers/upload_container';\nimport SensitiveButtonContainer from '../containers/sensitive_button_container';\nimport { FormattedMessage } from 'react-intl';\n\nexport default class UploadForm extends ImmutablePureComponent {\n\n static propTypes = {\n mediaIds: ImmutablePropTypes.list.isRequired,\n };\n\n render () {\n const { mediaIds } = this.props;\n\n return (\n <div className='compose-form__upload-wrapper'>\n <UploadProgressContainer icon='upload' message={<FormattedMessage id='upload_progress.label' defaultMessage='Uploading…' />} />\n\n <div className='compose-form__uploads-wrapper'>\n {mediaIds.map(id => (\n <UploadContainer id={id} key={id} />\n ))}\n </div>\n\n {!mediaIds.isEmpty() && <SensitiveButtonContainer />}\n </div>\n );\n }\n\n}\n","import { connect } from 'react-redux';\nimport UploadForm from '../components/upload_form';\n\nconst mapStateToProps = state => ({\n mediaIds: state.getIn(['compose', 'media_attachments']).map(item => item.get('id')),\n});\n\nexport default connect(mapStateToProps)(UploadForm);\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport Motion from '../../ui/util/optional_motion';\nimport spring from 'react-motion/lib/spring';\n\nexport default class Warning extends React.PureComponent {\n\n static propTypes = {\n message: PropTypes.node.isRequired,\n };\n\n render () {\n const { message } = this.props;\n\n return (\n <Motion defaultStyle={{ opacity: 0, scaleX: 0.85, scaleY: 0.75 }} style={{ opacity: spring(1, { damping: 35, stiffness: 400 }), scaleX: spring(1, { damping: 35, stiffness: 400 }), scaleY: spring(1, { damping: 35, stiffness: 400 }) }}>\n {({ opacity, scaleX, scaleY }) => (\n <div className='compose-form__warning' style={{ opacity: opacity, transform: `scale(${scaleX}, ${scaleY})` }}>\n {message}\n </div>\n )}\n </Motion>\n );\n }\n\n}\n","import React from 'react';\nimport { connect } from 'react-redux';\nimport Warning from '../components/warning';\nimport PropTypes from 'prop-types';\nimport { FormattedMessage } from 'react-intl';\nimport { me } from '../../../initial_state';\n\nconst APPROX_HASHTAG_RE = /(?:^|[^\\/\\)\\w])#(\\w*[a-zA-Z·]\\w*)/i;\n\nconst mapStateToProps = state => ({\n needsLockWarning: state.getIn(['compose', 'privacy']) === 'private' && !state.getIn(['accounts', me, 'locked']),\n hashtagWarning: state.getIn(['compose', 'privacy']) !== 'public' && APPROX_HASHTAG_RE.test(state.getIn(['compose', 'text'])),\n directMessageWarning: state.getIn(['compose', 'privacy']) === 'direct',\n});\n\nconst WarningWrapper = ({ needsLockWarning, hashtagWarning, directMessageWarning }) => {\n if (needsLockWarning) {\n return <Warning message={<FormattedMessage id='compose_form.lock_disclaimer' defaultMessage='Your account is not {locked}. Anyone can follow you to view your follower-only posts.' values={{ locked: <a href='/user-settings'><FormattedMessage id='compose_form.lock_disclaimer.lock' defaultMessage='locked' /></a> }} />} />;\n }\n\n if (hashtagWarning) {\n return <Warning message={<FormattedMessage id='compose_form.hashtag_warning' defaultMessage=\"This toot won't be listed under any hashtag as it is unlisted. Only public toots can be searched by hashtag.\" />} />;\n }\n\n if (directMessageWarning) {\n const message = (\n <span>\n <FormattedMessage id='compose_form.direct_message_warning' defaultMessage='This toot will only be sent to all the mentioned users.' /> <a href='/terms' target='_blank'><FormattedMessage id='compose_form.direct_message_warning_learn_more' defaultMessage='Learn more' /></a>\n </span>\n );\n\n return <Warning message={message} />;\n }\n\n return null;\n};\n\nWarningWrapper.propTypes = {\n needsLockWarning: PropTypes.bool,\n hashtagWarning: PropTypes.bool,\n directMessageWarning: PropTypes.bool,\n};\n\nexport default connect(mapStateToProps)(WarningWrapper);\n","import React from 'react';\nimport CharacterCounter from './character_counter';\nimport Button from '../../../components/button';\nimport ImmutablePropTypes from 'react-immutable-proptypes';\nimport PropTypes from 'prop-types';\nimport ReplyIndicatorContainer from '../containers/reply_indicator_container';\nimport AutosuggestTextarea from '../../../components/autosuggest_textarea';\nimport AutosuggestInput from '../../../components/autosuggest_input';\nimport PollButtonContainer from '../containers/poll_button_container';\nimport UploadButtonContainer from '../containers/upload_button_container';\nimport { defineMessages, injectIntl } from 'react-intl';\nimport SpoilerButtonContainer from '../containers/spoiler_button_container';\nimport PrivacyDropdownContainer from '../containers/privacy_dropdown_container';\nimport EmojiPickerDropdown from '../containers/emoji_picker_dropdown_container';\nimport PollFormContainer from '../containers/poll_form_container';\nimport UploadFormContainer from '../containers/upload_form_container';\nimport WarningContainer from '../containers/warning_container';\nimport { isMobile } from '../../../is_mobile';\nimport ImmutablePureComponent from 'react-immutable-pure-component';\nimport { length } from 'stringz';\nimport Icon from 'mastodon/components/icon';\nimport { maxChars } from '../../../initial_state';\n\nconst allowedAroundShortCode = '><\\u0085\\u0020\\u00a0\\u1680\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200a\\u202f\\u205f\\u3000\\u2028\\u2029\\u0009\\u000a\\u000b\\u000c\\u000d';\n\nconst messages = defineMessages({\n placeholder: { id: 'compose_form.placeholder', defaultMessage: 'What is on your mind?' },\n spoiler_placeholder: { id: 'compose_form.spoiler_placeholder', defaultMessage: 'Write your warning here' },\n publish: { id: 'compose_form.publish', defaultMessage: 'Toot' },\n publishLoud: { id: 'compose_form.publish_loud', defaultMessage: '{publish}!' },\n});\n\nexport default @injectIntl\nclass ComposeForm extends ImmutablePureComponent {\n\n static contextTypes = {\n router: PropTypes.object,\n };\n\n static propTypes = {\n intl: PropTypes.object.isRequired,\n text: PropTypes.string.isRequired,\n suggestions: ImmutablePropTypes.list,\n spoiler: PropTypes.bool,\n privacy: PropTypes.string,\n spoilerText: PropTypes.string,\n focusDate: PropTypes.instanceOf(Date),\n caretPosition: PropTypes.number,\n preselectDate: PropTypes.instanceOf(Date),\n isSubmitting: PropTypes.bool,\n isChangingUpload: PropTypes.bool,\n isUploading: PropTypes.bool,\n onChange: PropTypes.func.isRequired,\n onSubmit: PropTypes.func.isRequired,\n onClearSuggestions: PropTypes.func.isRequired,\n onFetchSuggestions: PropTypes.func.isRequired,\n onSuggestionSelected: PropTypes.func.isRequired,\n onChangeSpoilerText: PropTypes.func.isRequired,\n onPaste: PropTypes.func.isRequired,\n onPickEmoji: PropTypes.func.isRequired,\n showSearch: PropTypes.bool,\n anyMedia: PropTypes.bool,\n singleColumn: PropTypes.bool,\n };\n\n static defaultProps = {\n showSearch: false,\n };\n\n handleChange = (e) => {\n this.props.onChange(e.target.value);\n }\n\n handleKeyDown = (e) => {\n if (e.keyCode === 13 && (e.ctrlKey || e.metaKey)) {\n this.handleSubmit();\n }\n }\n\n handleSubmit = () => {\n if (this.props.text !== this.autosuggestTextarea.textarea.value) {\n // Something changed the text inside the textarea (e.g. browser extensions like Grammarly)\n // Update the state to match the current text\n this.props.onChange(this.autosuggestTextarea.textarea.value);\n }\n\n // Submit disabled:\n const { isSubmitting, isChangingUpload, isUploading, anyMedia } = this.props;\n const fulltext = [this.props.spoilerText, this.props.text].join('');\n\n if (isSubmitting || isUploading || isChangingUpload || length(fulltext) > maxChars || (fulltext.length !== 0 && fulltext.trim().length === 0 && !anyMedia)) {\n return;\n }\n\n this.props.onSubmit(this.context.router ? this.context.router.history : null);\n }\n\n onSuggestionsClearRequested = () => {\n this.props.onClearSuggestions();\n }\n\n onSuggestionsFetchRequested = (token) => {\n this.props.onFetchSuggestions(token);\n }\n\n onSuggestionSelected = (tokenStart, token, value) => {\n this.props.onSuggestionSelected(tokenStart, token, value, ['text']);\n }\n\n onSpoilerSuggestionSelected = (tokenStart, token, value) => {\n this.props.onSuggestionSelected(tokenStart, token, value, ['spoiler_text']);\n }\n\n handleChangeSpoilerText = (e) => {\n this.props.onChangeSpoilerText(e.target.value);\n }\n\n handleFocus = () => {\n if (this.composeForm && !this.props.singleColumn) {\n const { left, right } = this.composeForm.getBoundingClientRect();\n if (left < 0 || right > (window.innerWidth || document.documentElement.clientWidth)) {\n this.composeForm.scrollIntoView();\n }\n }\n }\n\n componentDidUpdate (prevProps) {\n // This statement does several things:\n // - If we're beginning a reply, and,\n // - Replying to zero or one users, places the cursor at the end of the textbox.\n // - Replying to more than one user, selects any usernames past the first;\n // this provides a convenient shortcut to drop everyone else from the conversation.\n if (this.props.focusDate !== prevProps.focusDate) {\n let selectionEnd, selectionStart;\n\n if (this.props.preselectDate !== prevProps.preselectDate) {\n selectionEnd = this.props.text.length;\n selectionStart = this.props.text.search(/\\s/) + 1;\n } else if (typeof this.props.caretPosition === 'number') {\n selectionStart = this.props.caretPosition;\n selectionEnd = this.props.caretPosition;\n } else {\n selectionEnd = this.props.text.length;\n selectionStart = selectionEnd;\n }\n\n this.autosuggestTextarea.textarea.setSelectionRange(selectionStart, selectionEnd);\n this.autosuggestTextarea.textarea.focus();\n } else if(prevProps.isSubmitting && !this.props.isSubmitting) {\n this.autosuggestTextarea.textarea.focus();\n } else if (this.props.spoiler !== prevProps.spoiler) {\n if (this.props.spoiler) {\n this.spoilerText.input.focus();\n } else {\n this.autosuggestTextarea.textarea.focus();\n }\n }\n }\n\n setAutosuggestTextarea = (c) => {\n this.autosuggestTextarea = c;\n }\n\n setSpoilerText = (c) => {\n this.spoilerText = c;\n }\n\n setRef = c => {\n this.composeForm = c;\n };\n\n handleEmojiPick = (data) => {\n const { text } = this.props;\n const position = this.autosuggestTextarea.textarea.selectionStart;\n const needsSpace = data.custom && position > 0 && !allowedAroundShortCode.includes(text[position - 1]);\n\n this.props.onPickEmoji(position, data, needsSpace);\n }\n\n render () {\n const { intl, onPaste, showSearch, anyMedia } = this.props;\n const disabled = this.props.isSubmitting;\n const text = [this.props.spoilerText, this.props.text].join('');\n const disabledButton = disabled || this.props.isUploading || this.props.isChangingUpload || length(text) > maxChars || (text.length !== 0 && text.trim().length === 0 && !anyMedia);\n let publishText = '';\n\n if (this.props.privacy === 'private' || this.props.privacy === 'direct') {\n publishText = <span className='compose-form__publish-private'><Icon id='lock' /> {intl.formatMessage(messages.publish)}</span>;\n } else {\n publishText = this.props.privacy !== 'unlisted' ? intl.formatMessage(messages.publishLoud, { publish: intl.formatMessage(messages.publish) }) : intl.formatMessage(messages.publish);\n }\n\n return (\n <div className='compose-form'>\n <WarningContainer />\n\n <ReplyIndicatorContainer />\n\n <div className={`spoiler-input ${this.props.spoiler ? 'spoiler-input--visible' : ''}`} ref={this.setRef}>\n <AutosuggestInput\n placeholder={intl.formatMessage(messages.spoiler_placeholder)}\n value={this.props.spoilerText}\n onChange={this.handleChangeSpoilerText}\n onKeyDown={this.handleKeyDown}\n disabled={!this.props.spoiler}\n ref={this.setSpoilerText}\n suggestions={this.props.suggestions}\n onSuggestionsFetchRequested={this.onSuggestionsFetchRequested}\n onSuggestionsClearRequested={this.onSuggestionsClearRequested}\n onSuggestionSelected={this.onSpoilerSuggestionSelected}\n searchTokens={[':']}\n id='cw-spoiler-input'\n className='spoiler-input__input'\n />\n </div>\n\n <AutosuggestTextarea\n ref={this.setAutosuggestTextarea}\n placeholder={intl.formatMessage(messages.placeholder)}\n disabled={disabled}\n value={this.props.text}\n onChange={this.handleChange}\n suggestions={this.props.suggestions}\n onFocus={this.handleFocus}\n onKeyDown={this.handleKeyDown}\n onSuggestionsFetchRequested={this.onSuggestionsFetchRequested}\n onSuggestionsClearRequested={this.onSuggestionsClearRequested}\n onSuggestionSelected={this.onSuggestionSelected}\n onPaste={onPaste}\n autoFocus={!showSearch && !isMobile(window.innerWidth)}\n >\n <EmojiPickerDropdown onPickEmoji={this.handleEmojiPick} />\n <div className='compose-form__modifiers'>\n <UploadFormContainer />\n <PollFormContainer />\n </div>\n </AutosuggestTextarea>\n\n <div className='compose-form__buttons-wrapper'>\n <div className='compose-form__buttons'>\n <UploadButtonContainer />\n <PollButtonContainer />\n <PrivacyDropdownContainer />\n <SpoilerButtonContainer />\n </div>\n <div className='character-counter__wrapper'><CharacterCounter max={maxChars} text={text} /></div>\n </div>\n\n <div className='compose-form__publish'>\n <div className='compose-form__publish-button-wrapper'><Button text={publishText} onClick={this.handleSubmit} disabled={disabledButton} block /></div>\n </div>\n </div>\n );\n }\n\n}\n","import { connect } from 'react-redux';\nimport ComposeForm from '../components/compose_form';\nimport {\n changeCompose,\n submitCompose,\n clearComposeSuggestions,\n fetchComposeSuggestions,\n selectComposeSuggestion,\n changeComposeSpoilerText,\n insertEmojiCompose,\n uploadCompose,\n} from '../../../actions/compose';\n\nconst mapStateToProps = state => ({\n text: state.getIn(['compose', 'text']),\n suggestions: state.getIn(['compose', 'suggestions']),\n spoiler: state.getIn(['compose', 'spoiler']),\n spoilerText: state.getIn(['compose', 'spoiler_text']),\n privacy: state.getIn(['compose', 'privacy']),\n focusDate: state.getIn(['compose', 'focusDate']),\n caretPosition: state.getIn(['compose', 'caretPosition']),\n preselectDate: state.getIn(['compose', 'preselectDate']),\n isSubmitting: state.getIn(['compose', 'is_submitting']),\n isChangingUpload: state.getIn(['compose', 'is_changing_upload']),\n isUploading: state.getIn(['compose', 'is_uploading']),\n showSearch: state.getIn(['search', 'submitted']) && !state.getIn(['search', 'hidden']),\n anyMedia: state.getIn(['compose', 'media_attachments']).size > 0,\n});\n\nconst mapDispatchToProps = (dispatch) => ({\n\n onChange (text) {\n dispatch(changeCompose(text));\n },\n\n onSubmit (router) {\n dispatch(submitCompose(router));\n },\n\n onClearSuggestions () {\n dispatch(clearComposeSuggestions());\n },\n\n onFetchSuggestions (token) {\n dispatch(fetchComposeSuggestions(token));\n },\n\n onSuggestionSelected (position, token, suggestion, path) {\n dispatch(selectComposeSuggestion(position, token, suggestion, path));\n },\n\n onChangeSpoilerText (checked) {\n dispatch(changeComposeSpoilerText(checked));\n },\n\n onPaste (files) {\n dispatch(uploadCompose(files));\n },\n\n onPickEmoji (position, data, needsSpace) {\n dispatch(insertEmojiCompose(position, data, needsSpace));\n },\n\n});\n\nexport default connect(mapStateToProps, mapDispatchToProps)(ComposeForm);\n","import { connect } from 'react-redux';\nimport { defineMessages, injectIntl } from 'react-intl';\nimport NavigationBar from '../components/navigation_bar';\nimport { logOut } from 'mastodon/utils/log_out';\nimport { openModal } from 'mastodon/actions/modal';\nimport { me } from '../../../initial_state';\n\nconst messages = defineMessages({\n logoutMessage: { id: 'confirmations.logout.message', defaultMessage: 'Are you sure you want to log out?' },\n logoutConfirm: { id: 'confirmations.logout.confirm', defaultMessage: 'Log out' },\n});\n\nconst mapStateToProps = state => {\n return {\n account: state.getIn(['accounts', me]),\n };\n};\n\nconst mapDispatchToProps = (dispatch, { intl }) => ({\n onLogout () {\n dispatch(openModal('CONFIRM', {\n message: intl.formatMessage(messages.logoutMessage),\n confirm: intl.formatMessage(messages.logoutConfirm),\n onConfirm: () => logOut(),\n }));\n },\n});\n\nexport default injectIntl(connect(mapStateToProps, mapDispatchToProps)(NavigationBar));\n","import React from 'react';\nimport ComposeFormContainer from './containers/compose_form_container';\nimport NavigationContainer from './containers/navigation_container';\nimport PropTypes from 'prop-types';\nimport ImmutablePropTypes from 'react-immutable-proptypes';\nimport { connect } from 'react-redux';\nimport { mountCompose, unmountCompose } from '../../actions/compose';\nimport { Link } from 'react-router-dom';\nimport { injectIntl, defineMessages } from 'react-intl';\nimport SearchContainer from './containers/search_container';\nimport Motion from '../ui/util/optional_motion';\nimport spring from 'react-motion/lib/spring';\nimport SearchResultsContainer from './containers/search_results_container';\nimport { changeComposing } from '../../actions/compose';\nimport { openModal } from 'mastodon/actions/modal';\nimport { mascot } from '../../initial_state';\nimport Icon from 'mastodon/components/icon';\nimport { logOut } from 'mastodon/utils/log_out';\n\nconst messages = defineMessages({\n start: { id: 'getting_started.heading', defaultMessage: 'Getting started' },\n home_timeline: { id: 'tabs_bar.home', defaultMessage: 'Home' },\n notifications: { id: 'tabs_bar.notifications', defaultMessage: 'Notifications' },\n public: { id: 'navigation_bar.public_timeline', defaultMessage: 'Federated timeline' },\n community: { id: 'navigation_bar.community_timeline', defaultMessage: 'Local timeline' },\n preferences: { id: 'navigation_bar.preferences', defaultMessage: 'Preferences' },\n logout: { id: 'navigation_bar.logout', defaultMessage: 'Logout' },\n compose: { id: 'navigation_bar.compose', defaultMessage: 'Compose new toot' },\n logoutMessage: { id: 'confirmations.logout.message', defaultMessage: 'Are you sure you want to log out?' },\n logoutConfirm: { id: 'confirmations.logout.confirm', defaultMessage: 'Log out' },\n});\n\nconst mapStateToProps = (state, ownProps) => ({\n columns: state.getIn(['settings', 'columns']),\n showSearch: ownProps.multiColumn ? state.getIn(['search', 'submitted']) && !state.getIn(['search', 'hidden']) : ownProps.isSearchPage,\n});\n\nexport default @connect(mapStateToProps)\n@injectIntl\nclass Compose extends React.PureComponent {\n\n static propTypes = {\n dispatch: PropTypes.func.isRequired,\n columns: ImmutablePropTypes.list.isRequired,\n multiColumn: PropTypes.bool,\n showSearch: PropTypes.bool,\n isSearchPage: PropTypes.bool,\n intl: PropTypes.object.isRequired,\n };\n\n componentDidMount () {\n const { isSearchPage } = this.props;\n\n if (!isSearchPage) {\n this.props.dispatch(mountCompose());\n }\n }\n\n componentWillUnmount () {\n const { isSearchPage } = this.props;\n\n if (!isSearchPage) {\n this.props.dispatch(unmountCompose());\n }\n }\n\n handleLogoutClick = e => {\n const { dispatch, intl } = this.props;\n\n e.preventDefault();\n e.stopPropagation();\n\n dispatch(openModal('CONFIRM', {\n message: intl.formatMessage(messages.logoutMessage),\n confirm: intl.formatMessage(messages.logoutConfirm),\n onConfirm: () => logOut(),\n }));\n\n return false;\n }\n\n onFocus = () => {\n this.props.dispatch(changeComposing(true));\n }\n\n onBlur = () => {\n this.props.dispatch(changeComposing(false));\n }\n\n render () {\n const { multiColumn, showSearch, isSearchPage, intl } = this.props;\n\n let header = '';\n\n if (multiColumn) {\n const { columns } = this.props;\n header = (\n <nav className='drawer__header'>\n <Link to='/getting-started' className='drawer__tab' title={intl.formatMessage(messages.start)} aria-label={intl.formatMessage(messages.start)}><Icon id='bars' fixedWidth /></Link>\n {!columns.some(column => column.get('id') === 'HOME') && (\n <Link to='/timelines/home' className='drawer__tab' title={intl.formatMessage(messages.home_timeline)} aria-label={intl.formatMessage(messages.home_timeline)}><Icon id='home' fixedWidth /></Link>\n )}\n {!columns.some(column => column.get('id') === 'NOTIFICATIONS') && (\n <Link to='/notifications' className='drawer__tab' title={intl.formatMessage(messages.notifications)} aria-label={intl.formatMessage(messages.notifications)}><Icon id='bell' fixedWidth /></Link>\n )}\n {!columns.some(column => column.get('id') === 'COMMUNITY') && (\n <Link to='/timelines/public/local' className='drawer__tab' title={intl.formatMessage(messages.community)} aria-label={intl.formatMessage(messages.community)}><Icon id='users' fixedWidth /></Link>\n )}\n {!columns.some(column => column.get('id') === 'PUBLIC') && (\n <Link to='/timelines/public' className='drawer__tab' title={intl.formatMessage(messages.public)} aria-label={intl.formatMessage(messages.public)}><Icon id='globe' fixedWidth /></Link>\n )}\n <a href='/user-settings' className='drawer__tab' title={intl.formatMessage(messages.preferences)} aria-label={intl.formatMessage(messages.preferences)}><Icon id='cog' fixedWidth /></a>\n <a href='/auth/sign_out' className='drawer__tab' title={intl.formatMessage(messages.logout)} aria-label={intl.formatMessage(messages.logout)} onClick={this.handleLogoutClick}><Icon id='sign-out' fixedWidth /></a>\n </nav>\n );\n }\n\n return (\n <div className='drawer' role='region' aria-label={intl.formatMessage(messages.compose)}>\n {header}\n\n {(multiColumn || isSearchPage) && <SearchContainer /> }\n\n <div className='drawer__pager'>\n {!isSearchPage && <div className='drawer__inner' onFocus={this.onFocus}>\n <NavigationContainer onClose={this.onBlur} />\n\n <ComposeFormContainer />\n\n mascot && ( <div className='drawer__inner__mastodon'>\n <img alt='' draggable='false' src={mascot} />\n </div> )\n </div>}\n\n <Motion defaultStyle={{ x: isSearchPage ? 0 : -100 }} style={{ x: spring(showSearch || isSearchPage ? 0 : -100, { stiffness: 210, damping: 20 }) }}>\n {({ x }) => (\n <div className='drawer__inner darker' style={{ transform: `translateX(${x}%)`, visibility: x === -100 ? 'hidden' : 'visible' }}>\n <SearchResultsContainer />\n </div>\n )}\n </Motion>\n </div>\n </div>\n );\n }\n\n}\n"],"sourceRoot":""} |