Merge branch 'develop' into gun
[akkoma] / priv / static / packs / features / compose.js.map
index 4bfd2b52d055f23f4a64ebd2d330adccf29100d4..3397e47c7c804f5a7b26e518c3708c1dcbd96b90 100644 (file)
@@ -1 +1 @@
-{"version":3,"sources":["webpack:///app/javascript/seagate/sources/git/hacktivis.me/git/mastofe/app/javascript/mastodon/components/autosuggest_emoji.js","webpack:///app/javascript/seagate/sources/git/hacktivis.me/git/mastofe/app/javascript/mastodon/features/compose/components/emoji_picker_dropdown.js","webpack:///app/javascript/seagate/sources/git/hacktivis.me/git/mastofe/app/javascript/mastodon/features/compose/components/character_counter.js","webpack:///app/javascript/seagate/sources/git/hacktivis.me/git/mastofe/app/javascript/mastodon/features/compose/components/reply_indicator.js","webpack:///app/javascript/seagate/sources/git/hacktivis.me/git/mastofe/app/javascript/mastodon/features/compose/containers/reply_indicator_container.js","webpack:///app/javascript/seagate/sources/git/hacktivis.me/git/mastofe/app/javascript/mastodon/features/compose/components/autosuggest_account.js","webpack:///app/javascript/seagate/sources/git/hacktivis.me/git/mastofe/app/javascript/mastodon/features/compose/containers/autosuggest_account_container.js","webpack:///app/javascript/seagate/sources/git/hacktivis.me/git/mastofe/app/javascript/mastodon/components/autosuggest_textarea.js","webpack:///app/javascript/seagate/sources/git/hacktivis.me/git/mastofe/app/javascript/mastodon/features/compose/components/upload_button.js","webpack:///app/javascript/seagate/sources/git/hacktivis.me/git/mastofe/app/javascript/mastodon/features/compose/containers/upload_button_container.js","webpack:///app/javascript/seagate/sources/git/hacktivis.me/git/mastofe/app/javascript/mastodon/features/compose/components/text_icon_button.js","webpack:///app/javascript/seagate/sources/git/hacktivis.me/git/mastofe/app/javascript/mastodon/features/compose/containers/spoiler_button_container.js","webpack:///app/javascript/seagate/sources/git/hacktivis.me/git/mastofe/app/javascript/mastodon/features/compose/components/privacy_dropdown.js","webpack:///app/javascript/seagate/sources/git/hacktivis.me/git/mastofe/app/javascript/mastodon/features/compose/containers/privacy_dropdown_container.js","webpack:///app/javascript/seagate/sources/git/hacktivis.me/git/mastofe/app/javascript/mastodon/features/compose/containers/sensitive_button_container.js","webpack:///app/javascript/seagate/sources/git/hacktivis.me/git/mastofe/app/javascript/mastodon/features/compose/containers/emoji_picker_dropdown_container.js","webpack:///app/javascript/seagate/sources/git/hacktivis.me/git/mastofe/app/javascript/mastodon/features/compose/components/upload_progress.js","webpack:///app/javascript/seagate/sources/git/hacktivis.me/git/mastofe/app/javascript/mastodon/features/compose/containers/upload_progress_container.js","webpack:///app/javascript/seagate/sources/git/hacktivis.me/git/mastofe/app/javascript/mastodon/features/compose/components/upload.js","webpack:///app/javascript/seagate/sources/git/hacktivis.me/git/mastofe/app/javascript/mastodon/features/compose/containers/upload_container.js","webpack:///app/javascript/seagate/sources/git/hacktivis.me/git/mastofe/app/javascript/mastodon/features/compose/components/upload_form.js","webpack:///app/javascript/seagate/sources/git/hacktivis.me/git/mastofe/app/javascript/mastodon/features/compose/containers/upload_form_container.js","webpack:///app/javascript/seagate/sources/git/hacktivis.me/git/mastofe/app/javascript/mastodon/features/compose/components/warning.js","webpack:///app/javascript/seagate/sources/git/hacktivis.me/git/mastofe/app/javascript/mastodon/features/compose/containers/warning_container.js","webpack:///app/javascript/seagate/sources/git/hacktivis.me/git/mastofe/app/javascript/mastodon/features/compose/components/compose_form.js","webpack:///app/javascript/seagate/sources/git/hacktivis.me/git/mastofe/app/javascript/mastodon/features/compose/containers/compose_form_container.js","webpack:///app/javascript/seagate/sources/git/hacktivis.me/git/mastofe/app/javascript/mastodon/features/compose/containers/navigation_container.js","webpack:///app/javascript/seagate/sources/git/hacktivis.me/git/mastofe/app/javascript/mastodon/features/compose/components/search.js","webpack:///app/javascript/seagate/sources/git/hacktivis.me/git/mastofe/app/javascript/mastodon/features/compose/containers/search_container.js","webpack:///app/javascript/seagate/sources/git/hacktivis.me/git/mastofe/app/javascript/mastodon/components/hashtag.js","webpack:///app/javascript/seagate/sources/git/hacktivis.me/git/mastofe/app/javascript/mastodon/features/compose/components/search_results.js","webpack:///app/javascript/seagate/sources/git/hacktivis.me/git/mastofe/app/javascript/mastodon/features/compose/containers/search_results_container.js","webpack:///app/javascript/seagate/sources/git/hacktivis.me/git/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","Object","_babel_runtime_helpers_esm_jsx__WEBPACK_IMPORTED_MODULE_0__","className","src","alt","colons","React","PureComponent","EmojiPicker","Emoji","messages","defineMessages","id","defaultMessage","emoji_search","emoji_not_found","recent","search_results","people","nature","food","activity","travel","objects","symbols","flags","backgroundImageFn","listenerOptions","detectPassiveEvents","hasSupport","passive","categoriesSort","ModifierPickerMenu","e","_this","onSelect","currentTarget","getAttribute","node","contains","target","onClose","c","componentWillReceiveProps","nextProps","active","attachListeners","removeListeners","componentWillUnmount","document","addEventListener","handleDocumentClick","removeEventListener","react__WEBPACK_IMPORTED_MODULE_4___default","a","createElement","style","display","ref","setRef","onClick","handleClick","data-index","set","size","sheetSize","skin","ModifierPicker","_this2","onOpen","modifier","onChange","_this$props","handleSelect","EmojiPickerMenu","injectIntl","modifierOpen","placement","_this3","intl","search","formatMessage","notfound","categories","foods","places","onPick","setState","onSkinTone","componentDidMount","_this$props2","loading","custom_emojis","skinTone","frequentlyUsedEmojis","width","title","state","classNames","selecting","perLine","emojiSize","buildCustomEmojis","color","i18n","getI18n","include","showPreview","autoFocus","emojiTooltip","handleModifierOpen","handleModifierClose","handleModifierChange","EmojiPickerDropdown","_this4","dropdown","_ref","EmojiPickerAsync","then","EmojiMart","Picker","catch","top","getBoundingClientRect","innerHeight","key","onHideDropdown","onShowDropdown","_this$props3","onPickEmoji","_this$state","onKeyDown","handleKeyDown","setTargetRef","aria-label","aria-expanded","role","onToggle","tabIndex","pulse-loading","react_overlays_lib_Overlay__WEBPACK_IMPORTED_MODULE_7___default","show","findTarget","CharacterCounter","checkRemainingText","diff","jsx","max","length","text","cancel","ReplyIndicator","onCancel","button","ctrlKey","metaKey","preventDefault","context","router","history","push","status","getIn","content","__html","get","direction","isRtl","icon_button","icon","inverted","href","handleAccountClick","avatar","account","display_name","dangerouslySetInnerHTML","ImmutablePureComponent","PropTypes","object","ImmutablePropTypes","map","func","isRequired","connect","getStatus","makeGetStatus","dispatch","cancelReplyCompose","AutosuggestAccount","getAccount","makeGetAccount","AutosuggestTextarea","suggestionsHidden","selectedSuggestion","lastToken","tokenStart","str","caretPosition","word","left","right","_textAtCursorMatchesT","value","selectionStart","slice","trim","indexOf","toLowerCase","token","onSuggestionsFetchRequested","onSuggestionsClearRequested","suggestions","disabled","which","isComposing","querySelector","parentElement","focus","Math","min","stopPropagation","onSuggestionSelected","defaultPrevented","suggestion","textarea","clipboardData","files","onPaste","i","inner","autosuggest_emoji","autosuggest_account_container","selected","onMouseDown","onSuggestionClick","placeholder","onKeyUp","react_textarea_autosize_esm_browser","inputRef","setTextarea","onBlur","aria-autocomplete","isEmpty","renderSuggestion","string","list","bool","upload","iconStyle","height","lineHeight","UploadButton","acceptContentTypes","onSelectFile","fileElement","click","resetFileKey","react_default","type","multiple","accept","toArray","join","handleChange","number","listOf","some","m","uploadCompose","TextIconButton","label","ariaControls","aria-controls","marked","unmarked","changeComposeSpoilerness","public_short","public_long","unlisted_short","unlisted_long","private_short","private_long","direct_short","direct_long","change_privacy","PrivacyDropdownMenu","mounted","element","items","index","findIndex","item","childNodes","firstChild","lastChild","focusedItem","optional_motion","defaultStyle","opacity","scaleX","scaleY","spring","damping","stiffness","objectSpread","transform","aria-selected","setFocusRef","meta","PrivacyDropdown","open","_ref2","isUserTouching","onModalClose","onModalOpen","actions","options","option","handleModalActionClick","handleClose","componentWillMount","valueOption","find","expanded","handleToggle","Overlay_default","privacy_dropdown_PrivacyDropdownMenu","isModalOpen","modalType","changeComposeVisibility","openModal","closeModal","SensitiveButton","visible","scale","compose-form__sensitive-button--visible","changeComposeSensitivity","DEFAULTS","getFrequentlyUsedEmojis","createSelector","ImmutableMap","emojiCounters","emojis","keySeq","sort","b","reverse","uniqueDefaults","filter","includes","concat","getCustomEmojis","aShort","bShort","changeSetting","useEmoji","UploadProgress","progress","index_es","description","Upload","hovered","focused","dirtyDescription","keyCode","handleSubmit","handleInputBlur","onSubmit","onUndo","media","onOpenFocalPoint","onDescriptionChange","focusX","focusY","x","y","onMouseEnter","handleMouseEnter","onMouseLeave","handleMouseLeave","backgroundImage","backgroundPosition","handleUndoClick","handleFocalPointClick","maxLength","onFocus","handleInputFocus","handleInputChange","undoUploadCompose","changeUploadCompose","submitCompose","UploadForm","mediaIds","upload_progress_container","upload_container","Warning","message","APPROX_HASHTAG_RE","needsLockWarning","me","hashtagWarning","test","directMessageWarning","warning_Warning","values","locked","spoiler_placeholder","publish","publishLoud","ComposeForm","autosuggestTextarea","is_submitting","is_changing_upload","is_uploading","anyMedia","fulltext","spoiler_text","maxChars","onClearSuggestions","onFetchSuggestions","onChangeSpoilerText","spoilerText","data","position","needsSpace","componentDidUpdate","prevProps","selectionEnd","focusDate","preselectDate","setSelectionRange","spoiler","showSearch","disabledButton","publishText","privacy","warning_container","reply_indicator_container","handleChangeSpoilerText","setSpoilerText","autosuggest_textarea_AutosuggestTextarea","setAutosuggestTextarea","isMobile","window","innerWidth","emoji_picker_dropdown_container","handleEmojiPick","upload_form_container","upload_button_container","privacy_dropdown_container","sensitive_button_container","spoiler_button_container","character_counter_CharacterCounter","components_button","block","suggestion_token","instanceOf","Date","changeCompose","clearComposeSuggestions","fetchComposeSuggestions","accountId","selectComposeSuggestion","checked","changeComposeSpoilerText","insertEmojiCompose","NavigationBar","SearchPopout","extraInformation","searchEnabled","Search","submitted","onClear","onShow","noop","hasValue","handleFocus","handleBlur","handleClear","search_SearchPopout","changeSearch","clearSearch","submitSearch","Hashtag","hashtag","permalink","to","rawCount","count","shortNumberFormat","build","day","fill","dismissSuggestion","SearchResults","fetchSuggestions","accounts","statuses","hashtags","results","account_container","actionIcon","actionTitle","onActionClick","statusId","status_container","components_hashtag","start","home_timeline","notifications","public","community","preferences","logout","compose","Compose","ownProps","columns","multiColumn","isSearchPage","changeComposing","mountCompose","unmountCompose","header","Link","column","data-method","search_container","navigation_container","compose_form_container","visibility","search_results_container"],"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 PropTypes from 'prop-types';\nimport { defineMessages, injectIntl } from 'react-intl';\nimport { EmojiPicker as EmojiPickerAsync } from '../../ui/util/async-components';\nimport Overlay from 'react-overlays/lib/Overlay';\nimport classNames from 'classnames';\nimport ImmutablePropTypes from 'react-immutable-proptypes';\nimport detectPassiveEvents from 'detect-passive-events';\nimport { buildCustomEmojis } from '../../emoji/emoji';\n\nconst messages = defineMessages({\n  emoji: { id: 'emoji_button.label', defaultMessage: 'Insert emoji' },\n  emoji_search: { id: 'emoji_button.search', defaultMessage: 'Search...' },\n  emoji_not_found: { id: 'emoji_button.not_found', defaultMessage: 'No emojos!! (╯°□°)╯︵ ┻━┻' },\n  custom: { id: 'emoji_button.custom', defaultMessage: 'Custom' },\n  recent: { id: 'emoji_button.recent', defaultMessage: 'Frequently used' },\n  search_results: { id: 'emoji_button.search_results', defaultMessage: 'Search results' },\n  people: { id: 'emoji_button.people', defaultMessage: 'People' },\n  nature: { id: 'emoji_button.nature', defaultMessage: 'Nature' },\n  food: { id: 'emoji_button.food', defaultMessage: 'Food & Drink' },\n  activity: { id: 'emoji_button.activity', defaultMessage: 'Activity' },\n  travel: { id: 'emoji_button.travel', defaultMessage: 'Travel & Places' },\n  objects: { id: 'emoji_button.objects', defaultMessage: 'Objects' },\n  symbols: { id: 'emoji_button.symbols', defaultMessage: 'Symbols' },\n  flags: { id: 'emoji_button.flags', defaultMessage: 'Flags' },\n});\n\nconst assetHost = process.env.CDN_HOST || '';\nlet EmojiPicker, Emoji; // load asynchronously\n\nconst backgroundImageFn = () => `${assetHost}/emoji/sheet_10.png`;\nconst listenerOptions = detectPassiveEvents.hasSupport ? { passive: true } : false;\n\nconst categoriesSort = [\n  'recent',\n  'custom',\n  'people',\n  'nature',\n  'foods',\n  'activity',\n  'places',\n  'objects',\n  'symbols',\n  'flags',\n];\n\nclass ModifierPickerMenu extends React.PureComponent {\n\n  static propTypes = {\n    active: PropTypes.bool,\n    onSelect: PropTypes.func.isRequired,\n    onClose: PropTypes.func.isRequired,\n  };\n\n  handleClick = e => {\n    this.props.onSelect(e.currentTarget.getAttribute('data-index') * 1);\n  }\n\n  componentWillReceiveProps (nextProps) {\n    if (nextProps.active) {\n      this.attachListeners();\n    } else {\n      this.removeListeners();\n    }\n  }\n\n  componentWillUnmount () {\n    this.removeListeners();\n  }\n\n  handleDocumentClick = e => {\n    if (this.node && !this.node.contains(e.target)) {\n      this.props.onClose();\n    }\n  }\n\n  attachListeners () {\n    document.addEventListener('click', this.handleDocumentClick, false);\n    document.addEventListener('touchend', this.handleDocumentClick, listenerOptions);\n  }\n\n  removeListeners () {\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  render () {\n    const { active } = this.props;\n\n    return (\n      <div className='emoji-picker-dropdown__modifiers__menu' style={{ display: active ? 'block' : 'none' }} ref={this.setRef}>\n        <button onClick={this.handleClick} data-index={1}><Emoji emoji='fist' set='twitter' size={22} sheetSize={32} skin={1} backgroundImageFn={backgroundImageFn} /></button>\n        <button onClick={this.handleClick} data-index={2}><Emoji emoji='fist' set='twitter' size={22} sheetSize={32} skin={2} backgroundImageFn={backgroundImageFn} /></button>\n        <button onClick={this.handleClick} data-index={3}><Emoji emoji='fist' set='twitter' size={22} sheetSize={32} skin={3} backgroundImageFn={backgroundImageFn} /></button>\n        <button onClick={this.handleClick} data-index={4}><Emoji emoji='fist' set='twitter' size={22} sheetSize={32} skin={4} backgroundImageFn={backgroundImageFn} /></button>\n        <button onClick={this.handleClick} data-index={5}><Emoji emoji='fist' set='twitter' size={22} sheetSize={32} skin={5} backgroundImageFn={backgroundImageFn} /></button>\n        <button onClick={this.handleClick} data-index={6}><Emoji emoji='fist' set='twitter' size={22} sheetSize={32} skin={6} backgroundImageFn={backgroundImageFn} /></button>\n      </div>\n    );\n  }\n\n}\n\nclass ModifierPicker extends React.PureComponent {\n\n  static propTypes = {\n    active: PropTypes.bool,\n    modifier: PropTypes.number,\n    onChange: PropTypes.func,\n    onClose: PropTypes.func,\n    onOpen: PropTypes.func,\n  };\n\n  handleClick = () => {\n    if (this.props.active) {\n      this.props.onClose();\n    } else {\n      this.props.onOpen();\n    }\n  }\n\n  handleSelect = modifier => {\n    this.props.onChange(modifier);\n    this.props.onClose();\n  }\n\n  render () {\n    const { active, modifier } = this.props;\n\n    return (\n      <div className='emoji-picker-dropdown__modifiers'>\n        <Emoji emoji='fist' set='twitter' size={22} sheetSize={32} skin={modifier} onClick={this.handleClick} backgroundImageFn={backgroundImageFn} />\n        <ModifierPickerMenu active={active} onSelect={this.handleSelect} onClose={this.props.onClose} />\n      </div>\n    );\n  }\n\n}\n\n@injectIntl\nclass EmojiPickerMenu extends React.PureComponent {\n\n  static propTypes = {\n    custom_emojis: ImmutablePropTypes.list,\n    frequentlyUsedEmojis: PropTypes.arrayOf(PropTypes.string),\n    loading: PropTypes.bool,\n    onClose: PropTypes.func.isRequired,\n    onPick: PropTypes.func.isRequired,\n    style: PropTypes.object,\n    placement: PropTypes.string,\n    arrowOffsetLeft: PropTypes.string,\n    arrowOffsetTop: PropTypes.string,\n    intl: PropTypes.object.isRequired,\n    skinTone: PropTypes.number.isRequired,\n    onSkinTone: PropTypes.func.isRequired,\n  };\n\n  static defaultProps = {\n    style: {},\n    loading: true,\n    frequentlyUsedEmojis: [],\n  };\n\n  state = {\n    modifierOpen: false,\n    placement: null,\n  };\n\n  handleDocumentClick = e => {\n    if (this.node && !this.node.contains(e.target)) {\n      this.props.onClose();\n    }\n  }\n\n  componentDidMount () {\n    document.addEventListener('click', this.handleDocumentClick, false);\n    document.addEventListener('touchend', this.handleDocumentClick, listenerOptions);\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  getI18n = () => {\n    const { intl } = this.props;\n\n    return {\n      search: intl.formatMessage(messages.emoji_search),\n      notfound: intl.formatMessage(messages.emoji_not_found),\n      categories: {\n        search: intl.formatMessage(messages.search_results),\n        recent: intl.formatMessage(messages.recent),\n        people: intl.formatMessage(messages.people),\n        nature: intl.formatMessage(messages.nature),\n        foods: intl.formatMessage(messages.food),\n        activity: intl.formatMessage(messages.activity),\n        places: intl.formatMessage(messages.travel),\n        objects: intl.formatMessage(messages.objects),\n        symbols: intl.formatMessage(messages.symbols),\n        flags: intl.formatMessage(messages.flags),\n        custom: intl.formatMessage(messages.custom),\n      },\n    };\n  }\n\n  handleClick = emoji => {\n    if (!emoji.native) {\n      emoji.native = emoji.colons;\n    }\n\n    this.props.onClose();\n    this.props.onPick(emoji);\n  }\n\n  handleModifierOpen = () => {\n    this.setState({ modifierOpen: true });\n  }\n\n  handleModifierClose = () => {\n    this.setState({ modifierOpen: false });\n  }\n\n  handleModifierChange = modifier => {\n    this.props.onSkinTone(modifier);\n  }\n\n  render () {\n    const { loading, style, intl, custom_emojis, skinTone, frequentlyUsedEmojis } = this.props;\n\n    if (loading) {\n      return <div style={{ width: 299 }} />;\n    }\n\n    const title = intl.formatMessage(messages.emoji);\n    const { modifierOpen } = this.state;\n\n    return (\n      <div className={classNames('emoji-picker-dropdown__menu', { selecting: modifierOpen })} style={style} ref={this.setRef}>\n        <EmojiPicker\n          perLine={8}\n          emojiSize={22}\n          sheetSize={32}\n          custom={buildCustomEmojis(custom_emojis)}\n          color=''\n          emoji=''\n          set='twitter'\n          title={title}\n          i18n={this.getI18n()}\n          onClick={this.handleClick}\n          include={categoriesSort}\n          recent={frequentlyUsedEmojis}\n          skin={skinTone}\n          showPreview={false}\n          backgroundImageFn={backgroundImageFn}\n          autoFocus\n          emojiTooltip\n        />\n\n        <ModifierPicker\n          active={modifierOpen}\n          modifier={skinTone}\n          onOpen={this.handleModifierOpen}\n          onClose={this.handleModifierClose}\n          onChange={this.handleModifierChange}\n        />\n      </div>\n    );\n  }\n\n}\n\nexport default @injectIntl\nclass EmojiPickerDropdown extends React.PureComponent {\n\n  static propTypes = {\n    custom_emojis: ImmutablePropTypes.list,\n    frequentlyUsedEmojis: PropTypes.arrayOf(PropTypes.string),\n    intl: PropTypes.object.isRequired,\n    onPickEmoji: PropTypes.func.isRequired,\n    onSkinTone: PropTypes.func.isRequired,\n    skinTone: PropTypes.number.isRequired,\n  };\n\n  state = {\n    active: false,\n    loading: false,\n  };\n\n  setRef = (c) => {\n    this.dropdown = c;\n  }\n\n  onShowDropdown = ({ target }) => {\n    this.setState({ active: true });\n\n    if (!EmojiPicker) {\n      this.setState({ loading: true });\n\n      EmojiPickerAsync().then(EmojiMart => {\n        EmojiPicker = EmojiMart.Picker;\n        Emoji       = EmojiMart.Emoji;\n\n        this.setState({ loading: false });\n      }).catch(() => {\n        this.setState({ loading: false });\n      });\n    }\n\n    const { top } = target.getBoundingClientRect();\n    this.setState({ placement: top * 2 < innerHeight ? 'bottom' : 'top' });\n  }\n\n  onHideDropdown = () => {\n    this.setState({ active: false });\n  }\n\n  onToggle = (e) => {\n    if (!this.state.loading && (!e.key || e.key === 'Enter')) {\n      if (this.state.active) {\n        this.onHideDropdown();\n      } else {\n        this.onShowDropdown(e);\n      }\n    }\n  }\n\n  handleKeyDown = e => {\n    if (e.key === 'Escape') {\n      this.onHideDropdown();\n    }\n  }\n\n  setTargetRef = c => {\n    this.target = c;\n  }\n\n  findTarget = () => {\n    return this.target;\n  }\n\n  render () {\n    const { intl, onPickEmoji, onSkinTone, skinTone, frequentlyUsedEmojis } = this.props;\n    const title = intl.formatMessage(messages.emoji);\n    const { active, loading, placement } = this.state;\n\n    return (\n      <div className='emoji-picker-dropdown' onKeyDown={this.handleKeyDown}>\n        <div ref={this.setTargetRef} className='emoji-button' title={title} aria-label={title} aria-expanded={active} role='button' onClick={this.onToggle} onKeyDown={this.onToggle} tabIndex={0}>\n          <img\n            className={classNames('emojione', { 'pulse-loading': active && loading })}\n            alt='🙂'\n            src={`${assetHost}/emoji/1f602.svg`}\n          />\n        </div>\n\n        <Overlay show={active} placement={placement} target={this.findTarget}>\n          <EmojiPickerMenu\n            custom_emojis={this.props.custom_emojis}\n            loading={loading}\n            onClose={this.onHideDropdown}\n            onPick={onPickEmoji}\n            onSkinTone={onSkinTone}\n            skinTone={skinTone}\n            frequentlyUsedEmojis={frequentlyUsedEmojis}\n          />\n        </Overlay>\n      </div>\n    );\n  }\n\n}\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport { length } from 'stringz';\n\nexport default class CharacterCounter extends React.PureComponent {\n\n  static propTypes = {\n    text: PropTypes.string.isRequired,\n    max: PropTypes.number.isRequired,\n  };\n\n  checkRemainingText (diff) {\n    if (diff < 0) {\n      return <span className='character-counter character-counter--over'>{diff}</span>;\n    }\n\n    return <span className='character-counter'>{diff}</span>;\n  }\n\n  render () {\n    const diff = this.props.max - length(this.props.text);\n    return this.checkRemainingText(diff);\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';\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      </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 AutosuggestAccountContainer from '../features/compose/containers/autosuggest_account_container';\nimport AutosuggestEmoji from './autosuggest_emoji';\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: 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 });\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) {\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 (typeof suggestion === 'object') {\n      inner = <AutosuggestEmoji emoji={suggestion} />;\n      key   = suggestion.id;\n    } else if (suggestion[0] === '#') {\n      inner = suggestion;\n      key   = suggestion;\n    } else {\n      inner = <AutosuggestAccountContainer id={suggestion} />;\n      key   = suggestion;\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 } = 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-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            onBlur={this.onBlur}\n            onPaste={this.onPaste}\n            style={style}\n            aria-autocomplete='list'\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';\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 (JPEG, PNG, GIF, WebM, MP4, MOV)' },\n});\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    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\n    const { intl, resetFileKey, disabled, acceptContentTypes } = this.props;\n\n    return (\n      <div className='compose-form__upload-button'>\n        <IconButton icon='camera' title={intl.formatMessage(messages.upload)} 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)}</span>\n          <input\n            key={resetFileKey}\n            ref={this.setRef}\n            type='file'\n            multiple={false}\n            accept={acceptContentTypes.toArray().join(',')}\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 > 3 || state.getIn(['compose', 'media_attachments']).some(m => m.get('type') === 'video')),\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\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 title={title} aria-label={title} className={`text-icon-button ${active ? 'active' : ''}`} aria-expanded={active} onClick={this.handleClick} aria-controls={ariaControls}>\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';\n\nconst messages = defineMessages({\n  public_short: { id: 'privacy.public.short', defaultMessage: 'Public' },\n  public_long: { id: 'privacy.public.long', defaultMessage: 'Post to public timelines' },\n  unlisted_short: { id: 'privacy.unlisted.short', defaultMessage: 'Unlisted' },\n  unlisted_long: { id: 'privacy.unlisted.long', defaultMessage: 'Do not show in public timelines' },\n  private_short: { id: 'privacy.private.short', defaultMessage: 'Followers-only' },\n  private_long: { id: 'privacy.private.long', defaultMessage: 'Post to followers only' },\n  direct_short: { id: 'privacy.direct.short', defaultMessage: 'Direct' },\n  direct_long: { id: 'privacy.direct.long', defaultMessage: 'Post to 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 '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 }} 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                  <i className={`fa fa-fw fa-${item.icon}`} />\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      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  handleClose = () => {\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-alt', 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) === 0 })}>\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            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 { connect } from 'react-redux';\nimport PropTypes from 'prop-types';\nimport classNames from 'classnames';\nimport IconButton from '../../../components/icon_button';\nimport { changeComposeSensitivity } from '../../../actions/compose';\nimport Motion from '../../ui/util/optional_motion';\nimport spring from 'react-motion/lib/spring';\nimport { injectIntl, defineMessages } 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  visible: state.getIn(['compose', 'media_attachments']).size > 0,\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    visible: PropTypes.bool,\n    active: PropTypes.bool,\n    disabled: PropTypes.bool,\n    onClick: PropTypes.func.isRequired,\n    intl: PropTypes.object.isRequired,\n  };\n\n  render () {\n    const { visible, active, disabled, onClick, intl } = this.props;\n\n    return (\n      <Motion defaultStyle={{ scale: 0.87 }} style={{ scale: spring(visible ? 1 : 0.87, { stiffness: 200, damping: 3 }) }}>\n        {({ scale }) => {\n          const icon = active ? 'eye-slash' : 'eye';\n          const className = classNames('compose-form__sensitive-button', {\n            'compose-form__sensitive-button--visible': visible,\n          });\n          return (\n            <div className={className} style={{ transform: `scale(${scale})` }}>\n              <IconButton\n                className='compose-form__sensitive-button__icon'\n                title={intl.formatMessage(active ? messages.marked : messages.unmarked)}\n                icon={icon}\n                onClick={onClick}\n                size={18}\n                active={active}\n                disabled={disabled}\n                style={{ lineHeight: null, height: null }}\n                inverted\n              />\n            </div>\n          );\n        }}\n      </Motion>\n    );\n  }\n\n}\n\nexport default connect(mapStateToProps, mapDispatchToProps)(injectIntl(SensitiveButton));\n","import { connect } from 'react-redux';\nimport EmojiPickerDropdown from '../components/emoji_picker_dropdown';\nimport { changeSetting } from '../../../actions/settings';\nimport { createSelector } from 'reselect';\nimport { Map as ImmutableMap } from 'immutable';\nimport { useEmoji } from '../../../actions/emojis';\n\nconst perLine = 8;\nconst lines   = 2;\n\nconst DEFAULTS = [\n  '+1',\n  'grinning',\n  'kissing_heart',\n  'heart_eyes',\n  'laughing',\n  'stuck_out_tongue_winking_eye',\n  'sweat_smile',\n  'joy',\n  'yum',\n  'disappointed',\n  'thinking_face',\n  'weary',\n  'sob',\n  'sunglasses',\n  'heart',\n  'ok_hand',\n];\n\nconst getFrequentlyUsedEmojis = createSelector([\n  state => state.getIn(['settings', 'frequentlyUsedEmojis'], ImmutableMap()),\n], emojiCounters => {\n  let emojis = emojiCounters\n    .keySeq()\n    .sort((a, b) => emojiCounters.get(a) - emojiCounters.get(b))\n    .reverse()\n    .slice(0, perLine * lines)\n    .toArray();\n\n  if (emojis.length < DEFAULTS.length) {\n    let uniqueDefaults = DEFAULTS.filter(emoji => !emojis.includes(emoji));\n    emojis = emojis.concat(uniqueDefaults.slice(0, DEFAULTS.length - emojis.length));\n  }\n\n  return emojis;\n});\n\nconst getCustomEmojis = createSelector([\n  state => state.get('custom_emojis'),\n], emojis => emojis.filter(e => e.get('visible_in_picker')).sort((a, b) => {\n  const aShort = a.get('shortcode').toLowerCase();\n  const bShort = b.get('shortcode').toLowerCase();\n\n  if (aShort < bShort) {\n    return -1;\n  } else if (aShort > bShort ) {\n    return 1;\n  } else {\n    return 0;\n  }\n}));\n\nconst mapStateToProps = state => ({\n  custom_emojis: getCustomEmojis(state),\n  skinTone: state.getIn(['settings', 'skinTone']),\n  frequentlyUsedEmojis: getFrequentlyUsedEmojis(state),\n});\n\nconst mapDispatchToProps = (dispatch, { onPickEmoji }) => ({\n  onSkinTone: skinTone => {\n    dispatch(changeSetting(['skinTone'], skinTone));\n  },\n\n  onPickEmoji: emoji => {\n    dispatch(useEmoji(emoji));\n\n    if (onPickEmoji) {\n      onPickEmoji(emoji);\n    }\n  },\n});\n\nexport default connect(mapStateToProps, mapDispatchToProps)(EmojiPickerDropdown);\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport Motion from '../../ui/util/optional_motion';\nimport spring from 'react-motion/lib/spring';\nimport { FormattedMessage } from 'react-intl';\n\nexport default class UploadProgress extends React.PureComponent {\n\n  static propTypes = {\n    active: PropTypes.bool,\n    progress: PropTypes.number,\n  };\n\n  render () {\n    const { active, progress } = this.props;\n\n    if (!active) {\n      return null;\n    }\n\n    return (\n      <div className='upload-progress'>\n        <div className='upload-progress__icon'>\n          <i className='fa fa-upload' />\n        </div>\n\n        <div className='upload-progress__message'>\n          <FormattedMessage id='upload_progress.label' defaultMessage='Uploading...' />\n\n          <div className='upload-progress__backdrop'>\n            <Motion defaultStyle={{ width: 0 }} style={{ width: spring(progress) }}>\n              {({ width }) =>\n                <div className='upload-progress__tracker' style={{ width: `${width}%` }} />\n              }\n            </Motion>\n          </div>\n        </div>\n      </div>\n    );\n  }\n\n}\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 { defineMessages, injectIntl, FormattedMessage } from 'react-intl';\nimport classNames from 'classnames';\n\nconst messages = defineMessages({\n  description: { id: 'upload_form.description', defaultMessage: 'Describe for the visually impaired' },\n});\n\nexport default @injectIntl\nclass Upload extends ImmutablePureComponent {\n\n  static contextTypes = {\n    router: PropTypes.object,\n  };\n\n  static propTypes = {\n    media: ImmutablePropTypes.map.isRequired,\n    intl: PropTypes.object.isRequired,\n    onUndo: PropTypes.func.isRequired,\n    onDescriptionChange: PropTypes.func.isRequired,\n    onOpenFocalPoint: PropTypes.func.isRequired,\n    onSubmit: PropTypes.func.isRequired,\n  };\n\n  state = {\n    hovered: false,\n    focused: false,\n    dirtyDescription: null,\n  };\n\n  handleKeyDown = (e) => {\n    if (e.keyCode === 13 && (e.ctrlKey || e.metaKey)) {\n      this.handleSubmit();\n    }\n  }\n\n  handleSubmit = () => {\n    this.handleInputBlur();\n    this.props.onSubmit(this.context.router.history);\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  handleInputChange = e => {\n    this.setState({ dirtyDescription: e.target.value });\n  }\n\n  handleMouseEnter = () => {\n    this.setState({ hovered: true });\n  }\n\n  handleMouseLeave = () => {\n    this.setState({ hovered: false });\n  }\n\n  handleInputFocus = () => {\n    this.setState({ focused: true });\n  }\n\n  handleClick = () => {\n    this.setState({ focused: true });\n  }\n\n  handleInputBlur = () => {\n    const { dirtyDescription } = this.state;\n\n    this.setState({ focused: false, dirtyDescription: null });\n\n    if (dirtyDescription !== null) {\n      this.props.onDescriptionChange(this.props.media.get('id'), dirtyDescription);\n    }\n  }\n\n  render () {\n    const { intl, media } = this.props;\n    const active          = this.state.hovered || this.state.focused;\n    const description     = this.state.dirtyDescription || (this.state.dirtyDescription !== '' && media.get('description')) || '';\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' onMouseEnter={this.handleMouseEnter} onMouseLeave={this.handleMouseLeave} onClick={this.handleClick} 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 })}>\n                <button className='icon-button' onClick={this.handleUndoClick}><i className='fa fa-times' /> <FormattedMessage id='upload_form.undo' defaultMessage='Delete' /></button>\n                {media.get('type') === 'image' && <button className='icon-button' onClick={this.handleFocalPointClick}><i className='fa fa-crosshairs' /> <FormattedMessage id='upload_form.focus' defaultMessage='Crop' /></button>}\n              </div>\n\n              <div className={classNames('compose-form__upload-description', { active })}>\n                <label>\n                  <span style={{ display: 'none' }}>{intl.formatMessage(messages.description)}</span>\n\n                  <input\n                    placeholder={intl.formatMessage(messages.description)}\n                    type='text'\n                    value={description}\n                    maxLength={420}\n                    onFocus={this.handleInputFocus}\n                    onChange={this.handleInputChange}\n                    onBlur={this.handleInputBlur}\n                    onKeyDown={this.handleKeyDown}\n                  />\n                </label>\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, changeUploadCompose } 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  onDescriptionChange: (id, description) => {\n    dispatch(changeUploadCompose(id, { description }));\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 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';\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 />\n\n        <div className='compose-form__uploads-wrapper'>\n          {mediaIds.map(id => (\n            <UploadContainer id={id} key={id} />\n          ))}\n        </div>\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 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 SensitiveButtonContainer from '../containers/sensitive_button_container';\nimport EmojiPickerDropdown from '../containers/emoji_picker_dropdown_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 { 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    suggestion_token: PropTypes.string,\n    suggestions: ImmutablePropTypes.list,\n    spoiler: PropTypes.bool,\n    privacy: PropTypes.string,\n    spoiler_text: PropTypes.string,\n    focusDate: PropTypes.instanceOf(Date),\n    caretPosition: PropTypes.number,\n    preselectDate: PropTypes.instanceOf(Date),\n    is_submitting: PropTypes.bool,\n    is_changing_upload: PropTypes.bool,\n    is_uploading: 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  };\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 { is_submitting, is_changing_upload, is_uploading, anyMedia } = this.props;\n    const fulltext = [this.props.spoiler_text, this.props.text].join('');\n\n    if (is_submitting || is_uploading || is_changing_upload || 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);\n  }\n\n  handleChangeSpoilerText = (e) => {\n    this.props.onChangeSpoilerText(e.target.value);\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.is_submitting && !this.props.is_submitting) {\n      this.autosuggestTextarea.textarea.focus();\n    } else if (this.props.spoiler !== prevProps.spoiler) {\n      if (this.props.spoiler) {\n        this.spoilerText.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  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.is_submitting;\n    const text     = [this.props.spoiler_text, this.props.text].join('');\n    const disabledButton = disabled || this.props.is_uploading || this.props.is_changing_upload || 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'><i className='fa fa-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' : ''}`}>\n          <label>\n            <span style={{ display: 'none' }}>{intl.formatMessage(messages.spoiler_placeholder)}</span>\n            <input placeholder={intl.formatMessage(messages.spoiler_placeholder)} value={this.props.spoiler_text} onChange={this.handleChangeSpoilerText} onKeyDown={this.handleKeyDown} type='text' className='spoiler-input__input'  id='cw-spoiler-input' ref={this.setSpoilerText} />\n          </label>\n        </div>\n\n        <div className='compose-form__autosuggest-wrapper'>\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            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\n          <EmojiPickerDropdown onPickEmoji={this.handleEmojiPick} />\n        </div>\n\n        <div className='compose-form__modifiers'>\n          <UploadFormContainer />\n        </div>\n\n        <div className='compose-form__buttons-wrapper'>\n          <div className='compose-form__buttons'>\n            <UploadButtonContainer />\n            <PrivacyDropdownContainer />\n            <SensitiveButtonContainer />\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 { uploadCompose } from '../../../actions/compose';\nimport {\n  changeCompose,\n  submitCompose,\n  clearComposeSuggestions,\n  fetchComposeSuggestions,\n  selectComposeSuggestion,\n  changeComposeSpoilerText,\n  insertEmojiCompose,\n} from '../../../actions/compose';\n\nconst mapStateToProps = state => ({\n  text: state.getIn(['compose', 'text']),\n  suggestion_token: state.getIn(['compose', 'suggestion_token']),\n  suggestions: state.getIn(['compose', 'suggestions']),\n  spoiler: state.getIn(['compose', 'spoiler']),\n  spoiler_text: 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  is_submitting: state.getIn(['compose', 'is_submitting']),\n  is_changing_upload: state.getIn(['compose', 'is_changing_upload']),\n  is_uploading: 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, accountId) {\n    dispatch(selectComposeSuggestion(position, token, accountId));\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 NavigationBar from '../components/navigation_bar';\nimport { me } from '../../../initial_state';\n\nconst mapStateToProps = state => {\n  return {\n    account: state.getIn(['accounts', me]),\n  };\n};\n\nexport default connect(mapStateToProps)(NavigationBar);\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport { defineMessages, injectIntl, FormattedMessage } from 'react-intl';\nimport Overlay from 'react-overlays/lib/Overlay';\nimport Motion from '../../ui/util/optional_motion';\nimport spring from 'react-motion/lib/spring';\nimport { searchEnabled } from '../../../initial_state';\n\nconst messages = defineMessages({\n  placeholder: { id: 'search.placeholder', defaultMessage: 'Search' },\n});\n\nclass SearchPopout extends React.PureComponent {\n\n  static propTypes = {\n    style: PropTypes.object,\n  };\n\n  render () {\n    const { style } = this.props;\n    const extraInformation = searchEnabled ? <FormattedMessage id='search_popout.tips.full_text' defaultMessage='Simple text returns statuses you have written, favourited, boosted, or have been mentioned in, as well as matching usernames, display names, and hashtags.' /> : <FormattedMessage id='search_popout.tips.text' defaultMessage='Simple text returns matching display names, usernames and hashtags' />;\n    return (\n      <div style={{ ...style, position: 'absolute', width: 315 }}>\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='search-popout' style={{ opacity: opacity, transform: `scale(${scaleX}, ${scaleY})` }}>\n              <h4><FormattedMessage id='search_popout.search_format' defaultMessage='Advanced search format' /></h4>\n\n              <ul>\n                <li><em>#example</em> <FormattedMessage id='search_popout.tips.hashtag' defaultMessage='hashtag' /></li>\n                <li><em>@username@domain</em> <FormattedMessage id='search_popout.tips.user' defaultMessage='user' /></li>\n                <li><em>URL</em> <FormattedMessage id='search_popout.tips.user' defaultMessage='user' /></li>\n                <li><em>URL</em> <FormattedMessage id='search_popout.tips.status' defaultMessage='status' /></li>\n              </ul>\n\n              {extraInformation}\n            </div>\n          )}\n        </Motion>\n      </div>\n    );\n  }\n\n}\n\nexport default @injectIntl\nclass Search extends React.PureComponent {\n\n  static propTypes = {\n    value: PropTypes.string.isRequired,\n    submitted: PropTypes.bool,\n    onChange: PropTypes.func.isRequired,\n    onSubmit: PropTypes.func.isRequired,\n    onClear: PropTypes.func.isRequired,\n    onShow: PropTypes.func.isRequired,\n    intl: PropTypes.object.isRequired,\n  };\n\n  state = {\n    expanded: false,\n  };\n\n  handleChange = (e) => {\n    this.props.onChange(e.target.value);\n  }\n\n  handleClear = (e) => {\n    e.preventDefault();\n\n    if (this.props.value.length > 0 || this.props.submitted) {\n      this.props.onClear();\n    }\n  }\n\n  handleKeyDown = (e) => {\n    if (e.key === 'Enter') {\n      e.preventDefault();\n      this.props.onSubmit();\n    } else if (e.key === 'Escape') {\n      document.querySelector('.ui').parentElement.focus();\n    }\n  }\n\n  noop () {\n\n  }\n\n  handleFocus = () => {\n    this.setState({ expanded: true });\n    this.props.onShow();\n  }\n\n  handleBlur = () => {\n    this.setState({ expanded: false });\n  }\n\n  render () {\n    const { intl, value, submitted } = this.props;\n    const { expanded } = this.state;\n    const hasValue = value.length > 0 || submitted;\n\n    return (\n      <div className='search'>\n        <label>\n          <span style={{ display: 'none' }}>{intl.formatMessage(messages.placeholder)}</span>\n          <input\n            className='search__input'\n            type='text'\n            placeholder={intl.formatMessage(messages.placeholder)}\n            value={value}\n            onChange={this.handleChange}\n            onKeyUp={this.handleKeyDown}\n            onFocus={this.handleFocus}\n            onBlur={this.handleBlur}\n          />\n        </label>\n\n        <div role='button' tabIndex='0' className='search__icon' onClick={this.handleClear}>\n          <i className={`fa fa-search ${hasValue ? '' : 'active'}`} />\n          <i aria-label={intl.formatMessage(messages.placeholder)} className={`fa fa-times-circle ${hasValue ? 'active' : ''}`} />\n        </div>\n\n        <Overlay show={expanded && !hasValue} placement='bottom' target={this}>\n          <SearchPopout />\n        </Overlay>\n      </div>\n    );\n  }\n\n}\n","import { connect } from 'react-redux';\nimport {\n  changeSearch,\n  clearSearch,\n  submitSearch,\n  showSearch,\n} from '../../../actions/search';\nimport Search from '../components/search';\n\nconst mapStateToProps = state => ({\n  value: state.getIn(['search', 'value']),\n  submitted: state.getIn(['search', 'submitted']),\n});\n\nconst mapDispatchToProps = dispatch => ({\n\n  onChange (value) {\n    dispatch(changeSearch(value));\n  },\n\n  onClear () {\n    dispatch(clearSearch());\n  },\n\n  onSubmit () {\n    dispatch(submitSearch());\n  },\n\n  onShow () {\n    dispatch(showSearch());\n  },\n\n});\n\nexport default connect(mapStateToProps, mapDispatchToProps)(Search);\n","import React from 'react';\nimport { Sparklines, SparklinesCurve } from 'react-sparklines';\nimport { FormattedMessage } from 'react-intl';\nimport ImmutablePropTypes from 'react-immutable-proptypes';\nimport Permalink from './permalink';\nimport { shortNumberFormat } from '../utils/numbers';\n\nconst Hashtag = ({ hashtag }) => (\n  <div className='trends__item'>\n    <div className='trends__item__name'>\n      <Permalink href={hashtag.get('url')} to={`/timelines/tag/${hashtag.get('name')}`}>\n        #<span>{hashtag.get('name')}</span>\n      </Permalink>\n\n      <FormattedMessage id='trends.count_by_accounts' defaultMessage='{count} {rawCount, plural, one {person} other {people}} talking' values={{ rawCount: hashtag.getIn(['history', 0, 'accounts']), count: <strong>{shortNumberFormat(hashtag.getIn(['history', 0, 'accounts']))}</strong> }} />\n    </div>\n\n    <div className='trends__item__current'>\n      {shortNumberFormat(hashtag.getIn(['history', 0, 'uses']))}\n    </div>\n\n    <div className='trends__item__sparkline'>\n      <Sparklines width={50} height={28} data={hashtag.get('history') && hashtag.get('history').reverse().map(day => day.get('uses')).toArray()}>\n        <SparklinesCurve style={{ fill: 'none' }} />\n      </Sparklines>\n    </div>\n  </div>\n);\n\nHashtag.propTypes = {\n  hashtag: ImmutablePropTypes.map.isRequired,\n};\n\nexport default Hashtag;\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport ImmutablePropTypes from 'react-immutable-proptypes';\nimport { FormattedMessage, defineMessages, injectIntl } from 'react-intl';\nimport AccountContainer from '../../../containers/account_container';\nimport StatusContainer from '../../../containers/status_container';\nimport ImmutablePureComponent from 'react-immutable-pure-component';\nimport Hashtag from '../../../components/hashtag';\n\nconst messages = defineMessages({\n  dismissSuggestion: { id: 'suggestions.dismiss', defaultMessage: 'Dismiss suggestion' },\n});\n\nexport default @injectIntl\nclass SearchResults extends ImmutablePureComponent {\n\n  static propTypes = {\n    results: ImmutablePropTypes.map.isRequired,\n    suggestions: ImmutablePropTypes.list.isRequired,\n    fetchSuggestions: PropTypes.func.isRequired,\n    dismissSuggestion: PropTypes.func.isRequired,\n    intl: PropTypes.object.isRequired,\n  };\n\n  componentDidMount () {\n    this.props.fetchSuggestions();\n  }\n\n  render () {\n    const { intl, results, suggestions, dismissSuggestion } = this.props;\n\n    if (results.isEmpty() && !suggestions.isEmpty()) {\n      return (\n        <div className='search-results'>\n          <div className='trends'>\n            <div className='trends__header'>\n              <i className='fa fa-user-plus fa-fw' />\n              <FormattedMessage id='suggestions.header' defaultMessage='You might be interested in…' />\n            </div>\n\n            {suggestions && suggestions.map(accountId => (\n              <AccountContainer\n                key={accountId}\n                id={accountId}\n                actionIcon='times'\n                actionTitle={intl.formatMessage(messages.dismissSuggestion)}\n                onActionClick={dismissSuggestion}\n              />\n            ))}\n          </div>\n        </div>\n      );\n    }\n\n    let accounts, statuses, hashtags;\n    let count = 0;\n\n    if (results.get('accounts') && results.get('accounts').size > 0) {\n      count   += results.get('accounts').size;\n      accounts = (\n        <div className='search-results__section'>\n          <h5><i className='fa fa-fw fa-users' /><FormattedMessage id='search_results.accounts' defaultMessage='People' /></h5>\n\n          {results.get('accounts').map(accountId => <AccountContainer key={accountId} id={accountId} />)}\n        </div>\n      );\n    }\n\n    if (results.get('statuses') && results.get('statuses').size > 0) {\n      count   += results.get('statuses').size;\n      statuses = (\n        <div className='search-results__section'>\n          <h5><i className='fa fa-fw fa-quote-right' /><FormattedMessage id='search_results.statuses' defaultMessage='Toots' /></h5>\n\n          {results.get('statuses').map(statusId => <StatusContainer key={statusId} id={statusId} />)}\n        </div>\n      );\n    }\n\n    if (results.get('hashtags') && results.get('hashtags').size > 0) {\n      count += results.get('hashtags').size;\n      hashtags = (\n        <div className='search-results__section'>\n          <h5><i className='fa fa-fw fa-hashtag' /><FormattedMessage id='search_results.hashtags' defaultMessage='Hashtags' /></h5>\n\n          {results.get('hashtags').map(hashtag => <Hashtag key={hashtag.get('name')} hashtag={hashtag} />)}\n        </div>\n      );\n    }\n\n    return (\n      <div className='search-results'>\n        <div className='search-results__header'>\n          <i className='fa fa-search fa-fw' />\n          <FormattedMessage id='search_results.total' defaultMessage='{count, number} {count, plural, one {result} other {results}}' values={{ count }} />\n        </div>\n\n        {accounts}\n        {statuses}\n        {hashtags}\n      </div>\n    );\n  }\n\n}\n","import { connect } from 'react-redux';\nimport SearchResults from '../components/search_results';\nimport { fetchSuggestions, dismissSuggestion } from '../../../actions/suggestions';\n\nconst mapStateToProps = state => ({\n  results: state.getIn(['search', 'results']),\n  suggestions: state.getIn(['suggestions', 'items']),\n});\n\nconst mapDispatchToProps = dispatch => ({\n  fetchSuggestions: () => dispatch(fetchSuggestions()),\n  dismissSuggestion: account => dispatch(dismissSuggestion(account.get('id'))),\n});\n\nexport default connect(mapStateToProps, mapDispatchToProps)(SearchResults);\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 { mascot } from '../../initial_state';\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});\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  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)}><i role='img' className='fa fa-fw fa-bars' /></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)}><i role='img' className='fa fa-fw fa-home' /></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)}><i role='img' className='fa fa-fw fa-bell' /></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)}><i role='img' className='fa fa-fw fa-users' /></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)}><i role='img' className='fa fa-fw fa-globe' /></Link>\n          )}\n          <a href='/user-settings' className='drawer__tab' title={intl.formatMessage(messages.preferences)} aria-label={intl.formatMessage(messages.preferences)}><i role='img' className='fa fa-fw fa-cog' /></a>\n          <a href='/auth/sign_out' className='drawer__tab' data-method='delete' title={intl.formatMessage(messages.logout)} aria-label={intl.formatMessage(messages.logout)}><i role='img' className='fa fa-fw fa-sign-out' /></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            <ComposeFormContainer />\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":""}
\ No newline at end of file
+{"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/emoji_picker_dropdown.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/containers/emoji_picker_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","EmojiPicker","Emoji","messages","defineMessages","emoji_search","emoji_not_found","recent","search_results","people","nature","food","activity","travel","objects","symbols","flags","backgroundImageFn","listenerOptions","detectPassiveEvents","hasSupport","passive","ModifierPickerMenu","e","onSelect","currentTarget","getAttribute","node","contains","target","onClose","c","componentWillReceiveProps","nextProps","active","attachListeners","removeListeners","componentWillUnmount","document","addEventListener","handleDocumentClick","removeEventListener","style","display","ref","setRef","onClick","handleClick","data-index","set","size","sheetSize","skin","ModifierPicker","onOpen","modifier","onChange","handleSelect","EmojiPickerMenu","injectIntl","modifierOpen","placement","intl","search","formatMessage","notfound","categories","foods","places","onPick","setState","onSkinTone","componentDidMount","loading","custom_emojis","skinTone","frequentlyUsedEmojis","width","title","state","categoriesSort","splice","Array","from","categoriesFromEmojis","sort","classNames","selecting","perLine","emojiSize","buildCustomEmojis","color","i18n","getI18n","include","showPreview","autoFocus","emojiTooltip","handleModifierOpen","handleModifierClose","handleModifierChange","EmojiPickerDropdown","dropdown","EmojiPickerAsync","then","EmojiMart","Picker","catch","top","getBoundingClientRect","innerHeight","key","onHideDropdown","onShowDropdown","onPickEmoji","onKeyDown","handleKeyDown","setTargetRef","aria-label","aria-expanded","role","onToggle","tabIndex","show","findTarget","cancel","ReplyIndicator","onCancel","button","ctrlKey","metaKey","preventDefault","context","router","history","push","status","getIn","content","__html","get","direction","isRtl","icon","inverted","href","handleAccountClick","account","dangerouslySetInnerHTML","compact","media","ImmutablePureComponent","PropTypes","object","ImmutablePropTypes","map","func","isRequired","connect","getStatus","makeGetStatus","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","right","trim","length","indexOf","toLowerCase","AutosuggestTextarea","suggestionsHidden","focused","selectedSuggestion","lastToken","tokenStart","value","selectionStart","token","onSuggestionsFetchRequested","onSuggestionsClearRequested","suggestions","disabled","which","isComposing","querySelector","parentElement","focus","Math","min","max","stopPropagation","onSuggestionSelected","defaultPrevented","onFocus","suggestion","textarea","clipboardData","files","onPaste","i","inner","type","selected","onMouseDown","onSuggestionClick","placeholder","onKeyUp","children","inputRef","setTextarea","onBlur","aria-autocomplete","isEmpty","renderSuggestion","string","list","bool","searchTokens","AutosuggestInput","input","maxLength","setInput","arrayOf","number","ImmutableList","add_poll","remove_poll","iconStyle","height","lineHeight","PollButton","unavailable","_","getState","removePoll","addPoll","upload","UploadButton","acceptContentTypes","onSelectFile","fileElement","click","resetFileKey","formats","multiple","handleChange","listOf","some","m","includes","uploadCompose","TextIconButton","label","ariaControls","aria-controls","marked","unmarked","changeComposeSpoilerness","public_short","public_long","unlisted_short","unlisted_long","private_short","private_long","direct_short","direct_long","change_privacy","PrivacyDropdownMenu","mounted","element","items","index","findIndex","item","childNodes","shiftKey","lastChild","firstChild","focusedItem","defaultStyle","opacity","scaleX","scaleY","spring","damping","stiffness","transform","zIndex","aria-selected","setFocusRef","fixedWidth","text","meta","PrivacyDropdown","open","isUserTouching","onModalClose","onModalOpen","actions","options","option","handleModalActionClick","activeElement","handleClose","handleMouseDown","componentWillMount","valueOption","find","expanded","handleToggle","handleButtonKeyDown","isModalOpen","modalType","changeComposeVisibility","openModal","closeModal","DEFAULTS","getFrequentlyUsedEmojis","createSelector","ImmutableMap","emojiCounters","emojis","keySeq","a","b","reverse","toArray","uniqueDefaults","filter","concat","getCustomEmojis","aShort","bShort","changeSetting","useEmoji","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","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","elephantUIPlane","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 PropTypes from 'prop-types';\nimport { defineMessages, injectIntl } from 'react-intl';\nimport { EmojiPicker as EmojiPickerAsync } from '../../ui/util/async-components';\nimport Overlay from 'react-overlays/lib/Overlay';\nimport classNames from 'classnames';\nimport ImmutablePropTypes from 'react-immutable-proptypes';\nimport detectPassiveEvents from 'detect-passive-events';\nimport { buildCustomEmojis, categoriesFromEmojis } from '../../emoji/emoji';\n\nconst messages = defineMessages({\n  emoji: { id: 'emoji_button.label', defaultMessage: 'Insert emoji' },\n  emoji_search: { id: 'emoji_button.search', defaultMessage: 'Search...' },\n  emoji_not_found: { id: 'emoji_button.not_found', defaultMessage: 'No emojos!! (╯°□°)╯︵ ┻━┻' },\n  custom: { id: 'emoji_button.custom', defaultMessage: 'Custom' },\n  recent: { id: 'emoji_button.recent', defaultMessage: 'Frequently used' },\n  search_results: { id: 'emoji_button.search_results', defaultMessage: 'Search results' },\n  people: { id: 'emoji_button.people', defaultMessage: 'People' },\n  nature: { id: 'emoji_button.nature', defaultMessage: 'Nature' },\n  food: { id: 'emoji_button.food', defaultMessage: 'Food & Drink' },\n  activity: { id: 'emoji_button.activity', defaultMessage: 'Activity' },\n  travel: { id: 'emoji_button.travel', defaultMessage: 'Travel & Places' },\n  objects: { id: 'emoji_button.objects', defaultMessage: 'Objects' },\n  symbols: { id: 'emoji_button.symbols', defaultMessage: 'Symbols' },\n  flags: { id: 'emoji_button.flags', defaultMessage: 'Flags' },\n});\n\nconst assetHost = process.env.CDN_HOST || '';\nlet EmojiPicker, Emoji; // load asynchronously\n\nconst backgroundImageFn = () => `${assetHost}/emoji/sheet_10.png`;\nconst listenerOptions = detectPassiveEvents.hasSupport ? { passive: true } : false;\n\nclass ModifierPickerMenu extends React.PureComponent {\n\n  static propTypes = {\n    active: PropTypes.bool,\n    onSelect: PropTypes.func.isRequired,\n    onClose: PropTypes.func.isRequired,\n  };\n\n  handleClick = e => {\n    this.props.onSelect(e.currentTarget.getAttribute('data-index') * 1);\n  }\n\n  componentWillReceiveProps (nextProps) {\n    if (nextProps.active) {\n      this.attachListeners();\n    } else {\n      this.removeListeners();\n    }\n  }\n\n  componentWillUnmount () {\n    this.removeListeners();\n  }\n\n  handleDocumentClick = e => {\n    if (this.node && !this.node.contains(e.target)) {\n      this.props.onClose();\n    }\n  }\n\n  attachListeners () {\n    document.addEventListener('click', this.handleDocumentClick, false);\n    document.addEventListener('touchend', this.handleDocumentClick, listenerOptions);\n  }\n\n  removeListeners () {\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  render () {\n    const { active } = this.props;\n\n    return (\n      <div className='emoji-picker-dropdown__modifiers__menu' style={{ display: active ? 'block' : 'none' }} ref={this.setRef}>\n        <button onClick={this.handleClick} data-index={1}><Emoji emoji='fist' set='twitter' size={22} sheetSize={32} skin={1} backgroundImageFn={backgroundImageFn} /></button>\n        <button onClick={this.handleClick} data-index={2}><Emoji emoji='fist' set='twitter' size={22} sheetSize={32} skin={2} backgroundImageFn={backgroundImageFn} /></button>\n        <button onClick={this.handleClick} data-index={3}><Emoji emoji='fist' set='twitter' size={22} sheetSize={32} skin={3} backgroundImageFn={backgroundImageFn} /></button>\n        <button onClick={this.handleClick} data-index={4}><Emoji emoji='fist' set='twitter' size={22} sheetSize={32} skin={4} backgroundImageFn={backgroundImageFn} /></button>\n        <button onClick={this.handleClick} data-index={5}><Emoji emoji='fist' set='twitter' size={22} sheetSize={32} skin={5} backgroundImageFn={backgroundImageFn} /></button>\n        <button onClick={this.handleClick} data-index={6}><Emoji emoji='fist' set='twitter' size={22} sheetSize={32} skin={6} backgroundImageFn={backgroundImageFn} /></button>\n      </div>\n    );\n  }\n\n}\n\nclass ModifierPicker extends React.PureComponent {\n\n  static propTypes = {\n    active: PropTypes.bool,\n    modifier: PropTypes.number,\n    onChange: PropTypes.func,\n    onClose: PropTypes.func,\n    onOpen: PropTypes.func,\n  };\n\n  handleClick = () => {\n    if (this.props.active) {\n      this.props.onClose();\n    } else {\n      this.props.onOpen();\n    }\n  }\n\n  handleSelect = modifier => {\n    this.props.onChange(modifier);\n    this.props.onClose();\n  }\n\n  render () {\n    const { active, modifier } = this.props;\n\n    return (\n      <div className='emoji-picker-dropdown__modifiers'>\n        <Emoji emoji='fist' set='twitter' size={22} sheetSize={32} skin={modifier} onClick={this.handleClick} backgroundImageFn={backgroundImageFn} />\n        <ModifierPickerMenu active={active} onSelect={this.handleSelect} onClose={this.props.onClose} />\n      </div>\n    );\n  }\n\n}\n\n@injectIntl\nclass EmojiPickerMenu extends React.PureComponent {\n\n  static propTypes = {\n    custom_emojis: ImmutablePropTypes.list,\n    frequentlyUsedEmojis: PropTypes.arrayOf(PropTypes.string),\n    loading: PropTypes.bool,\n    onClose: PropTypes.func.isRequired,\n    onPick: PropTypes.func.isRequired,\n    style: PropTypes.object,\n    placement: PropTypes.string,\n    arrowOffsetLeft: PropTypes.string,\n    arrowOffsetTop: PropTypes.string,\n    intl: PropTypes.object.isRequired,\n    skinTone: PropTypes.number.isRequired,\n    onSkinTone: PropTypes.func.isRequired,\n  };\n\n  static defaultProps = {\n    style: {},\n    loading: true,\n    frequentlyUsedEmojis: [],\n  };\n\n  state = {\n    modifierOpen: false,\n    placement: null,\n  };\n\n  handleDocumentClick = e => {\n    if (this.node && !this.node.contains(e.target)) {\n      this.props.onClose();\n    }\n  }\n\n  componentDidMount () {\n    document.addEventListener('click', this.handleDocumentClick, false);\n    document.addEventListener('touchend', this.handleDocumentClick, listenerOptions);\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  getI18n = () => {\n    const { intl } = this.props;\n\n    return {\n      search: intl.formatMessage(messages.emoji_search),\n      notfound: intl.formatMessage(messages.emoji_not_found),\n      categories: {\n        search: intl.formatMessage(messages.search_results),\n        recent: intl.formatMessage(messages.recent),\n        people: intl.formatMessage(messages.people),\n        nature: intl.formatMessage(messages.nature),\n        foods: intl.formatMessage(messages.food),\n        activity: intl.formatMessage(messages.activity),\n        places: intl.formatMessage(messages.travel),\n        objects: intl.formatMessage(messages.objects),\n        symbols: intl.formatMessage(messages.symbols),\n        flags: intl.formatMessage(messages.flags),\n        custom: intl.formatMessage(messages.custom),\n      },\n    };\n  }\n\n  handleClick = emoji => {\n    if (!emoji.native) {\n      emoji.native = emoji.colons;\n    }\n\n    this.props.onClose();\n    this.props.onPick(emoji);\n  }\n\n  handleModifierOpen = () => {\n    this.setState({ modifierOpen: true });\n  }\n\n  handleModifierClose = () => {\n    this.setState({ modifierOpen: false });\n  }\n\n  handleModifierChange = modifier => {\n    this.props.onSkinTone(modifier);\n  }\n\n  render () {\n    const { loading, style, intl, custom_emojis, skinTone, frequentlyUsedEmojis } = this.props;\n\n    if (loading) {\n      return <div style={{ width: 299 }} />;\n    }\n\n    const title = intl.formatMessage(messages.emoji);\n\n    const { modifierOpen } = this.state;\n\n    const categoriesSort = [\n      'recent',\n      'people',\n      'nature',\n      'foods',\n      'activity',\n      'places',\n      'objects',\n      'symbols',\n      'flags',\n    ];\n\n    categoriesSort.splice(1, 0, ...Array.from(categoriesFromEmojis(custom_emojis)).sort());\n\n    return (\n      <div className={classNames('emoji-picker-dropdown__menu', { selecting: modifierOpen })} style={style} ref={this.setRef}>\n        <EmojiPicker\n          perLine={8}\n          emojiSize={22}\n          sheetSize={32}\n          custom={buildCustomEmojis(custom_emojis)}\n          color=''\n          emoji=''\n          set='twitter'\n          title={title}\n          i18n={this.getI18n()}\n          onClick={this.handleClick}\n          include={categoriesSort}\n          recent={frequentlyUsedEmojis}\n          skin={skinTone}\n          showPreview={false}\n          backgroundImageFn={backgroundImageFn}\n          autoFocus\n          emojiTooltip\n        />\n\n        <ModifierPicker\n          active={modifierOpen}\n          modifier={skinTone}\n          onOpen={this.handleModifierOpen}\n          onClose={this.handleModifierClose}\n          onChange={this.handleModifierChange}\n        />\n      </div>\n    );\n  }\n\n}\n\nexport default @injectIntl\nclass EmojiPickerDropdown extends React.PureComponent {\n\n  static propTypes = {\n    custom_emojis: ImmutablePropTypes.list,\n    frequentlyUsedEmojis: PropTypes.arrayOf(PropTypes.string),\n    intl: PropTypes.object.isRequired,\n    onPickEmoji: PropTypes.func.isRequired,\n    onSkinTone: PropTypes.func.isRequired,\n    skinTone: PropTypes.number.isRequired,\n  };\n\n  state = {\n    active: false,\n    loading: false,\n  };\n\n  setRef = (c) => {\n    this.dropdown = c;\n  }\n\n  onShowDropdown = ({ target }) => {\n    this.setState({ active: true });\n\n    if (!EmojiPicker) {\n      this.setState({ loading: true });\n\n      EmojiPickerAsync().then(EmojiMart => {\n        EmojiPicker = EmojiMart.Picker;\n        Emoji       = EmojiMart.Emoji;\n\n        this.setState({ loading: false });\n      }).catch(() => {\n        this.setState({ loading: false });\n      });\n    }\n\n    const { top } = target.getBoundingClientRect();\n    this.setState({ placement: top * 2 < innerHeight ? 'bottom' : 'top' });\n  }\n\n  onHideDropdown = () => {\n    this.setState({ active: false });\n  }\n\n  onToggle = (e) => {\n    if (!this.state.loading && (!e.key || e.key === 'Enter')) {\n      if (this.state.active) {\n        this.onHideDropdown();\n      } else {\n        this.onShowDropdown(e);\n      }\n    }\n  }\n\n  handleKeyDown = e => {\n    if (e.key === 'Escape') {\n      this.onHideDropdown();\n    }\n  }\n\n  setTargetRef = c => {\n    this.target = c;\n  }\n\n  findTarget = () => {\n    return this.target;\n  }\n\n  render () {\n    const { intl, onPickEmoji, onSkinTone, skinTone, frequentlyUsedEmojis } = this.props;\n    const title = intl.formatMessage(messages.emoji);\n    const { active, loading, placement } = this.state;\n\n    return (\n      <div className='emoji-picker-dropdown' onKeyDown={this.handleKeyDown}>\n        <div ref={this.setTargetRef} className='emoji-button' title={title} aria-label={title} aria-expanded={active} role='button' onClick={this.onToggle} onKeyDown={this.onToggle} tabIndex={0}>\n          <img\n            className={classNames('emojione', { 'pulse-loading': active && loading })}\n            alt='🙂'\n            src={`${assetHost}/emoji/1f602.svg`}\n          />\n        </div>\n\n        <Overlay show={active} placement={placement} target={this.findTarget}>\n          <EmojiPickerMenu\n            custom_emojis={this.props.custom_emojis}\n            loading={loading}\n            onClose={this.onHideDropdown}\n            onPick={onPickEmoji}\n            onSkinTone={onSkinTone}\n            skinTone={skinTone}\n            frequentlyUsedEmojis={frequentlyUsedEmojis}\n          />\n        </Overlay>\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: 'Post to public timelines' },\n  unlisted_short: { id: 'privacy.unlisted.short', defaultMessage: 'Unlisted' },\n  unlisted_long: { id: 'privacy.unlisted.long', defaultMessage: 'Do not show in public timelines' },\n  private_short: { id: 'privacy.private.short', defaultMessage: 'Followers-only' },\n  private_long: { id: 'privacy.private.long', defaultMessage: 'Post to followers only' },\n  direct_short: { id: 'privacy.direct.short', defaultMessage: 'Direct' },\n  direct_long: { id: 'privacy.direct.long', defaultMessage: 'Post to 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 { connect } from 'react-redux';\nimport EmojiPickerDropdown from '../components/emoji_picker_dropdown';\nimport { changeSetting } from '../../../actions/settings';\nimport { createSelector } from 'reselect';\nimport { Map as ImmutableMap } from 'immutable';\nimport { useEmoji } from '../../../actions/emojis';\n\nconst perLine = 8;\nconst lines   = 2;\n\nconst DEFAULTS = [\n  '+1',\n  'grinning',\n  'kissing_heart',\n  'heart_eyes',\n  'laughing',\n  'stuck_out_tongue_winking_eye',\n  'sweat_smile',\n  'joy',\n  'yum',\n  'disappointed',\n  'thinking_face',\n  'weary',\n  'sob',\n  'sunglasses',\n  'heart',\n  'ok_hand',\n];\n\nconst getFrequentlyUsedEmojis = createSelector([\n  state => state.getIn(['settings', 'frequentlyUsedEmojis'], ImmutableMap()),\n], emojiCounters => {\n  let emojis = emojiCounters\n    .keySeq()\n    .sort((a, b) => emojiCounters.get(a) - emojiCounters.get(b))\n    .reverse()\n    .slice(0, perLine * lines)\n    .toArray();\n\n  if (emojis.length < DEFAULTS.length) {\n    let uniqueDefaults = DEFAULTS.filter(emoji => !emojis.includes(emoji));\n    emojis = emojis.concat(uniqueDefaults.slice(0, DEFAULTS.length - emojis.length));\n  }\n\n  return emojis;\n});\n\nconst getCustomEmojis = createSelector([\n  state => state.get('custom_emojis'),\n], emojis => emojis.filter(e => e.get('visible_in_picker')).sort((a, b) => {\n  const aShort = a.get('shortcode').toLowerCase();\n  const bShort = b.get('shortcode').toLowerCase();\n\n  if (aShort < bShort) {\n    return -1;\n  } else if (aShort > bShort ) {\n    return 1;\n  } else {\n    return 0;\n  }\n}));\n\nconst mapStateToProps = state => ({\n  custom_emojis: getCustomEmojis(state),\n  skinTone: state.getIn(['settings', 'skinTone']),\n  frequentlyUsedEmojis: getFrequentlyUsedEmojis(state),\n});\n\nconst mapDispatchToProps = (dispatch, { onPickEmoji }) => ({\n  onSkinTone: skinTone => {\n    dispatch(changeSetting(['skinTone'], skinTone));\n  },\n\n  onPickEmoji: emoji => {\n    dispatch(useEmoji(emoji));\n\n    if (onPickEmoji) {\n      onPickEmoji(emoji);\n    }\n  },\n});\n\nexport default connect(mapStateToProps, mapDispatchToProps)(EmojiPickerDropdown);\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__text 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          <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            <div className='drawer__inner__mastodon'>\n              <img alt='' draggable='false' src={mascot || elephantUIPlane} />\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":""}
\ No newline at end of file