Upgrade ESlint to v8 (#23305)
This commit is contained in:
		
							parent
							
								
									b58bf74e35
								
							
						
					
					
						commit
						c49213f0ea
					
				
					 120 changed files with 832 additions and 810 deletions
				
			
		|  | @ -47,27 +47,27 @@ class Account extends ImmutablePureComponent { | |||
| 
 | ||||
|   handleFollow = () => { | ||||
|     this.props.onFollow(this.props.account); | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   handleBlock = () => { | ||||
|     this.props.onBlock(this.props.account); | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   handleMute = () => { | ||||
|     this.props.onMute(this.props.account); | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   handleMuteNotifications = () => { | ||||
|     this.props.onMuteNotifications(this.props.account, true); | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   handleUnmuteNotifications = () => { | ||||
|     this.props.onMuteNotifications(this.props.account, false); | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   handleAction = () => { | ||||
|     this.props.onActionClick(this.props.account); | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   render () { | ||||
|     const { account, intl, hidden, onActionClick, actionIcon, actionTitle, defaultAction, size } = this.props; | ||||
|  |  | |||
|  | @ -38,13 +38,13 @@ export default class AnimatedNumber extends React.PureComponent { | |||
|     const { direction } = this.state; | ||||
| 
 | ||||
|     return { y: -1 * direction }; | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   willLeave = () => { | ||||
|     const { direction } = this.state; | ||||
| 
 | ||||
|     return { y: spring(1 * direction, { damping: 35, stiffness: 400 }) }; | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   render () { | ||||
|     const { value, obfuscate } = this.props; | ||||
|  |  | |||
|  | @ -78,7 +78,7 @@ export default class AutosuggestInput extends ImmutablePureComponent { | |||
|     } | ||||
| 
 | ||||
|     this.props.onChange(e); | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   onKeyDown = (e) => { | ||||
|     const { suggestions, disabled } = this.props; | ||||
|  | @ -136,22 +136,22 @@ export default class AutosuggestInput extends ImmutablePureComponent { | |||
|     } | ||||
| 
 | ||||
|     this.props.onKeyDown(e); | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   onBlur = () => { | ||||
|     this.setState({ suggestionsHidden: true, focused: false }); | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   onFocus = () => { | ||||
|     this.setState({ focused: true }); | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   onSuggestionClick = (e) => { | ||||
|     const suggestion = this.props.suggestions.get(e.currentTarget.getAttribute('data-index')); | ||||
|     e.preventDefault(); | ||||
|     this.props.onSuggestionSelected(this.state.tokenStart, this.state.lastToken, suggestion); | ||||
|     this.input.focus(); | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   componentWillReceiveProps (nextProps) { | ||||
|     if (nextProps.suggestions !== this.props.suggestions && nextProps.suggestions.size > 0 && this.state.suggestionsHidden && this.state.focused) { | ||||
|  | @ -161,7 +161,7 @@ export default class AutosuggestInput extends ImmutablePureComponent { | |||
| 
 | ||||
|   setInput = (c) => { | ||||
|     this.input = c; | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   renderSuggestion = (suggestion, i) => { | ||||
|     const { selectedSuggestion } = this.state; | ||||
|  | @ -183,7 +183,7 @@ export default class AutosuggestInput extends ImmutablePureComponent { | |||
|         {inner} | ||||
|       </div> | ||||
|     ); | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   render () { | ||||
|     const { value, suggestions, disabled, placeholder, onKeyUp, autoFocus, className, id, maxLength, lang } = this.props; | ||||
|  |  | |||
|  | @ -75,7 +75,7 @@ export default class AutosuggestTextarea extends ImmutablePureComponent { | |||
|     } | ||||
| 
 | ||||
|     this.props.onChange(e); | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   onKeyDown = (e) => { | ||||
|     const { suggestions, disabled } = this.props; | ||||
|  | @ -133,25 +133,25 @@ export default class AutosuggestTextarea extends ImmutablePureComponent { | |||
|     } | ||||
| 
 | ||||
|     this.props.onKeyDown(e); | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   onBlur = () => { | ||||
|     this.setState({ suggestionsHidden: true, focused: false }); | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   onFocus = (e) => { | ||||
|     this.setState({ focused: true }); | ||||
|     if (this.props.onFocus) { | ||||
|       this.props.onFocus(e); | ||||
|     } | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   onSuggestionClick = (e) => { | ||||
|     const suggestion = this.props.suggestions.get(e.currentTarget.getAttribute('data-index')); | ||||
|     e.preventDefault(); | ||||
|     this.props.onSuggestionSelected(this.state.tokenStart, this.state.lastToken, suggestion); | ||||
|     this.textarea.focus(); | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   componentWillReceiveProps (nextProps) { | ||||
|     if (nextProps.suggestions !== this.props.suggestions && nextProps.suggestions.size > 0 && this.state.suggestionsHidden && this.state.focused) { | ||||
|  | @ -161,14 +161,14 @@ export default class AutosuggestTextarea extends ImmutablePureComponent { | |||
| 
 | ||||
|   setTextarea = (c) => { | ||||
|     this.textarea = c; | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   onPaste = (e) => { | ||||
|     if (e.clipboardData && e.clipboardData.files.length === 1) { | ||||
|       this.props.onPaste(e.clipboardData.files); | ||||
|       e.preventDefault(); | ||||
|     } | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   renderSuggestion = (suggestion, i) => { | ||||
|     const { selectedSuggestion } = this.state; | ||||
|  | @ -190,7 +190,7 @@ export default class AutosuggestTextarea extends ImmutablePureComponent { | |||
|         {inner} | ||||
|       </div> | ||||
|     ); | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   render () { | ||||
|     const { value, suggestions, disabled, placeholder, onKeyUp, autoFocus, lang, children } = this.props; | ||||
|  |  | |||
|  | @ -27,12 +27,12 @@ export default class Avatar extends React.PureComponent { | |||
|   handleMouseEnter = () => { | ||||
|     if (this.props.animate) return; | ||||
|     this.setState({ hovering: true }); | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   handleMouseLeave = () => { | ||||
|     if (this.props.animate) return; | ||||
|     this.setState({ hovering: false }); | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   render () { | ||||
|     const { account, size, animate, inline } = this.props; | ||||
|  |  | |||
|  | @ -29,12 +29,12 @@ export default class AvatarOverlay extends React.PureComponent { | |||
|   handleMouseEnter = () => { | ||||
|     if (this.props.animate) return; | ||||
|     this.setState({ hovering: true }); | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   handleMouseLeave = () => { | ||||
|     if (this.props.animate) return; | ||||
|     this.setState({ hovering: false }); | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   render() { | ||||
|     const { account, friend, animate, size, baseSize, overlaySize } = this.props; | ||||
|  |  | |||
|  | @ -24,11 +24,11 @@ export default class Button extends React.PureComponent { | |||
|     if (!this.props.disabled && this.props.onClick) { | ||||
|       this.props.onClick(e); | ||||
|     } | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   setRef = (c) => { | ||||
|     this.node = c; | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   focus() { | ||||
|     this.node.focus(); | ||||
|  |  | |||
|  | @ -27,11 +27,11 @@ export default class Column extends React.PureComponent { | |||
|     } | ||||
| 
 | ||||
|     this._interruptScrollAnimation(); | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   setRef = c => { | ||||
|     this.node = c; | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   componentDidMount () { | ||||
|     if (this.props.bindToDocument) { | ||||
|  |  | |||
|  | @ -20,7 +20,7 @@ export default class ColumnBackButton extends React.PureComponent { | |||
|     } else { | ||||
|       this.context.router.history.goBack(); | ||||
|     } | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   render () { | ||||
|     const { multiColumn } = this.props; | ||||
|  |  | |||
|  | @ -49,32 +49,32 @@ class ColumnHeader extends React.PureComponent { | |||
|     } else { | ||||
|       this.context.router.history.goBack(); | ||||
|     } | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   handleToggleClick = (e) => { | ||||
|     e.stopPropagation(); | ||||
|     this.setState({ collapsed: !this.state.collapsed, animating: true }); | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   handleTitleClick = () => { | ||||
|     this.props.onClick?.(); | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   handleMoveLeft = () => { | ||||
|     this.props.onMove(-1); | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   handleMoveRight = () => { | ||||
|     this.props.onMove(1); | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   handleBackClick = () => { | ||||
|     this.historyBack(); | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   handleTransitionEnd = () => { | ||||
|     this.setState({ animating: false }); | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   handlePin = () => { | ||||
|     if (!this.props.pinned) { | ||||
|  | @ -82,7 +82,7 @@ class ColumnHeader extends React.PureComponent { | |||
|     } | ||||
| 
 | ||||
|     this.props.onPin(); | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   render () { | ||||
|     const { title, icon, active, children, pinned, multiColumn, extraButton, showBackButton, intl: { formatMessage }, placeholder, appendContent, collapseIssues } = this.props; | ||||
|  |  | |||
|  | @ -24,7 +24,7 @@ class DismissableBanner extends React.PureComponent { | |||
|   handleDismiss = () => { | ||||
|     const { id } = this.props; | ||||
|     this.setState({ visible: false }, () => bannerSettings.set(id, true)); | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   render () { | ||||
|     const { visible } = this.state; | ||||
|  |  | |||
|  | @ -23,7 +23,7 @@ export default class DisplayName extends React.PureComponent { | |||
|       let emoji = emojis[i]; | ||||
|       emoji.src = emoji.getAttribute('data-original'); | ||||
|     } | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   handleMouseLeave = ({ currentTarget }) => { | ||||
|     if (autoPlayGif) { | ||||
|  | @ -36,7 +36,7 @@ export default class DisplayName extends React.PureComponent { | |||
|       let emoji = emojis[i]; | ||||
|       emoji.src = emoji.getAttribute('data-static'); | ||||
|     } | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   render () { | ||||
|     const { others, localDomain } = this.props; | ||||
|  |  | |||
|  | @ -19,7 +19,7 @@ class Account extends ImmutablePureComponent { | |||
| 
 | ||||
|   handleDomainUnblock = () => { | ||||
|     this.props.onUnblockDomain(this.props.domain); | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   render () { | ||||
|     const { domain, intl } = this.props; | ||||
|  |  | |||
|  | @ -36,7 +36,7 @@ class DropdownMenu extends React.PureComponent { | |||
|     if (this.node && !this.node.contains(e.target)) { | ||||
|       this.props.onClose(); | ||||
|     } | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   componentDidMount () { | ||||
|     document.addEventListener('click', this.handleDocumentClick, false); | ||||
|  | @ -56,11 +56,11 @@ class DropdownMenu extends React.PureComponent { | |||
| 
 | ||||
|   setRef = c => { | ||||
|     this.node = c; | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   setFocusRef = c => { | ||||
|     this.focusedItem = c; | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   handleKeyDown = e => { | ||||
|     const items = Array.from(this.node.querySelectorAll('a, button')); | ||||
|  | @ -97,18 +97,18 @@ class DropdownMenu extends React.PureComponent { | |||
|       e.preventDefault(); | ||||
|       e.stopPropagation(); | ||||
|     } | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   handleItemKeyPress = e => { | ||||
|     if (e.key === 'Enter' || e.key === ' ') { | ||||
|       this.handleClick(e); | ||||
|     } | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   handleClick = e => { | ||||
|     const { onItemClick } = this.props; | ||||
|     onItemClick(e); | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   renderItem = (option, i) => { | ||||
|     if (option === null) { | ||||
|  | @ -124,7 +124,7 @@ class DropdownMenu extends React.PureComponent { | |||
|         </a> | ||||
|       </li> | ||||
|     ); | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   render () { | ||||
|     const { items, scrollable, renderHeader, loading } = this.props; | ||||
|  | @ -194,7 +194,7 @@ export default class Dropdown extends React.PureComponent { | |||
|     } else { | ||||
|       this.props.onOpen(this.state.id, this.handleItemClick, type !== 'click'); | ||||
|     } | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   handleClose = () => { | ||||
|     if (this.activeElement) { | ||||
|  | @ -202,13 +202,13 @@ export default class Dropdown extends React.PureComponent { | |||
|       this.activeElement = null; | ||||
|     } | ||||
|     this.props.onClose(this.state.id); | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   handleMouseDown = () => { | ||||
|     if (!this.state.open) { | ||||
|       this.activeElement = document.activeElement; | ||||
|     } | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   handleButtonKeyDown = (e) => { | ||||
|     switch(e.key) { | ||||
|  | @ -217,7 +217,7 @@ export default class Dropdown extends React.PureComponent { | |||
|       this.handleMouseDown(); | ||||
|       break; | ||||
|     } | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   handleKeyPress = (e) => { | ||||
|     switch(e.key) { | ||||
|  | @ -228,7 +228,7 @@ export default class Dropdown extends React.PureComponent { | |||
|       e.preventDefault(); | ||||
|       break; | ||||
|     } | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   handleItemClick = e => { | ||||
|     const { onItemClick } = this.props; | ||||
|  | @ -247,25 +247,25 @@ export default class Dropdown extends React.PureComponent { | |||
|       e.preventDefault(); | ||||
|       this.context.router.history.push(item.to); | ||||
|     } | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   setTargetRef = c => { | ||||
|     this.target = c; | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   findTarget = () => { | ||||
|     return this.target; | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   componentWillUnmount = () => { | ||||
|     if (this.state.id === this.props.openDropdownId) { | ||||
|       this.handleClose(); | ||||
|     } | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   close = () => { | ||||
|     this.handleClose(); | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   render () { | ||||
|     const { | ||||
|  |  | |||
|  | @ -36,7 +36,7 @@ class EditedTimestamp extends React.PureComponent { | |||
|     return ( | ||||
|       <FormattedMessage id='status.edited_x_times' defaultMessage='Edited {count, plural, one {{count} time} other {{count} times}}' values={{ count: items.size - 1 }} /> | ||||
|     ); | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   renderItem = (item, index, { onClick, onKeyPress }) => { | ||||
|     const formattedDate = <RelativeTimestamp timestamp={item.get('created_at')} short={false} />; | ||||
|  | @ -53,7 +53,7 @@ class EditedTimestamp extends React.PureComponent { | |||
|         <button data-index={index} onClick={onClick} onKeyPress={onKeyPress}>{label}</button> | ||||
|       </li> | ||||
|     ); | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   render () { | ||||
|     const { timestamp, intl, statusId } = this.props; | ||||
|  |  | |||
|  | @ -64,7 +64,7 @@ export default class ErrorBoundary extends React.PureComponent { | |||
| 
 | ||||
|     this.setState({ copied: true }); | ||||
|     setTimeout(() => this.setState({ copied: false }), 700); | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   render() { | ||||
|     const { hasError, copied, errorMessage } = this.state; | ||||
|  |  | |||
|  | @ -17,7 +17,7 @@ export default class GIFV extends React.PureComponent { | |||
| 
 | ||||
|   handleLoadedData = () => { | ||||
|     this.setState({ loading: false }); | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   componentWillReceiveProps (nextProps) { | ||||
|     if (nextProps.src !== this.props.src) { | ||||
|  | @ -32,7 +32,7 @@ export default class GIFV extends React.PureComponent { | |||
|       e.stopPropagation(); | ||||
|       onClick(); | ||||
|     } | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   render () { | ||||
|     const { src, width, height, alt } = this.props; | ||||
|  |  | |||
|  | @ -43,7 +43,7 @@ export default class IconButton extends React.PureComponent { | |||
|   state = { | ||||
|     activate: false, | ||||
|     deactivate: false, | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   componentWillReceiveProps (nextProps) { | ||||
|     if (!nextProps.animate) return; | ||||
|  | @ -61,25 +61,25 @@ export default class IconButton extends React.PureComponent { | |||
|     if (!this.props.disabled) { | ||||
|       this.props.onClick(e); | ||||
|     } | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   handleKeyPress = (e) => { | ||||
|     if (this.props.onKeyPress && !this.props.disabled) { | ||||
|       this.props.onKeyPress(e); | ||||
|     } | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   handleMouseDown = (e) => { | ||||
|     if (!this.props.disabled && this.props.onMouseDown) { | ||||
|       this.props.onMouseDown(e); | ||||
|     } | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   handleKeyDown = (e) => { | ||||
|     if (!this.props.disabled && this.props.onKeyDown) { | ||||
|       this.props.onKeyDown(e); | ||||
|     } | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   render () { | ||||
|     const style = { | ||||
|  |  | |||
|  | @ -21,7 +21,7 @@ export default class IntersectionObserverArticle extends React.Component { | |||
| 
 | ||||
|   state = { | ||||
|     isHidden: false, // set to true in requestIdleCallback to trigger un-render
 | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   shouldComponentUpdate (nextProps, nextState) { | ||||
|     const isUnrendered = !this.state.isIntersecting && (this.state.isHidden || this.props.cachedHeight); | ||||
|  | @ -62,7 +62,7 @@ export default class IntersectionObserverArticle extends React.Component { | |||
| 
 | ||||
|     scheduleIdleTask(this.calculateHeight); | ||||
|     this.setState(this.updateStateAfterIntersection); | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   updateStateAfterIntersection = (prevState) => { | ||||
|     if (prevState.isIntersecting !== false && !this.entry.isIntersecting) { | ||||
|  | @ -72,7 +72,7 @@ export default class IntersectionObserverArticle extends React.Component { | |||
|       isIntersecting: this.entry.isIntersecting, | ||||
|       isHidden: false, | ||||
|     }; | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   calculateHeight = () => { | ||||
|     const { onHeightChange, saveHeightKey, id } = this.props; | ||||
|  | @ -83,7 +83,7 @@ export default class IntersectionObserverArticle extends React.Component { | |||
|     if (onHeightChange && saveHeightKey) { | ||||
|       onHeightChange(saveHeightKey, id, this.height); | ||||
|     } | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   hideIfNotIntersecting = () => { | ||||
|     if (!this.componentMounted) { | ||||
|  | @ -95,11 +95,11 @@ export default class IntersectionObserverArticle extends React.Component { | |||
|     // this is to save DOM nodes and avoid using up too much memory.
 | ||||
|     // See: https://github.com/mastodon/mastodon/issues/2900
 | ||||
|     this.setState((prevState) => ({ isHidden: !prevState.isIntersecting })); | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   handleRef = (node) => { | ||||
|     this.node = node; | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   render () { | ||||
|     const { children, id, index, listLength, cachedHeight } = this.props; | ||||
|  |  | |||
|  | @ -19,7 +19,7 @@ class LoadGap extends React.PureComponent { | |||
| 
 | ||||
|   handleClick = () => { | ||||
|     this.props.onClick(this.props.maxId); | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   render () { | ||||
|     const { disabled, intl } = this.props; | ||||
|  |  | |||
|  | @ -8,11 +8,11 @@ export default class LoadMore extends React.PureComponent { | |||
|     onClick: PropTypes.func, | ||||
|     disabled: PropTypes.bool, | ||||
|     visible: PropTypes.bool, | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   static defaultProps = { | ||||
|     visible: true, | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   render() { | ||||
|     const { disabled, visible } = this.props; | ||||
|  |  | |||
|  | @ -7,7 +7,7 @@ export default class LoadPending extends React.PureComponent { | |||
|   static propTypes = { | ||||
|     onClick: PropTypes.func, | ||||
|     count: PropTypes.number, | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   render() { | ||||
|     const { count } = this.props; | ||||
|  |  | |||
|  | @ -29,7 +29,7 @@ export default class MediaAttachments extends ImmutablePureComponent { | |||
|     return ( | ||||
|       <div className='media-gallery' style={{ height, width }} /> | ||||
|     ); | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   renderLoadingVideoPlayer = () => { | ||||
|     const { height, width } = this.props; | ||||
|  | @ -37,7 +37,7 @@ export default class MediaAttachments extends ImmutablePureComponent { | |||
|     return ( | ||||
|       <div className='video-player' style={{ height, width }} /> | ||||
|     ); | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   renderLoadingAudioPlayer = () => { | ||||
|     const { height, width } = this.props; | ||||
|  | @ -45,7 +45,7 @@ export default class MediaAttachments extends ImmutablePureComponent { | |||
|     return ( | ||||
|       <div className='audio-player' style={{ height, width }} /> | ||||
|     ); | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   render () { | ||||
|     const { status, width, height } = this.props; | ||||
|  |  | |||
|  | @ -40,14 +40,14 @@ class Item extends React.PureComponent { | |||
|     if (this.hoverToPlay()) { | ||||
|       e.target.play(); | ||||
|     } | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   handleMouseLeave = (e) => { | ||||
|     if (this.hoverToPlay()) { | ||||
|       e.target.pause(); | ||||
|       e.target.currentTime = 0; | ||||
|     } | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   getAutoPlay() { | ||||
|     return this.props.autoplay || autoPlayGif; | ||||
|  | @ -71,11 +71,11 @@ class Item extends React.PureComponent { | |||
|     } | ||||
| 
 | ||||
|     e.stopPropagation(); | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   handleImageLoad = () => { | ||||
|     this.setState({ loaded: true }); | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   render () { | ||||
|     const { attachment, index, size, standalone, displayWidth, visible } = this.props; | ||||
|  | @ -277,11 +277,11 @@ class MediaGallery extends React.PureComponent { | |||
|     } else { | ||||
|       this.setState({ visible: !this.state.visible }); | ||||
|     } | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   handleClick = (index) => { | ||||
|     this.props.onOpenMedia(this.props.media, index); | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   handleRef = c => { | ||||
|     this.node = c; | ||||
|  | @ -289,7 +289,7 @@ class MediaGallery extends React.PureComponent { | |||
|     if (this.node) { | ||||
|       this._setDimensions(); | ||||
|     } | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   _setDimensions () { | ||||
|     const width = this.node.offsetWidth; | ||||
|  |  | |||
|  | @ -28,7 +28,7 @@ export default class ModalRoot extends React.PureComponent { | |||
|          && !!this.props.children) { | ||||
|       this.props.onClose(); | ||||
|     } | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   handleKeyDown = (e) => { | ||||
|     if (e.key === 'Tab') { | ||||
|  | @ -49,7 +49,7 @@ export default class ModalRoot extends React.PureComponent { | |||
|         e.preventDefault(); | ||||
|       } | ||||
|     } | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   componentDidMount () { | ||||
|     window.addEventListener('keyup', this.handleKeyUp, false); | ||||
|  | @ -122,11 +122,11 @@ export default class ModalRoot extends React.PureComponent { | |||
| 
 | ||||
|   getSiblings = () => { | ||||
|     return Array(...this.node.parentElement.childNodes).filter(node => node !== this.node); | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   setRef = ref => { | ||||
|     this.node = ref; | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   render () { | ||||
|     const { children, onClose } = this.props; | ||||
|  |  | |||
|  | @ -22,7 +22,7 @@ class PictureInPicturePlaceholder extends React.PureComponent { | |||
|   handleClick = () => { | ||||
|     const { dispatch } = this.props; | ||||
|     dispatch(removePictureInPicture()); | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   setRef = c => { | ||||
|     this.node = c; | ||||
|  | @ -30,7 +30,7 @@ class PictureInPicturePlaceholder extends React.PureComponent { | |||
|     if (this.node) { | ||||
|       this._setDimensions(); | ||||
|     } | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   _setDimensions () { | ||||
|     const width  = this.node.offsetWidth; | ||||
|  |  | |||
|  | @ -95,7 +95,7 @@ class Poll extends ImmutablePureComponent { | |||
|       tmp[value] = true; | ||||
|       this.setState({ selected: tmp }); | ||||
|     } | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   handleOptionChange = ({ target: { value } }) => { | ||||
|     this._toggleOption(value); | ||||
|  | @ -107,7 +107,7 @@ class Poll extends ImmutablePureComponent { | |||
|       e.stopPropagation(); | ||||
|       e.preventDefault(); | ||||
|     } | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   handleVote = () => { | ||||
|     if (this.props.disabled) { | ||||
|  |  | |||
|  | @ -97,7 +97,7 @@ class ScrollableList extends PureComponent { | |||
|     } else { | ||||
|       return this.node; | ||||
|     } | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   setScrollTop = newScrollTop => { | ||||
|     if (this.getScrollTop() !== newScrollTop) { | ||||
|  | @ -143,7 +143,7 @@ class ScrollableList extends PureComponent { | |||
| 
 | ||||
|     this.mouseMovedRecently = false; | ||||
|     this.scrollToTopOnMouseIdle = false; | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   componentDidMount () { | ||||
|     this.attachScrollListener(); | ||||
|  | @ -161,25 +161,25 @@ class ScrollableList extends PureComponent { | |||
|     } else { | ||||
|       return null; | ||||
|     } | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   getScrollTop = () => { | ||||
|     return this._getScrollingElement().scrollTop; | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   getScrollHeight = () => { | ||||
|     return this._getScrollingElement().scrollHeight; | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   getClientHeight = () => { | ||||
|     return this._getScrollingElement().clientHeight; | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   updateScrollBottom = (snapshot) => { | ||||
|     const newScrollTop = this.getScrollHeight() - snapshot; | ||||
| 
 | ||||
|     this.setScrollTop(newScrollTop); | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   getSnapshotBeforeUpdate (prevProps) { | ||||
|     const someItemInserted = React.Children.count(prevProps.children) > 0 && | ||||
|  | @ -206,7 +206,7 @@ class ScrollableList extends PureComponent { | |||
|     if (width && this.state.cachedMediaWidth !== width) { | ||||
|       this.setState({ cachedMediaWidth: width }); | ||||
|     } | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   componentWillUnmount () { | ||||
|     this.clearMouseIdleTimer(); | ||||
|  | @ -218,7 +218,7 @@ class ScrollableList extends PureComponent { | |||
| 
 | ||||
|   onFullScreenChange = () => { | ||||
|     this.setState({ fullscreen: isFullscreen() }); | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   attachIntersectionObserver () { | ||||
|     let nodeOptions = { | ||||
|  | @ -269,12 +269,12 @@ class ScrollableList extends PureComponent { | |||
| 
 | ||||
|   setRef = (c) => { | ||||
|     this.node = c; | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   handleLoadMore = e => { | ||||
|     e.preventDefault(); | ||||
|     this.props.onLoadMore(); | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   handleLoadPending = e => { | ||||
|     e.preventDefault(); | ||||
|  | @ -286,7 +286,7 @@ class ScrollableList extends PureComponent { | |||
|     this.clearMouseIdleTimer(); | ||||
|     this.mouseIdleTimer = setTimeout(this.handleMouseIdle, MOUSE_IDLE_DELAY); | ||||
|     this.mouseMovedRecently = true; | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   render () { | ||||
|     const { children, scrollKey, trackScroll, showLoading, isLoading, hasMore, numPending, prepend, alwaysPrepend, append, emptyMessage, onLoadMore } = this.props; | ||||
|  |  | |||
|  | @ -135,7 +135,7 @@ class Status extends ImmutablePureComponent { | |||
| 
 | ||||
|   handleToggleMediaVisibility = () => { | ||||
|     this.setState({ showMedia: !this.state.showMedia }); | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   handleClick = e => { | ||||
|     if (e && (e.button !== 0 || e.ctrlKey || e.metaKey)) { | ||||
|  | @ -147,11 +147,11 @@ class Status extends ImmutablePureComponent { | |||
|     } | ||||
| 
 | ||||
|     this.handleHotkeyOpen(); | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   handlePrependAccountClick = e => { | ||||
|     this.handleAccountClick(e, false); | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   handleAccountClick = (e, proper = true) => { | ||||
|     if (e && (e.button !== 0 || e.ctrlKey || e.metaKey))  { | ||||
|  | @ -163,19 +163,19 @@ class Status extends ImmutablePureComponent { | |||
|     } | ||||
| 
 | ||||
|     this._openProfile(proper); | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   handleExpandedToggle = () => { | ||||
|     this.props.onToggleHidden(this._properStatus()); | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   handleCollapsedToggle = isCollapsed => { | ||||
|     this.props.onToggleCollapsed(this._properStatus(), isCollapsed); | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   handleTranslate = () => { | ||||
|     this.props.onTranslate(this._properStatus()); | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   renderLoadingMediaGallery () { | ||||
|     return <div className='media-gallery' style={{ height: '110px' }} />; | ||||
|  | @ -192,11 +192,11 @@ class Status extends ImmutablePureComponent { | |||
|   handleOpenVideo = (options) => { | ||||
|     const status = this._properStatus(); | ||||
|     this.props.onOpenVideo(status.get('id'), status.getIn(['media_attachments', 0]), options); | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   handleOpenMedia = (media, index) => { | ||||
|     this.props.onOpenMedia(this._properStatus().get('id'), media, index); | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   handleHotkeyOpenMedia = e => { | ||||
|     const { onOpenMedia, onOpenVideo } = this.props; | ||||
|  | @ -211,32 +211,32 @@ class Status extends ImmutablePureComponent { | |||
|         onOpenMedia(status.get('id'), status.get('media_attachments'), 0); | ||||
|       } | ||||
|     } | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   handleDeployPictureInPicture = (type, mediaProps) => { | ||||
|     const { deployPictureInPicture } = this.props; | ||||
|     const status = this._properStatus(); | ||||
| 
 | ||||
|     deployPictureInPicture(status, type, mediaProps); | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   handleHotkeyReply = e => { | ||||
|     e.preventDefault(); | ||||
|     this.props.onReply(this._properStatus(), this.context.router.history); | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   handleHotkeyFavourite = () => { | ||||
|     this.props.onFavourite(this._properStatus()); | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   handleHotkeyBoost = e => { | ||||
|     this.props.onReblog(this._properStatus(), e); | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   handleHotkeyMention = e => { | ||||
|     e.preventDefault(); | ||||
|     this.props.onMention(this._properStatus().get('account'), this.context.router.history); | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   handleHotkeyOpen = () => { | ||||
|     if (this.props.onClick) { | ||||
|  | @ -252,11 +252,11 @@ class Status extends ImmutablePureComponent { | |||
|     } | ||||
| 
 | ||||
|     router.history.push(`/@${status.getIn(['account', 'acct'])}/${status.get('id')}`); | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   handleHotkeyOpenProfile = () => { | ||||
|     this._openProfile(); | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   _openProfile = (proper = true) => { | ||||
|     const { router } = this.context; | ||||
|  | @ -267,32 +267,32 @@ class Status extends ImmutablePureComponent { | |||
|     } | ||||
| 
 | ||||
|     router.history.push(`/@${status.getIn(['account', 'acct'])}`); | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   handleHotkeyMoveUp = e => { | ||||
|     this.props.onMoveUp(this.props.status.get('id'), e.target.getAttribute('data-featured')); | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   handleHotkeyMoveDown = e => { | ||||
|     this.props.onMoveDown(this.props.status.get('id'), e.target.getAttribute('data-featured')); | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   handleHotkeyToggleHidden = () => { | ||||
|     this.props.onToggleHidden(this._properStatus()); | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   handleHotkeyToggleSensitive = () => { | ||||
|     this.handleToggleMediaVisibility(); | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   handleUnfilterClick = e => { | ||||
|     this.setState({ forceFilter: false }); | ||||
|     e.preventDefault(); | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   handleFilterClick = () => { | ||||
|     this.setState({ forceFilter: true }); | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   _properStatus () { | ||||
|     const { status } = this.props; | ||||
|  | @ -306,7 +306,7 @@ class Status extends ImmutablePureComponent { | |||
| 
 | ||||
|   handleRef = c => { | ||||
|     this.node = c; | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   render () { | ||||
|     let media = null; | ||||
|  |  | |||
|  | @ -97,7 +97,7 @@ class StatusActionBar extends ImmutablePureComponent { | |||
|     'status', | ||||
|     'relationship', | ||||
|     'withDismiss', | ||||
|   ] | ||||
|   ]; | ||||
| 
 | ||||
|   handleReplyClick = () => { | ||||
|     const { signedIn } = this.context.identity; | ||||
|  | @ -107,7 +107,7 @@ class StatusActionBar extends ImmutablePureComponent { | |||
|     } else { | ||||
|       this.props.onInteractionModal('reply', this.props.status); | ||||
|     } | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   handleShareClick = () => { | ||||
|     navigator.share({ | ||||
|  | @ -116,7 +116,7 @@ class StatusActionBar extends ImmutablePureComponent { | |||
|     }).catch((e) => { | ||||
|       if (e.name !== 'AbortError') console.error(e); | ||||
|     }); | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   handleFavouriteClick = () => { | ||||
|     const { signedIn } = this.context.identity; | ||||
|  | @ -126,7 +126,7 @@ class StatusActionBar extends ImmutablePureComponent { | |||
|     } else { | ||||
|       this.props.onInteractionModal('favourite', this.props.status); | ||||
|     } | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   handleReblogClick = e => { | ||||
|     const { signedIn } = this.context.identity; | ||||
|  | @ -136,35 +136,35 @@ class StatusActionBar extends ImmutablePureComponent { | |||
|     } else { | ||||
|       this.props.onInteractionModal('reblog', this.props.status); | ||||
|     } | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   handleBookmarkClick = () => { | ||||
|     this.props.onBookmark(this.props.status); | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   handleDeleteClick = () => { | ||||
|     this.props.onDelete(this.props.status, this.context.router.history); | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   handleRedraftClick = () => { | ||||
|     this.props.onDelete(this.props.status, this.context.router.history, true); | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   handleEditClick = () => { | ||||
|     this.props.onEdit(this.props.status, this.context.router.history); | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   handlePinClick = () => { | ||||
|     this.props.onPin(this.props.status); | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   handleMentionClick = () => { | ||||
|     this.props.onMention(this.props.status.get('account'), this.context.router.history); | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   handleDirectClick = () => { | ||||
|     this.props.onDirect(this.props.status.get('account'), this.context.router.history); | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   handleMuteClick = () => { | ||||
|     const { status, relationship, onMute, onUnmute } = this.props; | ||||
|  | @ -175,7 +175,7 @@ class StatusActionBar extends ImmutablePureComponent { | |||
|     } else { | ||||
|       onMute(account); | ||||
|     } | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   handleBlockClick = () => { | ||||
|     const { status, relationship, onBlock, onUnblock } = this.props; | ||||
|  | @ -186,50 +186,50 @@ class StatusActionBar extends ImmutablePureComponent { | |||
|     } else { | ||||
|       onBlock(status); | ||||
|     } | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   handleBlockDomain = () => { | ||||
|     const { status, onBlockDomain } = this.props; | ||||
|     const account = status.get('account'); | ||||
| 
 | ||||
|     onBlockDomain(account.get('acct').split('@')[1]); | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   handleUnblockDomain = () => { | ||||
|     const { status, onUnblockDomain } = this.props; | ||||
|     const account = status.get('account'); | ||||
| 
 | ||||
|     onUnblockDomain(account.get('acct').split('@')[1]); | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   handleOpen = () => { | ||||
|     this.context.router.history.push(`/@${this.props.status.getIn(['account', 'acct'])}/${this.props.status.get('id')}`); | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   handleEmbed = () => { | ||||
|     this.props.onEmbed(this.props.status); | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   handleReport = () => { | ||||
|     this.props.onReport(this.props.status); | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   handleConversationMuteClick = () => { | ||||
|     this.props.onMuteConversation(this.props.status); | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   handleFilterClick = () => { | ||||
|     this.props.onAddFilter(this.props.status); | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   handleCopy = () => { | ||||
|     const url = this.props.status.get('url'); | ||||
|     navigator.clipboard.writeText(url); | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   handleHideClick = () => { | ||||
|     this.props.onFilter(); | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   render () { | ||||
|     const { status, relationship, intl, withDismiss, withCounters, scrollKey } = this.props; | ||||
|  |  | |||
|  | @ -130,7 +130,7 @@ class StatusContent extends React.PureComponent { | |||
|       let emoji = emojis[i]; | ||||
|       emoji.src = emoji.getAttribute('data-original'); | ||||
|     } | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   handleMouseLeave = ({ currentTarget }) => { | ||||
|     if (autoPlayGif) { | ||||
|  | @ -143,7 +143,7 @@ class StatusContent extends React.PureComponent { | |||
|       let emoji = emojis[i]; | ||||
|       emoji.src = emoji.getAttribute('data-static'); | ||||
|     } | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   componentDidMount () { | ||||
|     this._updateStatusLinks(); | ||||
|  | @ -158,7 +158,7 @@ class StatusContent extends React.PureComponent { | |||
|       e.preventDefault(); | ||||
|       this.context.router.history.push(`/@${mention.get('acct')}`); | ||||
|     } | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   onHashtagClick = (hashtag, e) => { | ||||
|     hashtag = hashtag.replace(/^#/, ''); | ||||
|  | @ -167,11 +167,11 @@ class StatusContent extends React.PureComponent { | |||
|       e.preventDefault(); | ||||
|       this.context.router.history.push(`/tags/${hashtag}`); | ||||
|     } | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   handleMouseDown = (e) => { | ||||
|     this.startXY = [e.clientX, e.clientY]; | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   handleMouseUp = (e) => { | ||||
|     if (!this.startXY) { | ||||
|  | @ -194,7 +194,7 @@ class StatusContent extends React.PureComponent { | |||
|     } | ||||
| 
 | ||||
|     this.startXY = null; | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   handleSpoilerClick = (e) => { | ||||
|     e.preventDefault(); | ||||
|  | @ -205,15 +205,15 @@ class StatusContent extends React.PureComponent { | |||
|     } else { | ||||
|       this.setState({ hidden: !this.state.hidden }); | ||||
|     } | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   handleTranslate = () => { | ||||
|     this.props.onTranslate(); | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   setRef = (c) => { | ||||
|     this.node = c; | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   render () { | ||||
|     const { status, intl } = this.props; | ||||
|  |  | |||
|  | @ -34,7 +34,7 @@ export default class StatusList extends ImmutablePureComponent { | |||
| 
 | ||||
|   getFeaturedStatusCount = () => { | ||||
|     return this.props.featuredStatusIds ? this.props.featuredStatusIds.size : 0; | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   getCurrentStatusIndex = (id, featured) => { | ||||
|     if (featured) { | ||||
|  | @ -42,21 +42,21 @@ export default class StatusList extends ImmutablePureComponent { | |||
|     } else { | ||||
|       return this.props.statusIds.indexOf(id) + this.getFeaturedStatusCount(); | ||||
|     } | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   handleMoveUp = (id, featured) => { | ||||
|     const elementIndex = this.getCurrentStatusIndex(id, featured) - 1; | ||||
|     this._selectChild(elementIndex, true); | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   handleMoveDown = (id, featured) => { | ||||
|     const elementIndex = this.getCurrentStatusIndex(id, featured) + 1; | ||||
|     this._selectChild(elementIndex, false); | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   handleLoadOlder = debounce(() => { | ||||
|     this.props.onLoadMore(this.props.statusIds.size > 0 ? this.props.statusIds.last() : undefined); | ||||
|   }, 300, { leading: true }) | ||||
|   }, 300, { leading: true }); | ||||
| 
 | ||||
|   _selectChild (index, align_top) { | ||||
|     const container = this.node.node; | ||||
|  | @ -74,7 +74,7 @@ export default class StatusList extends ImmutablePureComponent { | |||
| 
 | ||||
|   setRef = c => { | ||||
|     this.node = c; | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   render () { | ||||
|     const { statusIds, featuredStatusIds, onLoadMore, timelineId, ...other }  = this.props; | ||||
|  |  | |||
|  | @ -39,7 +39,7 @@ export default class MediaContainer extends PureComponent { | |||
|     document.documentElement.style.marginRight = `${getScrollbarWidth()}px`; | ||||
| 
 | ||||
|     this.setState({ media, index }); | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   handleOpenVideo = (options) => { | ||||
|     const { components } = this.props; | ||||
|  | @ -50,7 +50,7 @@ export default class MediaContainer extends PureComponent { | |||
|     document.documentElement.style.marginRight = `${getScrollbarWidth()}px`; | ||||
| 
 | ||||
|     this.setState({ media: mediaList, options }); | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   handleCloseMedia = () => { | ||||
|     document.body.classList.remove('with-modals--active'); | ||||
|  | @ -63,11 +63,11 @@ export default class MediaContainer extends PureComponent { | |||
|       backgroundColor: null, | ||||
|       options: null, | ||||
|     }); | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   setBackgroundColor = color => { | ||||
|     this.setState({ backgroundColor: color }); | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   render () { | ||||
|     const { locale, components } = this.props; | ||||
|  |  | |||
|  | @ -59,7 +59,7 @@ class Section extends React.PureComponent { | |||
|     const { collapsed } = this.state; | ||||
| 
 | ||||
|     this.setState({ collapsed: !collapsed }, () => onOpen && onOpen()); | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   render () { | ||||
|     const { title, children } = this.props; | ||||
|  | @ -106,7 +106,7 @@ class About extends React.PureComponent { | |||
|   handleDomainBlocksOpen = () => { | ||||
|     const { dispatch } = this.props; | ||||
|     dispatch(fetchDomainBlocks()); | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   render () { | ||||
|     const { multiColumn, intl, server, extendedDescription, domainBlocks } = this.props; | ||||
|  |  | |||
|  | @ -90,7 +90,7 @@ class AccountNote extends ImmutablePureComponent { | |||
| 
 | ||||
|   setTextareaRef = c => { | ||||
|     this.textarea = c; | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   handleChange = e => { | ||||
|     this.setState({ value: e.target.value, saving: false }); | ||||
|  | @ -114,13 +114,13 @@ class AccountNote extends ImmutablePureComponent { | |||
|         } | ||||
|       }); | ||||
|     } | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   handleBlur = () => { | ||||
|     if (this._isDirty()) { | ||||
|       this._save(); | ||||
|     } | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   _save (showMessage = true) { | ||||
|     this.setState({ saving: true }, () => this.props.onSave(this.state.value)); | ||||
|  |  | |||
|  | @ -109,7 +109,7 @@ class Header extends ImmutablePureComponent { | |||
| 
 | ||||
|   openEditProfile = () => { | ||||
|     window.open('/settings/profile', '_blank'); | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   isStatusesPageActive = (match, location) => { | ||||
|     if (!match) { | ||||
|  | @ -117,7 +117,7 @@ class Header extends ImmutablePureComponent { | |||
|     } | ||||
| 
 | ||||
|     return !location.pathname.match(/\/(followers|following)\/?$/); | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   handleMouseEnter = ({ currentTarget }) => { | ||||
|     if (autoPlayGif) { | ||||
|  | @ -130,7 +130,7 @@ class Header extends ImmutablePureComponent { | |||
|       let emoji = emojis[i]; | ||||
|       emoji.src = emoji.getAttribute('data-original'); | ||||
|     } | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   handleMouseLeave = ({ currentTarget }) => { | ||||
|     if (autoPlayGif) { | ||||
|  | @ -143,14 +143,14 @@ class Header extends ImmutablePureComponent { | |||
|       let emoji = emojis[i]; | ||||
|       emoji.src = emoji.getAttribute('data-static'); | ||||
|     } | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   handleAvatarClick = e => { | ||||
|     if (e.button === 0 && !(e.ctrlKey || e.metaKey)) { | ||||
|       e.preventDefault(); | ||||
|       this.props.onOpenAvatar(); | ||||
|     } | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   handleShare = () => { | ||||
|     const { account } = this.props; | ||||
|  | @ -161,7 +161,7 @@ class Header extends ImmutablePureComponent { | |||
|     }).catch((e) => { | ||||
|       if (e.name !== 'AbortError') console.error(e); | ||||
|     }); | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   render () { | ||||
|     const { account, hidden, intl, domain } = this.props; | ||||
|  |  | |||
|  | @ -22,20 +22,20 @@ export default class MediaItem extends ImmutablePureComponent { | |||
| 
 | ||||
|   handleImageLoad = () => { | ||||
|     this.setState({ loaded: true }); | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   handleMouseEnter = e => { | ||||
|     if (this.hoverToPlay()) { | ||||
|       e.target.play(); | ||||
|     } | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   handleMouseLeave = e => { | ||||
|     if (this.hoverToPlay()) { | ||||
|       e.target.pause(); | ||||
|       e.target.currentTime = 0; | ||||
|     } | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   hoverToPlay () { | ||||
|     return !autoPlayGif && ['gifv', 'video'].indexOf(this.props.attachment.get('type')) !== -1; | ||||
|  | @ -51,7 +51,7 @@ export default class MediaItem extends ImmutablePureComponent { | |||
|         this.setState({ visible: true }); | ||||
|       } | ||||
|     } | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   render () { | ||||
|     const { attachment, displayWidth } = this.props; | ||||
|  |  | |||
|  | @ -47,7 +47,7 @@ class LoadMoreMedia extends ImmutablePureComponent { | |||
| 
 | ||||
|   handleLoadMore = () => { | ||||
|     this.props.onLoadMore(this.props.maxId); | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   render () { | ||||
|     return ( | ||||
|  | @ -114,7 +114,7 @@ class AccountGallery extends ImmutablePureComponent { | |||
|     if (this.props.hasMore) { | ||||
|       this.handleLoadMore(this.props.attachments.size > 0 ? this.props.attachments.last().getIn(['status', 'id']) : undefined); | ||||
|     } | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   handleScroll = e => { | ||||
|     const { scrollTop, scrollHeight, clientHeight } = e.target; | ||||
|  | @ -123,7 +123,7 @@ class AccountGallery extends ImmutablePureComponent { | |||
|     if (150 > offset && !this.props.isLoading) { | ||||
|       this.handleScrollToBottom(); | ||||
|     } | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   handleLoadMore = maxId => { | ||||
|     this.props.dispatch(expandAccountMediaTimeline(this.props.accountId, { maxId })); | ||||
|  | @ -132,7 +132,7 @@ class AccountGallery extends ImmutablePureComponent { | |||
|   handleLoadOlder = e => { | ||||
|     e.preventDefault(); | ||||
|     this.handleScrollToBottom(); | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   handleOpenMedia = attachment => { | ||||
|     const { dispatch } = this.props; | ||||
|  | @ -148,13 +148,13 @@ class AccountGallery extends ImmutablePureComponent { | |||
| 
 | ||||
|       dispatch(openModal('MEDIA', { media, index, statusId })); | ||||
|     } | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   handleRef = c => { | ||||
|     if (c) { | ||||
|       this.setState({ width: c.offsetWidth }); | ||||
|     } | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   render () { | ||||
|     const { attachments, isLoading, hasMore, isAccount, multiColumn, blockedBy, suspended } = this.props; | ||||
|  |  | |||
|  | @ -36,35 +36,35 @@ export default class Header extends ImmutablePureComponent { | |||
| 
 | ||||
|   handleFollow = () => { | ||||
|     this.props.onFollow(this.props.account); | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   handleBlock = () => { | ||||
|     this.props.onBlock(this.props.account); | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   handleMention = () => { | ||||
|     this.props.onMention(this.props.account, this.context.router.history); | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   handleDirect = () => { | ||||
|     this.props.onDirect(this.props.account, this.context.router.history); | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   handleReport = () => { | ||||
|     this.props.onReport(this.props.account); | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   handleReblogToggle = () => { | ||||
|     this.props.onReblogToggle(this.props.account); | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   handleNotifyToggle = () => { | ||||
|     this.props.onNotifyToggle(this.props.account); | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   handleMute = () => { | ||||
|     this.props.onMute(this.props.account); | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   handleBlockDomain = () => { | ||||
|     const domain = this.props.account.get('acct').split('@')[1]; | ||||
|  | @ -72,7 +72,7 @@ export default class Header extends ImmutablePureComponent { | |||
|     if (!domain) return; | ||||
| 
 | ||||
|     this.props.onBlockDomain(domain); | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   handleUnblockDomain = () => { | ||||
|     const domain = this.props.account.get('acct').split('@')[1]; | ||||
|  | @ -80,31 +80,31 @@ export default class Header extends ImmutablePureComponent { | |||
|     if (!domain) return; | ||||
| 
 | ||||
|     this.props.onUnblockDomain(domain); | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   handleEndorseToggle = () => { | ||||
|     this.props.onEndorseToggle(this.props.account); | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   handleAddToList = () => { | ||||
|     this.props.onAddToList(this.props.account); | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   handleEditAccountNote = () => { | ||||
|     this.props.onEditAccountNote(this.props.account); | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   handleChangeLanguages = () => { | ||||
|     this.props.onChangeLanguages(this.props.account); | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   handleInteractionModal = () => { | ||||
|     this.props.onInteractionModal(this.props.account); | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   handleOpenAvatar = () => { | ||||
|     this.props.onOpenAvatar(this.props.account); | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   render () { | ||||
|     const { account, hidden, hideTabs } = this.props; | ||||
|  |  | |||
|  | @ -20,7 +20,7 @@ class LimitedAccountHint extends React.PureComponent { | |||
|   static propTypes = { | ||||
|     accountId: PropTypes.string.isRequired, | ||||
|     reveal: PropTypes.func, | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   render () { | ||||
|     const { reveal } = this.props; | ||||
|  |  | |||
|  | @ -145,7 +145,7 @@ class AccountTimeline extends ImmutablePureComponent { | |||
| 
 | ||||
|   handleLoadMore = maxId => { | ||||
|     this.props.dispatch(expandAccountTimeline(this.props.accountId, { maxId, withReplies: this.props.withReplies, tagged: this.props.params.tagged })); | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   render () { | ||||
|     const { accountId, statusIds, featuredStatusIds, isLoading, hasMore, blockedBy, suspended, isAccount, hidden, multiColumn, remote, remoteUrl } = this.props; | ||||
|  |  | |||
|  | @ -75,7 +75,7 @@ class Audio extends React.PureComponent { | |||
|     if (this.player) { | ||||
|       this._setDimensions(); | ||||
|     } | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   _pack() { | ||||
|     return { | ||||
|  | @ -105,11 +105,11 @@ class Audio extends React.PureComponent { | |||
| 
 | ||||
|   setSeekRef = c => { | ||||
|     this.seek = c; | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   setVolumeRef = c => { | ||||
|     this.volume = c; | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   setAudioRef = c => { | ||||
|     this.audio = c; | ||||
|  | @ -118,13 +118,13 @@ class Audio extends React.PureComponent { | |||
|       this.audio.volume = 1; | ||||
|       this.audio.muted = false; | ||||
|     } | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   setCanvasRef = c => { | ||||
|     this.canvas = c; | ||||
| 
 | ||||
|     this.visualizer.setCanvas(c); | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   componentDidMount () { | ||||
|     window.addEventListener('scroll', this.handleScroll); | ||||
|  | @ -163,7 +163,7 @@ class Audio extends React.PureComponent { | |||
|     } else { | ||||
|       this.setState({ paused: true }, () => this.audio.pause()); | ||||
|     } | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   handleResize = debounce(() => { | ||||
|     if (this.player) { | ||||
|  | @ -181,7 +181,7 @@ class Audio extends React.PureComponent { | |||
|     } | ||||
| 
 | ||||
|     this._renderCanvas(); | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   handlePause = () => { | ||||
|     this.setState({ paused: true }); | ||||
|  | @ -189,7 +189,7 @@ class Audio extends React.PureComponent { | |||
|     if (this.audioContext) { | ||||
|       this.audioContext.suspend(); | ||||
|     } | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   handleProgress = () => { | ||||
|     const lastTimeRange = this.audio.buffered.length - 1; | ||||
|  | @ -197,7 +197,7 @@ class Audio extends React.PureComponent { | |||
|     if (lastTimeRange > -1) { | ||||
|       this.setState({ buffer: Math.ceil(this.audio.buffered.end(lastTimeRange) / this.audio.duration * 100) }); | ||||
|     } | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   toggleMute = () => { | ||||
|     const muted = !this.state.muted; | ||||
|  | @ -207,7 +207,7 @@ class Audio extends React.PureComponent { | |||
|         this.gainNode.gain.value = muted ? 0 : this.state.volume; | ||||
|       } | ||||
|     }); | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   toggleReveal = () => { | ||||
|     if (this.props.onToggleVisibility) { | ||||
|  | @ -215,7 +215,7 @@ class Audio extends React.PureComponent { | |||
|     } else { | ||||
|       this.setState({ revealed: !this.state.revealed }); | ||||
|     } | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   handleVolumeMouseDown = e => { | ||||
|     document.addEventListener('mousemove', this.handleMouseVolSlide, true); | ||||
|  | @ -227,14 +227,14 @@ class Audio extends React.PureComponent { | |||
| 
 | ||||
|     e.preventDefault(); | ||||
|     e.stopPropagation(); | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   handleVolumeMouseUp = () => { | ||||
|     document.removeEventListener('mousemove', this.handleMouseVolSlide, true); | ||||
|     document.removeEventListener('mouseup', this.handleVolumeMouseUp, true); | ||||
|     document.removeEventListener('touchmove', this.handleMouseVolSlide, true); | ||||
|     document.removeEventListener('touchend', this.handleVolumeMouseUp, true); | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   handleMouseDown = e => { | ||||
|     document.addEventListener('mousemove', this.handleMouseMove, true); | ||||
|  | @ -248,7 +248,7 @@ class Audio extends React.PureComponent { | |||
| 
 | ||||
|     e.preventDefault(); | ||||
|     e.stopPropagation(); | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   handleMouseUp = () => { | ||||
|     document.removeEventListener('mousemove', this.handleMouseMove, true); | ||||
|  | @ -258,7 +258,7 @@ class Audio extends React.PureComponent { | |||
| 
 | ||||
|     this.setState({ dragging: false }); | ||||
|     this.audio.play(); | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   handleMouseMove = throttle(e => { | ||||
|     const { x } = getPointerPosition(this.seek, e); | ||||
|  | @ -276,7 +276,7 @@ class Audio extends React.PureComponent { | |||
|       currentTime: this.audio.currentTime, | ||||
|       duration: this.audio.duration, | ||||
|     }); | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   handleMouseVolSlide = throttle(e => { | ||||
|     const { x } = getPointerPosition(this.volume, e); | ||||
|  | @ -311,11 +311,11 @@ class Audio extends React.PureComponent { | |||
| 
 | ||||
|   handleMouseEnter = () => { | ||||
|     this.setState({ hovered: true }); | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   handleMouseLeave = () => { | ||||
|     this.setState({ hovered: false }); | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   handleLoadedData = () => { | ||||
|     const { autoPlay, currentTime } = this.props; | ||||
|  | @ -327,7 +327,7 @@ class Audio extends React.PureComponent { | |||
|     if (autoPlay) { | ||||
|       this.togglePlay(); | ||||
|     } | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   _initAudioContext () { | ||||
|     const AudioContext = window.AudioContext || window.webkitAudioContext; | ||||
|  | @ -361,7 +361,7 @@ class Audio extends React.PureComponent { | |||
|     }).catch(err => { | ||||
|       console.error(err); | ||||
|     }); | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   _renderCanvas () { | ||||
|     requestAnimationFrame(() => { | ||||
|  | @ -432,7 +432,7 @@ class Audio extends React.PureComponent { | |||
|       e.stopPropagation(); | ||||
|       this.togglePlay(); | ||||
|     } | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   handleKeyDown = e => { | ||||
|     switch(e.key) { | ||||
|  | @ -457,7 +457,7 @@ class Audio extends React.PureComponent { | |||
|       this.seekBy(10); | ||||
|       break; | ||||
|     } | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   render () { | ||||
|     const { src, intl, alt, editable, autoPlay, sensitive, blurhash } = this.props; | ||||
|  |  | |||
|  | @ -48,24 +48,24 @@ class Bookmarks extends ImmutablePureComponent { | |||
|     } else { | ||||
|       dispatch(addColumn('BOOKMARKS', {})); | ||||
|     } | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   handleMove = (dir) => { | ||||
|     const { columnId, dispatch } = this.props; | ||||
|     dispatch(moveColumn(columnId, dir)); | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   handleHeaderClick = () => { | ||||
|     this.column.scrollTop(); | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   setRef = c => { | ||||
|     this.column = c; | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   handleLoadMore = debounce(() => { | ||||
|     this.props.dispatch(expandBookmarkedStatuses()); | ||||
|   }, 300, { leading: true }) | ||||
|   }, 300, { leading: true }); | ||||
| 
 | ||||
|   render () { | ||||
|     const { intl, statusIds, columnId, multiColumn, hasMore, isLoading } = this.props; | ||||
|  |  | |||
|  | @ -60,16 +60,16 @@ class CommunityTimeline extends React.PureComponent { | |||
|     } else { | ||||
|       dispatch(addColumn('COMMUNITY', { other: { onlyMedia } })); | ||||
|     } | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   handleMove = (dir) => { | ||||
|     const { columnId, dispatch } = this.props; | ||||
|     dispatch(moveColumn(columnId, dir)); | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   handleHeaderClick = () => { | ||||
|     this.column.scrollTop(); | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   componentDidMount () { | ||||
|     const { dispatch, onlyMedia } = this.props; | ||||
|  | @ -109,13 +109,13 @@ class CommunityTimeline extends React.PureComponent { | |||
| 
 | ||||
|   setRef = c => { | ||||
|     this.column = c; | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   handleLoadMore = maxId => { | ||||
|     const { dispatch, onlyMedia } = this.props; | ||||
| 
 | ||||
|     dispatch(expandCommunityTimeline({ maxId, onlyMedia })); | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   render () { | ||||
|     const { intl, hasUnread, columnId, multiColumn, onlyMedia } = this.props; | ||||
|  |  | |||
|  | @ -31,7 +31,7 @@ class ActionBar extends React.PureComponent { | |||
| 
 | ||||
|   handleLogout = () => { | ||||
|     this.props.onLogout(); | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   render () { | ||||
|     const { intl } = this.props; | ||||
|  |  | |||
|  | @ -73,17 +73,17 @@ class ComposeForm extends ImmutablePureComponent { | |||
| 
 | ||||
|   handleChange = (e) => { | ||||
|     this.props.onChange(e.target.value); | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   handleKeyDown = (e) => { | ||||
|     if (e.keyCode === 13 && (e.ctrlKey || e.metaKey)) { | ||||
|       this.handleSubmit(); | ||||
|     } | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   getFulltextForCharacterCounting = () => { | ||||
|     return [this.props.spoiler? this.props.spoilerText: '', countableText(this.props.text)].join(''); | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   canSubmit = () => { | ||||
|     const { isSubmitting, isChangingUpload, isUploading, anyMedia } = this.props; | ||||
|  | @ -91,7 +91,7 @@ class ComposeForm extends ImmutablePureComponent { | |||
|     const isOnlyWhitespace = fulltext.length !== 0 && fulltext.trim().length === 0; | ||||
| 
 | ||||
|     return !(isSubmitting || isUploading || isChangingUpload || length(fulltext) > 500 || (isOnlyWhitespace && !anyMedia)); | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   handleSubmit = (e) => { | ||||
|     if (this.props.text !== this.autosuggestTextarea.textarea.value) { | ||||
|  | @ -109,27 +109,27 @@ class ComposeForm extends ImmutablePureComponent { | |||
|     if (e) { | ||||
|       e.preventDefault(); | ||||
|     } | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   onSuggestionsClearRequested = () => { | ||||
|     this.props.onClearSuggestions(); | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   onSuggestionsFetchRequested = (token) => { | ||||
|     this.props.onFetchSuggestions(token); | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   onSuggestionSelected = (tokenStart, token, value) => { | ||||
|     this.props.onSuggestionSelected(tokenStart, token, value, ['text']); | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   onSpoilerSuggestionSelected = (tokenStart, token, value) => { | ||||
|     this.props.onSuggestionSelected(tokenStart, token, value, ['spoiler_text']); | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   handleChangeSpoilerText = (e) => { | ||||
|     this.props.onChangeSpoilerText(e.target.value); | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   handleFocus = () => { | ||||
|     if (this.composeForm && !this.props.singleColumn) { | ||||
|  | @ -138,7 +138,7 @@ class ComposeForm extends ImmutablePureComponent { | |||
|         this.composeForm.scrollIntoView(); | ||||
|       } | ||||
|     } | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   componentDidMount () { | ||||
|     this._updateFocusAndSelection({ }); | ||||
|  | @ -184,15 +184,15 @@ class ComposeForm extends ImmutablePureComponent { | |||
|         this.autosuggestTextarea.textarea.focus(); | ||||
|       } | ||||
|     } | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   setAutosuggestTextarea = (c) => { | ||||
|     this.autosuggestTextarea = c; | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   setSpoilerText = (c) => { | ||||
|     this.spoilerText = c; | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   setRef = c => { | ||||
|     this.composeForm = c; | ||||
|  | @ -204,7 +204,7 @@ class ComposeForm extends ImmutablePureComponent { | |||
|     const needsSpace   = data.custom && position > 0 && !allowedAroundShortCode.includes(text[position - 1]); | ||||
| 
 | ||||
|     this.props.onPickEmoji(position, data, needsSpace); | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   render () { | ||||
|     const { intl, onPaste, autoFocus } = this.props; | ||||
|  |  | |||
|  | @ -57,7 +57,7 @@ class ModifierPickerMenu extends React.PureComponent { | |||
| 
 | ||||
|   handleClick = e => { | ||||
|     this.props.onSelect(e.currentTarget.getAttribute('data-index') * 1); | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   componentWillReceiveProps (nextProps) { | ||||
|     if (nextProps.active) { | ||||
|  | @ -75,7 +75,7 @@ class ModifierPickerMenu extends React.PureComponent { | |||
|     if (this.node && !this.node.contains(e.target)) { | ||||
|       this.props.onClose(); | ||||
|     } | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   attachListeners () { | ||||
|     document.addEventListener('click', this.handleDocumentClick, false); | ||||
|  | @ -89,7 +89,7 @@ class ModifierPickerMenu extends React.PureComponent { | |||
| 
 | ||||
|   setRef = c => { | ||||
|     this.node = c; | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   render () { | ||||
|     const { active } = this.props; | ||||
|  | @ -124,12 +124,12 @@ class ModifierPicker extends React.PureComponent { | |||
|     } else { | ||||
|       this.props.onOpen(); | ||||
|     } | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   handleSelect = modifier => { | ||||
|     this.props.onChange(modifier); | ||||
|     this.props.onClose(); | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   render () { | ||||
|     const { active, modifier } = this.props; | ||||
|  | @ -174,7 +174,7 @@ class EmojiPickerMenu extends React.PureComponent { | |||
|     if (this.node && !this.node.contains(e.target)) { | ||||
|       this.props.onClose(); | ||||
|     } | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   componentDidMount () { | ||||
|     document.addEventListener('click', this.handleDocumentClick, false); | ||||
|  | @ -198,7 +198,7 @@ class EmojiPickerMenu extends React.PureComponent { | |||
| 
 | ||||
|   setRef = c => { | ||||
|     this.node = c; | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   getI18n = () => { | ||||
|     const { intl } = this.props; | ||||
|  | @ -219,7 +219,7 @@ class EmojiPickerMenu extends React.PureComponent { | |||
|         custom: intl.formatMessage(messages.custom), | ||||
|       }, | ||||
|     }; | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   handleClick = (emoji, event) => { | ||||
|     if (!emoji.native) { | ||||
|  | @ -229,19 +229,19 @@ class EmojiPickerMenu extends React.PureComponent { | |||
|       this.props.onClose(); | ||||
|     } | ||||
|     this.props.onPick(emoji); | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   handleModifierOpen = () => { | ||||
|     this.setState({ modifierOpen: true }); | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   handleModifierClose = () => { | ||||
|     this.setState({ modifierOpen: false }); | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   handleModifierChange = modifier => { | ||||
|     this.props.onSkinTone(modifier); | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   render () { | ||||
|     const { loading, style, intl, custom_emojis, skinTone, frequentlyUsedEmojis } = this.props; | ||||
|  | @ -325,7 +325,7 @@ class EmojiPickerDropdown extends React.PureComponent { | |||
| 
 | ||||
|   setRef = (c) => { | ||||
|     this.dropdown = c; | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   onShowDropdown = () => { | ||||
|     this.setState({ active: true }); | ||||
|  | @ -342,11 +342,11 @@ class EmojiPickerDropdown extends React.PureComponent { | |||
|         this.setState({ loading: false, active: false }); | ||||
|       }); | ||||
|     } | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   onHideDropdown = () => { | ||||
|     this.setState({ active: false }); | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   onToggle = (e) => { | ||||
|     if (!this.state.loading && (!e.key || e.key === 'Enter')) { | ||||
|  | @ -356,21 +356,21 @@ class EmojiPickerDropdown extends React.PureComponent { | |||
|         this.onShowDropdown(e); | ||||
|       } | ||||
|     } | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   handleKeyDown = e => { | ||||
|     if (e.key === 'Escape') { | ||||
|       this.onHideDropdown(); | ||||
|     } | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   setTargetRef = c => { | ||||
|     this.target = c; | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   findTarget = () => { | ||||
|     return this.target; | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   render () { | ||||
|     const { intl, onPickEmoji, onSkinTone, skinTone, frequentlyUsedEmojis, button } = this.props; | ||||
|  |  | |||
|  | @ -40,7 +40,7 @@ class LanguageDropdownMenu extends React.PureComponent { | |||
|     if (this.node && !this.node.contains(e.target)) { | ||||
|       this.props.onClose(); | ||||
|     } | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   componentDidMount () { | ||||
|     document.addEventListener('click', this.handleDocumentClick, false); | ||||
|  | @ -63,15 +63,15 @@ class LanguageDropdownMenu extends React.PureComponent { | |||
| 
 | ||||
|   setRef = c => { | ||||
|     this.node = c; | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   setListRef = c => { | ||||
|     this.listNode = c; | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   handleSearchChange = ({ target }) => { | ||||
|     this.setState({ searchValue: target.value }); | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   search () { | ||||
|     const { languages, value, frequentlyUsedLanguages } = this.props; | ||||
|  | @ -122,7 +122,7 @@ class LanguageDropdownMenu extends React.PureComponent { | |||
| 
 | ||||
|     this.props.onClose(); | ||||
|     this.props.onChange(value); | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   handleKeyDown = e => { | ||||
|     const { onClose } = this.props; | ||||
|  | @ -163,7 +163,7 @@ class LanguageDropdownMenu extends React.PureComponent { | |||
|       e.preventDefault(); | ||||
|       e.stopPropagation(); | ||||
|     } | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   handleSearchKeyDown = e => { | ||||
|     const { onChange, onClose } = this.props; | ||||
|  | @ -199,11 +199,11 @@ class LanguageDropdownMenu extends React.PureComponent { | |||
| 
 | ||||
|       break; | ||||
|     } | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   handleClear = () => { | ||||
|     this.setState({ searchValue: '' }); | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   renderItem = lang => { | ||||
|     const { value } = this.props; | ||||
|  | @ -213,7 +213,7 @@ class LanguageDropdownMenu extends React.PureComponent { | |||
|         <span className='language-dropdown__dropdown__results__item__native-name'>{lang[2]}</span> <span className='language-dropdown__dropdown__results__item__common-name'>({lang[1]})</span> | ||||
|       </div> | ||||
|     ); | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   render () { | ||||
|     const { intl } = this.props; | ||||
|  | @ -259,7 +259,7 @@ class LanguageDropdown extends React.PureComponent { | |||
|     } | ||||
| 
 | ||||
|     this.setState({ open: !this.state.open }); | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   handleClose = () => { | ||||
|     const { value, onClose } = this.props; | ||||
|  | @ -270,24 +270,24 @@ class LanguageDropdown extends React.PureComponent { | |||
| 
 | ||||
|     this.setState({ open: false }); | ||||
|     onClose(value); | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   handleChange = value => { | ||||
|     const { onChange } = this.props; | ||||
|     onChange(value); | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   setTargetRef = c => { | ||||
|     this.target = c; | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   findTarget = () => { | ||||
|     return this.target; | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   handleOverlayEnter = (state) => { | ||||
|     this.setState({ placement: state.placement }); | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   render () { | ||||
|     const { value, intl, frequentlyUsedLanguages } = this.props; | ||||
|  |  | |||
|  | @ -27,7 +27,7 @@ class PollButton extends React.PureComponent { | |||
| 
 | ||||
|   handleClick = () => { | ||||
|     this.props.onClick(); | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   render () { | ||||
|     const { intl, active, unavailable, disabled } = this.props; | ||||
|  |  | |||
|  | @ -58,19 +58,19 @@ class Option extends React.PureComponent { | |||
|     if (e.key === 'Enter' || e.key === ' ') { | ||||
|       this.handleToggleMultiple(e); | ||||
|     } | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   onSuggestionsClearRequested = () => { | ||||
|     this.props.onClearSuggestions(); | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   onSuggestionsFetchRequested = (token) => { | ||||
|     this.props.onFetchSuggestions(token); | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   onSuggestionSelected = (tokenStart, token, value) => { | ||||
|     this.props.onSuggestionSelected(tokenStart, token, value, ['poll', 'options', this.props.index]); | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   render () { | ||||
|     const { isPollMultiple, title, lang, index, autoFocus, intl } = this.props; | ||||
|  |  | |||
|  | @ -35,7 +35,7 @@ class PrivacyDropdownMenu extends React.PureComponent { | |||
|     if (this.node && !this.node.contains(e.target)) { | ||||
|       this.props.onClose(); | ||||
|     } | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   handleKeyDown = e => { | ||||
|     const { items } = this.props; | ||||
|  | @ -79,7 +79,7 @@ class PrivacyDropdownMenu extends React.PureComponent { | |||
|       e.preventDefault(); | ||||
|       e.stopPropagation(); | ||||
|     } | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   handleClick = e => { | ||||
|     const value = e.currentTarget.getAttribute('data-index'); | ||||
|  | @ -88,7 +88,7 @@ class PrivacyDropdownMenu extends React.PureComponent { | |||
| 
 | ||||
|     this.props.onClose(); | ||||
|     this.props.onChange(value); | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   componentDidMount () { | ||||
|     document.addEventListener('click', this.handleDocumentClick, false); | ||||
|  | @ -103,11 +103,11 @@ class PrivacyDropdownMenu extends React.PureComponent { | |||
| 
 | ||||
|   setRef = c => { | ||||
|     this.node = c; | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   setFocusRef = c => { | ||||
|     this.focusedItem = c; | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   render () { | ||||
|     const { style, items, value } = this.props; | ||||
|  | @ -168,7 +168,7 @@ class PrivacyDropdown extends React.PureComponent { | |||
|       } | ||||
|       this.setState({ open: !this.state.open }); | ||||
|     } | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   handleModalActionClick = (e) => { | ||||
|     e.preventDefault(); | ||||
|  | @ -177,7 +177,7 @@ class PrivacyDropdown extends React.PureComponent { | |||
| 
 | ||||
|     this.props.onModalClose(); | ||||
|     this.props.onChange(value); | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   handleKeyDown = e => { | ||||
|     switch(e.key) { | ||||
|  | @ -185,13 +185,13 @@ class PrivacyDropdown extends React.PureComponent { | |||
|       this.handleClose(); | ||||
|       break; | ||||
|     } | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   handleMouseDown = () => { | ||||
|     if (!this.state.open) { | ||||
|       this.activeElement = document.activeElement; | ||||
|     } | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   handleButtonKeyDown = (e) => { | ||||
|     switch(e.key) { | ||||
|  | @ -200,18 +200,18 @@ class PrivacyDropdown extends React.PureComponent { | |||
|       this.handleMouseDown(); | ||||
|       break; | ||||
|     } | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   handleClose = () => { | ||||
|     if (this.state.open && this.activeElement) { | ||||
|       this.activeElement.focus({ preventScroll: true }); | ||||
|     } | ||||
|     this.setState({ open: false }); | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   handleChange = value => { | ||||
|     this.props.onChange(value); | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   componentWillMount () { | ||||
|     const { intl: { formatMessage } } = this.props; | ||||
|  | @ -231,15 +231,15 @@ class PrivacyDropdown extends React.PureComponent { | |||
| 
 | ||||
|   setTargetRef = c => { | ||||
|     this.target = c; | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   findTarget = () => { | ||||
|     return this.target; | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   handleOverlayEnter = (state) => { | ||||
|     this.setState({ placement: state.placement }); | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   render () { | ||||
|     const { value, container, disabled, intl } = this.props; | ||||
|  |  | |||
|  | @ -27,14 +27,14 @@ class ReplyIndicator extends ImmutablePureComponent { | |||
| 
 | ||||
|   handleClick = () => { | ||||
|     this.props.onCancel(); | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   handleAccountClick = (e) => { | ||||
|     if (e.button === 0 && !(e.ctrlKey || e.metaKey)) { | ||||
|       e.preventDefault(); | ||||
|       this.context.router.history.push(`/@${this.props.status.getIn(['account', 'acct'])}`); | ||||
|     } | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   render () { | ||||
|     const { status, intl } = this.props; | ||||
|  |  | |||
|  | @ -58,11 +58,11 @@ class Search extends React.PureComponent { | |||
| 
 | ||||
|   setRef = c => { | ||||
|     this.searchForm = c; | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   handleChange = (e) => { | ||||
|     this.props.onChange(e.target.value); | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   handleClear = (e) => { | ||||
|     e.preventDefault(); | ||||
|  | @ -70,7 +70,7 @@ class Search extends React.PureComponent { | |||
|     if (this.props.value.length > 0 || this.props.submitted) { | ||||
|       this.props.onClear(); | ||||
|     } | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   handleKeyUp = (e) => { | ||||
|     if (e.key === 'Enter') { | ||||
|  | @ -84,7 +84,7 @@ class Search extends React.PureComponent { | |||
|     } else if (e.key === 'Escape') { | ||||
|       document.querySelector('.ui').parentElement.focus(); | ||||
|     } | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   handleFocus = () => { | ||||
|     this.setState({ expanded: true }); | ||||
|  | @ -96,15 +96,15 @@ class Search extends React.PureComponent { | |||
|         this.searchForm.scrollIntoView(); | ||||
|       } | ||||
|     } | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   handleBlur = () => { | ||||
|     this.setState({ expanded: false }); | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   findTarget = () => { | ||||
|     return this.searchForm; | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   render () { | ||||
|     const { intl, value, submitted } = this.props; | ||||
|  |  | |||
|  | @ -22,12 +22,12 @@ export default class Upload extends ImmutablePureComponent { | |||
|   handleUndoClick = e => { | ||||
|     e.stopPropagation(); | ||||
|     this.props.onUndo(this.props.media.get('id')); | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   handleFocalPointClick = e => { | ||||
|     e.stopPropagation(); | ||||
|     this.props.onOpenFocalPoint(this.props.media.get('id')); | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   render () { | ||||
|     const { media } = this.props; | ||||
|  |  | |||
|  | @ -41,15 +41,15 @@ class UploadButton extends ImmutablePureComponent { | |||
|     if (e.target.files.length > 0) { | ||||
|       this.props.onSelectFile(e.target.files); | ||||
|     } | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   handleClick = () => { | ||||
|     this.fileElement.click(); | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   setRef = (c) => { | ||||
|     this.fileElement = c; | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   render () { | ||||
|     const { intl, resetFileKey, unavailable, disabled, acceptContentTypes } = this.props; | ||||
|  |  | |||
|  | @ -74,15 +74,15 @@ class Compose extends React.PureComponent { | |||
|     })); | ||||
| 
 | ||||
|     return false; | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   onFocus = () => { | ||||
|     this.props.dispatch(changeComposing(true)); | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   onBlur = () => { | ||||
|     this.props.dispatch(changeComposing(false)); | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   render () { | ||||
|     const { multiColumn, showSearch, intl } = this.props; | ||||
|  |  | |||
|  | @ -55,7 +55,7 @@ class Conversation extends ImmutablePureComponent { | |||
|       let emoji = emojis[i]; | ||||
|       emoji.src = emoji.getAttribute('data-original'); | ||||
|     } | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   handleMouseLeave = ({ currentTarget }) => { | ||||
|     if (autoPlayGif) { | ||||
|  | @ -68,7 +68,7 @@ class Conversation extends ImmutablePureComponent { | |||
|       let emoji = emojis[i]; | ||||
|       emoji.src = emoji.getAttribute('data-static'); | ||||
|     } | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   handleClick = () => { | ||||
|     if (!this.context.router) { | ||||
|  | @ -82,35 +82,35 @@ class Conversation extends ImmutablePureComponent { | |||
|     } | ||||
| 
 | ||||
|     this.context.router.history.push(`/@${lastStatus.getIn(['account', 'acct'])}/${lastStatus.get('id')}`); | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   handleMarkAsRead = () => { | ||||
|     this.props.markRead(); | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   handleReply = () => { | ||||
|     this.props.reply(this.props.lastStatus, this.context.router.history); | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   handleDelete = () => { | ||||
|     this.props.delete(); | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   handleHotkeyMoveUp = () => { | ||||
|     this.props.onMoveUp(this.props.conversationId); | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   handleHotkeyMoveDown = () => { | ||||
|     this.props.onMoveDown(this.props.conversationId); | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   handleConversationMute = () => { | ||||
|     this.props.onMute(this.props.lastStatus); | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   handleShowMore = () => { | ||||
|     this.props.onToggleHidden(this.props.lastStatus); | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   render () { | ||||
|     const { accounts, lastStatus, unread, scrollKey, intl } = this.props; | ||||
|  |  | |||
|  | @ -16,17 +16,17 @@ export default class ConversationsList extends ImmutablePureComponent { | |||
|     onLoadMore: PropTypes.func, | ||||
|   }; | ||||
| 
 | ||||
|   getCurrentIndex = id => this.props.conversations.findIndex(x => x.get('id') === id) | ||||
|   getCurrentIndex = id => this.props.conversations.findIndex(x => x.get('id') === id); | ||||
| 
 | ||||
|   handleMoveUp = id => { | ||||
|     const elementIndex = this.getCurrentIndex(id) - 1; | ||||
|     this._selectChild(elementIndex, true); | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   handleMoveDown = id => { | ||||
|     const elementIndex = this.getCurrentIndex(id) + 1; | ||||
|     this._selectChild(elementIndex, false); | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   _selectChild (index, align_top) { | ||||
|     const container = this.node.node; | ||||
|  | @ -44,7 +44,7 @@ export default class ConversationsList extends ImmutablePureComponent { | |||
| 
 | ||||
|   setRef = c => { | ||||
|     this.node = c; | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   handleLoadOlder = debounce(() => { | ||||
|     const last = this.props.conversations.last(); | ||||
|  | @ -52,7 +52,7 @@ export default class ConversationsList extends ImmutablePureComponent { | |||
|     if (last && last.get('last_status')) { | ||||
|       this.props.onLoadMore(last.get('last_status')); | ||||
|     } | ||||
|   }, 300, { leading: true }) | ||||
|   }, 300, { leading: true }); | ||||
| 
 | ||||
|   render () { | ||||
|     const { conversations, onLoadMore, ...other } = this.props; | ||||
|  |  | |||
|  | @ -34,16 +34,16 @@ class DirectTimeline extends React.PureComponent { | |||
|     } else { | ||||
|       dispatch(addColumn('DIRECT', {})); | ||||
|     } | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   handleMove = (dir) => { | ||||
|     const { columnId, dispatch } = this.props; | ||||
|     dispatch(moveColumn(columnId, dir)); | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   handleHeaderClick = () => { | ||||
|     this.column.scrollTop(); | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   componentDidMount () { | ||||
|     const { dispatch } = this.props; | ||||
|  | @ -64,11 +64,11 @@ class DirectTimeline extends React.PureComponent { | |||
| 
 | ||||
|   setRef = c => { | ||||
|     this.column = c; | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   handleLoadMore = maxId => { | ||||
|     this.props.dispatch(expandConversations({ maxId })); | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   render () { | ||||
|     const { intl, hasUnread, columnId, multiColumn } = this.props; | ||||
|  |  | |||
|  | @ -115,7 +115,7 @@ class AccountCard extends ImmutablePureComponent { | |||
|       let emoji = emojis[i]; | ||||
|       emoji.src = emoji.getAttribute('data-original'); | ||||
|     } | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   handleMouseLeave = ({ currentTarget }) => { | ||||
|     if (autoPlayGif) { | ||||
|  | @ -128,7 +128,7 @@ class AccountCard extends ImmutablePureComponent { | |||
|       let emoji = emojis[i]; | ||||
|       emoji.src = emoji.getAttribute('data-static'); | ||||
|     } | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   handleFollow = () => { | ||||
|     this.props.onFollow(this.props.account); | ||||
|  | @ -140,11 +140,11 @@ class AccountCard extends ImmutablePureComponent { | |||
| 
 | ||||
|   handleMute = () => { | ||||
|     this.props.onMute(this.props.account); | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   handleEditProfile = () => { | ||||
|     window.open('/settings/profile', '_blank'); | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   render() { | ||||
|     const { account, intl } = this.props; | ||||
|  |  | |||
|  | @ -64,7 +64,7 @@ class Directory extends React.PureComponent { | |||
|     } else { | ||||
|       dispatch(addColumn('DIRECTORY', this.getParams(this.props, this.state))); | ||||
|     } | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   getParams = (props, state) => ({ | ||||
|     order: state.order === null ? (props.params.order || 'active') : state.order, | ||||
|  | @ -74,11 +74,11 @@ class Directory extends React.PureComponent { | |||
|   handleMove = dir => { | ||||
|     const { columnId, dispatch } = this.props; | ||||
|     dispatch(moveColumn(columnId, dir)); | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   handleHeaderClick = () => { | ||||
|     this.column.scrollTop(); | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   componentDidMount () { | ||||
|     const { dispatch } = this.props; | ||||
|  | @ -97,7 +97,7 @@ class Directory extends React.PureComponent { | |||
| 
 | ||||
|   setRef = c => { | ||||
|     this.column = c; | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   handleChangeOrder = e => { | ||||
|     const { dispatch, columnId } = this.props; | ||||
|  | @ -107,7 +107,7 @@ class Directory extends React.PureComponent { | |||
|     } else { | ||||
|       this.setState({ order: e.target.value }); | ||||
|     } | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   handleChangeLocal = e => { | ||||
|     const { dispatch, columnId } = this.props; | ||||
|  | @ -117,12 +117,12 @@ class Directory extends React.PureComponent { | |||
|     } else { | ||||
|       this.setState({ local: e.target.value === '1' }); | ||||
|     } | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   handleLoadMore = () => { | ||||
|     const { dispatch } = this.props; | ||||
|     dispatch(expandDirectory(this.getParams(this.props, this.state))); | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   render () { | ||||
|     const { isLoading, accountIds, intl, columnId, multiColumn, domain } = this.props; | ||||
|  |  | |||
|  | @ -41,11 +41,11 @@ class Explore extends React.PureComponent { | |||
| 
 | ||||
|   handleHeaderClick = () => { | ||||
|     this.column.scrollTop(); | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   setRef = c => { | ||||
|     this.column = c; | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   render() { | ||||
|     const { intl, multiColumn, isSearching } = this.props; | ||||
|  |  | |||
|  | @ -33,7 +33,7 @@ class Statuses extends React.PureComponent { | |||
|   handleLoadMore = debounce(() => { | ||||
|     const { dispatch } = this.props; | ||||
|     dispatch(expandTrendingStatuses()); | ||||
|   }, 300, { leading: true }) | ||||
|   }, 300, { leading: true }); | ||||
| 
 | ||||
|   render () { | ||||
|     const { isLoading, hasMore, statusIds, multiColumn } = this.props; | ||||
|  |  | |||
|  | @ -48,24 +48,24 @@ class Favourites extends ImmutablePureComponent { | |||
|     } else { | ||||
|       dispatch(addColumn('FAVOURITES', {})); | ||||
|     } | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   handleMove = (dir) => { | ||||
|     const { columnId, dispatch } = this.props; | ||||
|     dispatch(moveColumn(columnId, dir)); | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   handleHeaderClick = () => { | ||||
|     this.column.scrollTop(); | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   setRef = c => { | ||||
|     this.column = c; | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   handleLoadMore = debounce(() => { | ||||
|     this.props.dispatch(expandFavouritedStatuses()); | ||||
|   }, 300, { leading: true }) | ||||
|   }, 300, { leading: true }); | ||||
| 
 | ||||
|   render () { | ||||
|     const { intl, statusIds, columnId, multiColumn, hasMore, isLoading } = this.props; | ||||
|  |  | |||
|  | @ -47,7 +47,7 @@ class Favourites extends ImmutablePureComponent { | |||
| 
 | ||||
|   handleRefresh = () => { | ||||
|     this.props.dispatch(fetchFavourites(this.props.params.statusId)); | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   render () { | ||||
|     const { intl, accountIds, multiColumn } = this.props; | ||||
|  |  | |||
|  | @ -71,7 +71,7 @@ class SelectFilter extends React.PureComponent { | |||
|         <span className='language-dropdown__dropdown__results__item__native-name'>{filter[1]}</span> {warning} | ||||
|       </div> | ||||
|     ); | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   renderCreateNew (name) { | ||||
|     return ( | ||||
|  | @ -83,11 +83,11 @@ class SelectFilter extends React.PureComponent { | |||
| 
 | ||||
|   handleSearchChange = ({ target }) => { | ||||
|     this.setState({ searchValue: target.value }); | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   setListRef = c => { | ||||
|     this.listNode = c; | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   handleKeyDown = e => { | ||||
|     const index = Array.from(this.listNode.childNodes).findIndex(node => node === e.currentTarget); | ||||
|  | @ -125,7 +125,7 @@ class SelectFilter extends React.PureComponent { | |||
|       e.preventDefault(); | ||||
|       e.stopPropagation(); | ||||
|     } | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   handleSearchKeyDown = e => { | ||||
|     let element = null; | ||||
|  | @ -143,11 +143,11 @@ class SelectFilter extends React.PureComponent { | |||
| 
 | ||||
|       break; | ||||
|     } | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   handleClear = () => { | ||||
|     this.setState({ searchValue: '' }); | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   handleItemClick = e => { | ||||
|     const value = e.currentTarget.getAttribute('data-index'); | ||||
|  | @ -155,7 +155,7 @@ class SelectFilter extends React.PureComponent { | |||
|     e.preventDefault(); | ||||
| 
 | ||||
|     this.props.onSelectFilter(value); | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   handleNewFilterClick = e => { | ||||
|     e.preventDefault(); | ||||
|  |  | |||
|  | @ -50,7 +50,7 @@ class Account extends ImmutablePureComponent { | |||
|     } else { | ||||
|       dispatch(followAccount(account.get('id'))); | ||||
|     } | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   render () { | ||||
|     const { account, intl } = this.props; | ||||
|  |  | |||
|  | @ -69,7 +69,7 @@ class FollowRecommendations extends ImmutablePureComponent { | |||
|     })); | ||||
| 
 | ||||
|     router.history.push('/home'); | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   render () { | ||||
|     const { suggestions, isLoading } = this.props; | ||||
|  |  | |||
|  | @ -35,7 +35,7 @@ class Content extends ImmutablePureComponent { | |||
| 
 | ||||
|   setRef = c => { | ||||
|     this.node = c; | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   componentDidMount () { | ||||
|     this._updateLinks(); | ||||
|  | @ -89,7 +89,7 @@ class Content extends ImmutablePureComponent { | |||
|       e.preventDefault(); | ||||
|       this.context.router.history.push(`/@${mention.get('acct')}`); | ||||
|     } | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   onHashtagClick = (hashtag, e) => { | ||||
|     hashtag = hashtag.replace(/^#/, ''); | ||||
|  | @ -98,14 +98,14 @@ class Content extends ImmutablePureComponent { | |||
|       e.preventDefault(); | ||||
|       this.context.router.history.push(`/tags/${hashtag}`); | ||||
|     } | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   onStatusClick = (status, e) => { | ||||
|     if (this.context.router && e.button === 0 && !(e.ctrlKey || e.metaKey)) { | ||||
|       e.preventDefault(); | ||||
|       this.context.router.history.push(`/@${status.getIn(['account', 'acct'])}/${status.get('id')}`); | ||||
|     } | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   handleMouseEnter = ({ currentTarget }) => { | ||||
|     if (autoPlayGif) { | ||||
|  | @ -118,7 +118,7 @@ class Content extends ImmutablePureComponent { | |||
|       let emoji = emojis[i]; | ||||
|       emoji.src = emoji.getAttribute('data-original'); | ||||
|     } | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   handleMouseLeave = ({ currentTarget }) => { | ||||
|     if (autoPlayGif) { | ||||
|  | @ -131,7 +131,7 @@ class Content extends ImmutablePureComponent { | |||
|       let emoji = emojis[i]; | ||||
|       emoji.src = emoji.getAttribute('data-static'); | ||||
|     } | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   render () { | ||||
|     const { announcement } = this.props; | ||||
|  | @ -216,11 +216,11 @@ class Reaction extends ImmutablePureComponent { | |||
|     } else { | ||||
|       addReaction(announcementId, reaction.get('name')); | ||||
|     } | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   handleMouseEnter = () => this.setState({ hovered: true }) | ||||
|   handleMouseEnter = () => this.setState({ hovered: true }); | ||||
| 
 | ||||
|   handleMouseLeave = () => this.setState({ hovered: false }) | ||||
|   handleMouseLeave = () => this.setState({ hovered: false }); | ||||
| 
 | ||||
|   render () { | ||||
|     const { reaction } = this.props; | ||||
|  | @ -254,7 +254,7 @@ class ReactionsBar extends ImmutablePureComponent { | |||
|   handleEmojiPick = data => { | ||||
|     const { addReaction, announcementId } = this.props; | ||||
|     addReaction(announcementId, data.native.replace(/:/g, '')); | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   willEnter () { | ||||
|     return { scale: reduceMotion ? 1 : 0 }; | ||||
|  | @ -397,15 +397,15 @@ class Announcements extends ImmutablePureComponent { | |||
| 
 | ||||
|   handleChangeIndex = index => { | ||||
|     this.setState({ index: index % this.props.announcements.size }); | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   handleNextClick = () => { | ||||
|     this.setState({ index: (this.state.index + 1) % this.props.announcements.size }); | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   handlePrevClick = () => { | ||||
|     this.setState({ index: (this.props.announcements.size + this.state.index - 1) % this.props.announcements.size }); | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   render () { | ||||
|     const { announcements, intl } = this.props; | ||||
|  |  | |||
|  | @ -54,7 +54,7 @@ class HashtagTimeline extends React.PureComponent { | |||
|     } else { | ||||
|       dispatch(addColumn('HASHTAG', { id: this.props.params.id })); | ||||
|     } | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   title = () => { | ||||
|     const { id } = this.props.params; | ||||
|  | @ -73,7 +73,7 @@ class HashtagTimeline extends React.PureComponent { | |||
|     } | ||||
| 
 | ||||
|     return title; | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   additionalFor = (mode) => { | ||||
|     const { tags } = this.props.params; | ||||
|  | @ -83,16 +83,16 @@ class HashtagTimeline extends React.PureComponent { | |||
|     } else { | ||||
|       return ''; | ||||
|     } | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   handleMove = (dir) => { | ||||
|     const { columnId, dispatch } = this.props; | ||||
|     dispatch(moveColumn(columnId, dir)); | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   handleHeaderClick = () => { | ||||
|     this.column.scrollTop(); | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   _subscribe (dispatch, id, tags = {}, local) { | ||||
|     const { signedIn } = this.context.identity; | ||||
|  | @ -157,14 +157,14 @@ class HashtagTimeline extends React.PureComponent { | |||
| 
 | ||||
|   setRef = c => { | ||||
|     this.column = c; | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   handleLoadMore = maxId => { | ||||
|     const { dispatch, params } = this.props; | ||||
|     const { id, tags, local }  = params; | ||||
| 
 | ||||
|     dispatch(expandHashtagTimeline(id, { maxId, tags, local })); | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   handleFollow = () => { | ||||
|     const { dispatch, params, tag } = this.props; | ||||
|  | @ -180,7 +180,7 @@ class HashtagTimeline extends React.PureComponent { | |||
|     } else { | ||||
|       dispatch(followHashtag(id)); | ||||
|     } | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   render () { | ||||
|     const { hasUnread, columnId, multiColumn, tag, intl } = this.props; | ||||
|  |  | |||
|  | @ -58,24 +58,24 @@ class HomeTimeline extends React.PureComponent { | |||
|     } else { | ||||
|       dispatch(addColumn('HOME', {})); | ||||
|     } | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   handleMove = (dir) => { | ||||
|     const { columnId, dispatch } = this.props; | ||||
|     dispatch(moveColumn(columnId, dir)); | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   handleHeaderClick = () => { | ||||
|     this.column.scrollTop(); | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   setRef = c => { | ||||
|     this.column = c; | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   handleLoadMore = maxId => { | ||||
|     this.props.dispatch(expandHomeTimeline({ maxId })); | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   componentDidMount () { | ||||
|     setTimeout(() => this.props.dispatch(fetchAnnouncements()), 700); | ||||
|  | @ -114,7 +114,7 @@ class HomeTimeline extends React.PureComponent { | |||
|   handleToggleAnnouncementsClick = (e) => { | ||||
|     e.stopPropagation(); | ||||
|     this.props.dispatch(toggleShowAnnouncements()); | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   render () { | ||||
|     const { intl, hasUnread, columnId, multiColumn, hasAnnouncements, unreadAnnouncements, showAnnouncements } = this.props; | ||||
|  |  | |||
|  | @ -30,14 +30,14 @@ class Copypaste extends React.PureComponent { | |||
| 
 | ||||
|   setRef = c => { | ||||
|     this.input = c; | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   handleInputClick = () => { | ||||
|     this.setState({ copied: false }); | ||||
|     this.input.focus(); | ||||
|     this.input.select(); | ||||
|     this.input.setSelectionRange(0, this.input.value.length); | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   handleButtonClick = () => { | ||||
|     const { value } = this.props; | ||||
|  | @ -45,7 +45,7 @@ class Copypaste extends React.PureComponent { | |||
|     this.input.blur(); | ||||
|     this.setState({ copied: true }); | ||||
|     this.timeout = setTimeout(() => this.setState({ copied: false }), 700); | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   componentWillUnmount () { | ||||
|     if (this.timeout) clearTimeout(this.timeout); | ||||
|  | @ -86,7 +86,7 @@ class InteractionModal extends React.PureComponent { | |||
| 
 | ||||
|   handleSignupClick = () => { | ||||
|     this.props.onSignupClick(); | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   render () { | ||||
|     const { url, type, displayNameHtml } = this.props; | ||||
|  |  | |||
|  | @ -33,16 +33,16 @@ class ListForm extends React.PureComponent { | |||
| 
 | ||||
|   handleChange = e => { | ||||
|     this.props.onChange(e.target.value); | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   handleSubmit = e => { | ||||
|     e.preventDefault(); | ||||
|     this.props.onSubmit(); | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   handleClick = () => { | ||||
|     this.props.onSubmit(); | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   render () { | ||||
|     const { value, disabled, intl } = this.props; | ||||
|  |  | |||
|  | @ -34,17 +34,17 @@ class Search extends React.PureComponent { | |||
| 
 | ||||
|   handleChange = e => { | ||||
|     this.props.onChange(e.target.value); | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   handleKeyUp = e => { | ||||
|     if (e.keyCode === 13) { | ||||
|       this.props.onSubmit(this.props.value); | ||||
|     } | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   handleClear = () => { | ||||
|     this.props.onClear(); | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   render () { | ||||
|     const { value, intl } = this.props; | ||||
|  |  | |||
|  | @ -58,16 +58,16 @@ class ListTimeline extends React.PureComponent { | |||
|       dispatch(addColumn('LIST', { id: this.props.params.id })); | ||||
|       this.context.router.history.push('/'); | ||||
|     } | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   handleMove = (dir) => { | ||||
|     const { columnId, dispatch } = this.props; | ||||
|     dispatch(moveColumn(columnId, dir)); | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   handleHeaderClick = () => { | ||||
|     this.column.scrollTop(); | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   componentDidMount () { | ||||
|     const { dispatch } = this.props; | ||||
|  | @ -105,16 +105,16 @@ class ListTimeline extends React.PureComponent { | |||
| 
 | ||||
|   setRef = c => { | ||||
|     this.column = c; | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   handleLoadMore = maxId => { | ||||
|     const { id } = this.props.params; | ||||
|     this.props.dispatch(expandListTimeline(id, { maxId })); | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   handleEditClick = () => { | ||||
|     this.props.dispatch(openModal('LIST_EDITOR', { listId: this.props.params.id })); | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   handleDeleteClick = () => { | ||||
|     const { dispatch, columnId, intl } = this.props; | ||||
|  | @ -133,13 +133,13 @@ class ListTimeline extends React.PureComponent { | |||
|         } | ||||
|       }, | ||||
|     })); | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   handleRepliesPolicyChange = ({ target }) => { | ||||
|     const { dispatch } = this.props; | ||||
|     const { id } = this.props.params; | ||||
|     dispatch(updateList(id, undefined, false, target.value)); | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   render () { | ||||
|     const { hasUnread, columnId, multiColumn, list, intl } = this.props; | ||||
|  |  | |||
|  | @ -34,16 +34,16 @@ class NewListForm extends React.PureComponent { | |||
| 
 | ||||
|   handleChange = e => { | ||||
|     this.props.onChange(e.target.value); | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   handleSubmit = e => { | ||||
|     e.preventDefault(); | ||||
|     this.props.onSubmit(); | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   handleClick = () => { | ||||
|     this.props.onSubmit(); | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   render () { | ||||
|     const { value, disabled, intl } = this.props; | ||||
|  |  | |||
|  | @ -26,7 +26,7 @@ export default class ColumnSettings extends React.PureComponent { | |||
| 
 | ||||
|   onPushChange = (path, checked) => { | ||||
|     this.props.onChange(['push', ...path], checked); | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   render () { | ||||
|     const { settings, pushSettings, onChange, onClear, alertsEnabled, browserSupport, browserPermission, onRequestNotificationPermission } = this.props; | ||||
|  |  | |||
|  | @ -61,12 +61,12 @@ class Notification extends ImmutablePureComponent { | |||
|   handleMoveUp = () => { | ||||
|     const { notification, onMoveUp } = this.props; | ||||
|     onMoveUp(notification.get('id')); | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   handleMoveDown = () => { | ||||
|     const { notification, onMoveDown } = this.props; | ||||
|     onMoveDown(notification.get('id')); | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   handleOpen = () => { | ||||
|     const { notification } = this.props; | ||||
|  | @ -76,34 +76,34 @@ class Notification extends ImmutablePureComponent { | |||
|     } else { | ||||
|       this.handleOpenProfile(); | ||||
|     } | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   handleOpenProfile = () => { | ||||
|     const { notification } = this.props; | ||||
|     this.context.router.history.push(`/@${notification.getIn(['account', 'acct'])}`); | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   handleMention = e => { | ||||
|     e.preventDefault(); | ||||
| 
 | ||||
|     const { notification, onMention } = this.props; | ||||
|     onMention(notification.get('account'), this.context.router.history); | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   handleHotkeyFavourite = () => { | ||||
|     const { status } = this.props; | ||||
|     if (status) this.props.onFavourite(status); | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   handleHotkeyBoost = e => { | ||||
|     const { status } = this.props; | ||||
|     if (status) this.props.onReblog(status, e); | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   handleHotkeyToggleHidden = () => { | ||||
|     const { status } = this.props; | ||||
|     if (status) this.props.onToggleHidden(status); | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   getHandlers () { | ||||
|     return { | ||||
|  |  | |||
|  | @ -23,11 +23,11 @@ class NotificationsPermissionBanner extends React.PureComponent { | |||
| 
 | ||||
|   handleClick = () => { | ||||
|     this.props.dispatch(requestBrowserPermission()); | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   handleClose = () => { | ||||
|     this.props.dispatch(changeSetting(['notifications', 'dismissPermissionBanner'], true)); | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   render () { | ||||
|     const { intl } = this.props; | ||||
|  |  | |||
|  | @ -13,11 +13,11 @@ export default class SettingToggle extends React.PureComponent { | |||
|     onChange: PropTypes.func.isRequired, | ||||
|     defaultValue: PropTypes.bool, | ||||
|     disabled: PropTypes.bool, | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   onChange = ({ target }) => { | ||||
|     this.props.onChange(this.props.settingPath, target.checked); | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   render () { | ||||
|     const { prefix, settings, settingPath, label, defaultValue, disabled } = this.props; | ||||
|  |  | |||
|  | @ -136,30 +136,30 @@ class Notifications extends React.PureComponent { | |||
|     } else { | ||||
|       dispatch(addColumn('NOTIFICATIONS', {})); | ||||
|     } | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   handleMove = (dir) => { | ||||
|     const { columnId, dispatch } = this.props; | ||||
|     dispatch(moveColumn(columnId, dir)); | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   handleHeaderClick = () => { | ||||
|     this.column.scrollTop(); | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   setColumnRef = c => { | ||||
|     this.column = c; | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   handleMoveUp = id => { | ||||
|     const elementIndex = this.props.notifications.findIndex(item => item !== null && item.get('id') === id) - 1; | ||||
|     this._selectChild(elementIndex, true); | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   handleMoveDown = id => { | ||||
|     const elementIndex = this.props.notifications.findIndex(item => item !== null && item.get('id') === id) + 1; | ||||
|     this._selectChild(elementIndex, false); | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   _selectChild (index, align_top) { | ||||
|     const container = this.column.node; | ||||
|  |  | |||
|  | @ -112,7 +112,7 @@ class Footer extends ImmutablePureComponent { | |||
|   _performReblog = (status, privacy) => { | ||||
|     const { dispatch } = this.props; | ||||
|     dispatch(reblog(status, privacy)); | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   handleReblogClick = e => { | ||||
|     const { dispatch, status } = this.props; | ||||
|  | @ -149,7 +149,7 @@ class Footer extends ImmutablePureComponent { | |||
|     } | ||||
| 
 | ||||
|     router.history.push(`/@${status.getIn(['account', 'acct'])}/${status.get('id')}`); | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   render () { | ||||
|     const { status, intl, withOpenButton } = this.props; | ||||
|  |  | |||
|  | @ -32,7 +32,7 @@ class PictureInPicture extends React.Component { | |||
|   handleClose = () => { | ||||
|     const { dispatch } = this.props; | ||||
|     dispatch(removePictureInPicture()); | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   render () { | ||||
|     const { type, src, currentTime, accountId, statusId } = this.props; | ||||
|  |  | |||
|  | @ -37,11 +37,11 @@ class PinnedStatuses extends ImmutablePureComponent { | |||
| 
 | ||||
|   handleHeaderClick = () => { | ||||
|     this.column.scrollTop(); | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   setRef = c => { | ||||
|     this.column = c; | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   render () { | ||||
|     const { intl, statusIds, hasMore, multiColumn } = this.props; | ||||
|  |  | |||
|  | @ -62,16 +62,16 @@ class PublicTimeline extends React.PureComponent { | |||
|     } else { | ||||
|       dispatch(addColumn(onlyRemote ? 'REMOTE' : 'PUBLIC', { other: { onlyMedia, onlyRemote } })); | ||||
|     } | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   handleMove = (dir) => { | ||||
|     const { columnId, dispatch } = this.props; | ||||
|     dispatch(moveColumn(columnId, dir)); | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   handleHeaderClick = () => { | ||||
|     this.column.scrollTop(); | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   componentDidMount () { | ||||
|     const { dispatch, onlyMedia, onlyRemote } = this.props; | ||||
|  | @ -111,13 +111,13 @@ class PublicTimeline extends React.PureComponent { | |||
| 
 | ||||
|   setRef = c => { | ||||
|     this.column = c; | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   handleLoadMore = maxId => { | ||||
|     const { dispatch, onlyMedia, onlyRemote } = this.props; | ||||
| 
 | ||||
|     dispatch(expandPublicTimeline({ maxId, onlyMedia, onlyRemote })); | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   render () { | ||||
|     const { intl, columnId, hasUnread, multiColumn, onlyMedia, onlyRemote } = this.props; | ||||
|  |  | |||
|  | @ -47,7 +47,7 @@ class Reblogs extends ImmutablePureComponent { | |||
| 
 | ||||
|   handleRefresh = () => { | ||||
|     this.props.dispatch(fetchReblogs(this.props.params.statusId)); | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   render () { | ||||
|     const { intl, accountIds, multiColumn } = this.props; | ||||
|  |  | |||
|  | @ -24,12 +24,12 @@ export default class Option extends React.PureComponent { | |||
|       e.preventDefault(); | ||||
|       onToggle(value, !checked); | ||||
|     } | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   handleChange = e => { | ||||
|     const { value, onToggle } = this.props; | ||||
|     onToggle(value, e.target.checked); | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   render () { | ||||
|     const { name, value, checked, label, labelComponent, description, multiple } = this.props; | ||||
|  |  | |||
|  | @ -82,39 +82,39 @@ class ActionBar extends React.PureComponent { | |||
| 
 | ||||
|   handleReplyClick = () => { | ||||
|     this.props.onReply(this.props.status); | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   handleReblogClick = (e) => { | ||||
|     this.props.onReblog(this.props.status, e); | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   handleFavouriteClick = () => { | ||||
|     this.props.onFavourite(this.props.status); | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   handleBookmarkClick = (e) => { | ||||
|     this.props.onBookmark(this.props.status, e); | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   handleDeleteClick = () => { | ||||
|     this.props.onDelete(this.props.status, this.context.router.history); | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   handleRedraftClick = () => { | ||||
|     this.props.onDelete(this.props.status, this.context.router.history, true); | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   handleEditClick = () => { | ||||
|     this.props.onEdit(this.props.status, this.context.router.history); | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   handleDirectClick = () => { | ||||
|     this.props.onDirect(this.props.status.get('account'), this.context.router.history); | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   handleMentionClick = () => { | ||||
|     this.props.onMention(this.props.status.get('account'), this.context.router.history); | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   handleMuteClick = () => { | ||||
|     const { status, relationship, onMute, onUnmute } = this.props; | ||||
|  | @ -125,7 +125,7 @@ class ActionBar extends React.PureComponent { | |||
|     } else { | ||||
|       onMute(account); | ||||
|     } | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   handleBlockClick = () => { | ||||
|     const { status, relationship, onBlock, onUnblock } = this.props; | ||||
|  | @ -136,49 +136,49 @@ class ActionBar extends React.PureComponent { | |||
|     } else { | ||||
|       onBlock(status); | ||||
|     } | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   handleBlockDomain = () => { | ||||
|     const { status, onBlockDomain } = this.props; | ||||
|     const account = status.get('account'); | ||||
| 
 | ||||
|     onBlockDomain(account.get('acct').split('@')[1]); | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   handleUnblockDomain = () => { | ||||
|     const { status, onUnblockDomain } = this.props; | ||||
|     const account = status.get('account'); | ||||
| 
 | ||||
|     onUnblockDomain(account.get('acct').split('@')[1]); | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   handleConversationMuteClick = () => { | ||||
|     this.props.onMuteConversation(this.props.status); | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   handleReport = () => { | ||||
|     this.props.onReport(this.props.status); | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   handlePinClick = () => { | ||||
|     this.props.onPin(this.props.status); | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   handleShare = () => { | ||||
|     navigator.share({ | ||||
|       text: this.props.status.get('search_index'), | ||||
|       url: this.props.status.get('url'), | ||||
|     }); | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   handleEmbed = () => { | ||||
|     this.props.onEmbed(this.props.status); | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   handleCopy = () => { | ||||
|     const url = this.props.status.get('url'); | ||||
|     navigator.clipboard.writeText(url); | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   render () { | ||||
|     const { status, relationship, intl } = this.props; | ||||
|  |  | |||
|  | @ -146,7 +146,7 @@ export default class Card extends React.PureComponent { | |||
|     } else { | ||||
|       this.setState({ embedded: true }); | ||||
|     } | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   setRef = c => { | ||||
|     this.node = c; | ||||
|  | @ -154,17 +154,17 @@ export default class Card extends React.PureComponent { | |||
|     if (this.node) { | ||||
|       this._setDimensions(); | ||||
|     } | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   handleImageLoad = () => { | ||||
|     this.setState({ previewLoaded: true }); | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   handleReveal = e => { | ||||
|     e.preventDefault(); | ||||
|     e.stopPropagation(); | ||||
|     this.setState({ revealed: true }); | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   renderVideo () { | ||||
|     const { card }  = this.props; | ||||
|  |  | |||
|  | @ -61,15 +61,15 @@ class DetailedStatus extends ImmutablePureComponent { | |||
|     } | ||||
| 
 | ||||
|     e.stopPropagation(); | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   handleOpenVideo = (options) => { | ||||
|     this.props.onOpenVideo(this.props.status.getIn(['media_attachments', 0]), options); | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   handleExpandedToggle = () => { | ||||
|     this.props.onToggleHidden(this.props.status); | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   _measureHeight (heightJustChanged) { | ||||
|     if (this.props.measureHeight && this.node) { | ||||
|  | @ -84,7 +84,7 @@ class DetailedStatus extends ImmutablePureComponent { | |||
|   setRef = c => { | ||||
|     this.node = c; | ||||
|     this._measureHeight(); | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   componentDidUpdate (prevProps, prevState) { | ||||
|     this._measureHeight(prevState.height !== this.state.height); | ||||
|  | @ -102,12 +102,12 @@ class DetailedStatus extends ImmutablePureComponent { | |||
|     } | ||||
| 
 | ||||
|     window.open(href, 'mastodon-intent', 'width=445,height=600,resizable=no,menubar=no,status=no,scrollbars=yes'); | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   handleTranslate = () => { | ||||
|     const { onTranslate, status } = this.props; | ||||
|     onTranslate(status); | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   render () { | ||||
|     const status = (this.props.status && this.props.status.get('reblog')) ? this.props.status.get('reblog') : this.props.status; | ||||
|  |  | |||
|  | @ -233,7 +233,7 @@ class Status extends ImmutablePureComponent { | |||
| 
 | ||||
|   handleToggleMediaVisibility = () => { | ||||
|     this.setState({ showMedia: !this.state.showMedia }); | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   handleFavouriteClick = (status) => { | ||||
|     const { dispatch } = this.props; | ||||
|  | @ -252,7 +252,7 @@ class Status extends ImmutablePureComponent { | |||
|         url: status.get('url'), | ||||
|       })); | ||||
|     } | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   handlePin = (status) => { | ||||
|     if (status.get('pinned')) { | ||||
|  | @ -260,7 +260,7 @@ class Status extends ImmutablePureComponent { | |||
|     } else { | ||||
|       this.props.dispatch(pin(status)); | ||||
|     } | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   handleReplyClick = (status) => { | ||||
|     const { askReplyConfirmation, dispatch, intl } = this.props; | ||||
|  | @ -283,11 +283,11 @@ class Status extends ImmutablePureComponent { | |||
|         url: status.get('url'), | ||||
|       })); | ||||
|     } | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   handleModalReblog = (status, privacy) => { | ||||
|     this.props.dispatch(reblog(status, privacy)); | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   handleReblogClick = (status, e) => { | ||||
|     const { dispatch } = this.props; | ||||
|  | @ -310,7 +310,7 @@ class Status extends ImmutablePureComponent { | |||
|         url: status.get('url'), | ||||
|       })); | ||||
|     } | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   handleBookmarkClick = (status) => { | ||||
|     if (status.get('bookmarked')) { | ||||
|  | @ -318,7 +318,7 @@ class Status extends ImmutablePureComponent { | |||
|     } else { | ||||
|       this.props.dispatch(bookmark(status)); | ||||
|     } | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   handleDeleteClick = (status, history, withRedraft = false) => { | ||||
|     const { dispatch, intl } = this.props; | ||||
|  | @ -332,27 +332,27 @@ class Status extends ImmutablePureComponent { | |||
|         onConfirm: () => dispatch(deleteStatus(status.get('id'), history, withRedraft)), | ||||
|       })); | ||||
|     } | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   handleEditClick = (status, history) => { | ||||
|     this.props.dispatch(editStatus(status.get('id'), history)); | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   handleDirectClick = (account, router) => { | ||||
|     this.props.dispatch(directCompose(account, router)); | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   handleMentionClick = (account, router) => { | ||||
|     this.props.dispatch(mentionCompose(account, router)); | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   handleOpenMedia = (media, index) => { | ||||
|     this.props.dispatch(openModal('MEDIA', { statusId: this.props.status.get('id'), media, index })); | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   handleOpenVideo = (media, options) => { | ||||
|     this.props.dispatch(openModal('VIDEO', { statusId: this.props.status.get('id'), media, options })); | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   handleHotkeyOpenMedia = e => { | ||||
|     const { status } = this.props; | ||||
|  | @ -366,11 +366,11 @@ class Status extends ImmutablePureComponent { | |||
|         this.handleOpenMedia(status.get('media_attachments'), 0); | ||||
|       } | ||||
|     } | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   handleMuteClick = (account) => { | ||||
|     this.props.dispatch(initMuteModal(account)); | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   handleConversationMuteClick = (status) => { | ||||
|     if (status.get('muted')) { | ||||
|  | @ -378,7 +378,7 @@ class Status extends ImmutablePureComponent { | |||
|     } else { | ||||
|       this.props.dispatch(muteStatus(status.get('id'))); | ||||
|     } | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   handleToggleHidden = (status) => { | ||||
|     if (status.get('hidden')) { | ||||
|  | @ -386,7 +386,7 @@ class Status extends ImmutablePureComponent { | |||
|     } else { | ||||
|       this.props.dispatch(hideStatus(status.get('id'))); | ||||
|     } | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   handleToggleAll = () => { | ||||
|     const { status, ancestorsIds, descendantsIds } = this.props; | ||||
|  | @ -397,7 +397,7 @@ class Status extends ImmutablePureComponent { | |||
|     } else { | ||||
|       this.props.dispatch(hideStatus(statusIds)); | ||||
|     } | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   handleTranslate = status => { | ||||
|     const { dispatch } = this.props; | ||||
|  | @ -407,29 +407,29 @@ class Status extends ImmutablePureComponent { | |||
|     } else { | ||||
|       dispatch(translateStatus(status.get('id'))); | ||||
|     } | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   handleBlockClick = (status) => { | ||||
|     const { dispatch } = this.props; | ||||
|     const account = status.get('account'); | ||||
|     dispatch(initBlockModal(account)); | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   handleReport = (status) => { | ||||
|     this.props.dispatch(initReport(status.get('account'), status)); | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   handleEmbed = (status) => { | ||||
|     this.props.dispatch(openModal('EMBED', { url: status.get('url') })); | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   handleUnmuteClick = account => { | ||||
|     this.props.dispatch(unmuteAccount(account.get('id'))); | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   handleUnblockClick = account => { | ||||
|     this.props.dispatch(unblockAccount(account.get('id'))); | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   handleBlockDomainClick = domain => { | ||||
|     this.props.dispatch(openModal('CONFIRM', { | ||||
|  | @ -437,50 +437,50 @@ class Status extends ImmutablePureComponent { | |||
|       confirm: this.props.intl.formatMessage(messages.blockDomainConfirm), | ||||
|       onConfirm: () => this.props.dispatch(blockDomain(domain)), | ||||
|     })); | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   handleUnblockDomainClick = domain => { | ||||
|     this.props.dispatch(unblockDomain(domain)); | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
| 
 | ||||
|   handleHotkeyMoveUp = () => { | ||||
|     this.handleMoveUp(this.props.status.get('id')); | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   handleHotkeyMoveDown = () => { | ||||
|     this.handleMoveDown(this.props.status.get('id')); | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   handleHotkeyReply = e => { | ||||
|     e.preventDefault(); | ||||
|     this.handleReplyClick(this.props.status); | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   handleHotkeyFavourite = () => { | ||||
|     this.handleFavouriteClick(this.props.status); | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   handleHotkeyBoost = () => { | ||||
|     this.handleReblogClick(this.props.status); | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   handleHotkeyMention = e => { | ||||
|     e.preventDefault(); | ||||
|     this.handleMentionClick(this.props.status.get('account')); | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   handleHotkeyOpenProfile = () => { | ||||
|     this.context.router.history.push(`/@${this.props.status.getIn(['account', 'acct'])}`); | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   handleHotkeyToggleHidden = () => { | ||||
|     this.handleToggleHidden(this.props.status); | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   handleHotkeyToggleSensitive = () => { | ||||
|     this.handleToggleMediaVisibility(); | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   handleMoveUp = id => { | ||||
|     const { status, ancestorsIds, descendantsIds } = this.props; | ||||
|  | @ -497,7 +497,7 @@ class Status extends ImmutablePureComponent { | |||
|         this._selectChild(index - 1, true); | ||||
|       } | ||||
|     } | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   handleMoveDown = id => { | ||||
|     const { status, ancestorsIds, descendantsIds } = this.props; | ||||
|  | @ -514,7 +514,7 @@ class Status extends ImmutablePureComponent { | |||
|         this._selectChild(index + 1, false); | ||||
|       } | ||||
|     } | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   _selectChild (index, align_top) { | ||||
|     const container = this.node; | ||||
|  | @ -544,7 +544,7 @@ class Status extends ImmutablePureComponent { | |||
| 
 | ||||
|   setRef = c => { | ||||
|     this.node = c; | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   componentDidUpdate () { | ||||
|     if (this._scrolledIntoView) { | ||||
|  | @ -569,7 +569,7 @@ class Status extends ImmutablePureComponent { | |||
| 
 | ||||
|   onFullScreenChange = () => { | ||||
|     this.setState({ fullscreen: isFullscreen() }); | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   render () { | ||||
|     let ancestors, descendants; | ||||
|  |  | |||
|  | @ -72,7 +72,7 @@ class SubscribedLanguagesModal extends ImmutablePureComponent { | |||
|   handleSubmit = () => { | ||||
|     this.props.onSubmit(this.state.selectedLanguages.toArray()); | ||||
|     this.props.onClose(); | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   renderItem (value) { | ||||
|     const language = this.props.languages.find(language => language[0] === value); | ||||
|  |  | |||
|  | @ -31,7 +31,7 @@ export default class ActionsModal extends ImmutablePureComponent { | |||
|         </a> | ||||
|       </li> | ||||
|     ); | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   render () { | ||||
|     return ( | ||||
|  |  | |||
|  | @ -55,20 +55,20 @@ class BlockModal extends React.PureComponent { | |||
|   handleClick = () => { | ||||
|     this.props.onClose(); | ||||
|     this.props.onConfirm(this.props.account); | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   handleSecondary = () => { | ||||
|     this.props.onClose(); | ||||
|     this.props.onBlockAndReport(this.props.account); | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   handleCancel = () => { | ||||
|     this.props.onClose(); | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   setRef = (c) => { | ||||
|     this.button = c; | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   render () { | ||||
|     const { account } = this.props; | ||||
|  |  | |||
|  | @ -62,7 +62,7 @@ class BoostModal extends ImmutablePureComponent { | |||
|   handleReblog = () => { | ||||
|     this.props.onReblog(this.props.status, this.props.privacy); | ||||
|     this.props.onClose(); | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   handleAccountClick = (e) => { | ||||
|     if (e.button === 0 && !(e.ctrlKey || e.metaKey)) { | ||||
|  | @ -70,7 +70,7 @@ class BoostModal extends ImmutablePureComponent { | |||
|       this.props.onClose(); | ||||
|       this.context.router.history.push(`/@${this.props.status.getIn(['account', 'acct'])}`); | ||||
|     } | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   _findContainer = () => { | ||||
|     return document.getElementsByClassName('modal-root__container')[0]; | ||||
|  | @ -78,7 +78,7 @@ class BoostModal extends ImmutablePureComponent { | |||
| 
 | ||||
|   setRef = (c) => { | ||||
|     this.button = c; | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   render () { | ||||
|     const { status, privacy, intl } = this.props; | ||||
|  |  | |||
|  | @ -15,7 +15,7 @@ class Bundle extends React.PureComponent { | |||
|     onFetch: PropTypes.func, | ||||
|     onFetchSuccess: PropTypes.func, | ||||
|     onFetchFail: PropTypes.func, | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   static defaultProps = { | ||||
|     loading: emptyComponent, | ||||
|  | @ -24,14 +24,14 @@ class Bundle extends React.PureComponent { | |||
|     onFetch: noop, | ||||
|     onFetchSuccess: noop, | ||||
|     onFetchFail: noop, | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   static cache = new Map | ||||
|   static cache = new Map; | ||||
| 
 | ||||
|   state = { | ||||
|     mod: undefined, | ||||
|     forceRender: false, | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   componentWillMount() { | ||||
|     this.load(this.props); | ||||
|  | @ -83,7 +83,7 @@ class Bundle extends React.PureComponent { | |||
|         this.setState({ mod: null }); | ||||
|         onFetchFail(error); | ||||
|       }); | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   render() { | ||||
|     const { loading: Loading, error: Error, children, renderDelay } = this.props; | ||||
|  |  | |||
|  | @ -31,7 +31,7 @@ class GIF extends React.PureComponent { | |||
|     if (!animate) { | ||||
|       this.setState({ hovering: true }); | ||||
|     } | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   handleMouseLeave = () => { | ||||
|     const { animate } = this.props; | ||||
|  | @ -39,7 +39,7 @@ class GIF extends React.PureComponent { | |||
|     if (!animate) { | ||||
|       this.setState({ hovering: false }); | ||||
|     } | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   render () { | ||||
|     const { src, staticSrc, className, animate } = this.props; | ||||
|  | @ -75,7 +75,7 @@ class CopyButton extends React.PureComponent { | |||
|     navigator.clipboard.writeText(value); | ||||
|     this.setState({ copied: true }); | ||||
|     this.timeout = setTimeout(() => this.setState({ copied: false }), 700); | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   componentWillUnmount () { | ||||
|     if (this.timeout) clearTimeout(this.timeout); | ||||
|  | @ -113,7 +113,7 @@ class BundleColumnError extends React.PureComponent { | |||
|     if (onRetry) { | ||||
|       onRetry(); | ||||
|     } | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   render () { | ||||
|     const { errorType, multiColumn, stacktrace } = this.props; | ||||
|  |  | |||
|  | @ -16,11 +16,11 @@ class BundleModalError extends React.PureComponent { | |||
|     onRetry: PropTypes.func.isRequired, | ||||
|     onClose: PropTypes.func.isRequired, | ||||
|     intl: PropTypes.object.isRequired, | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   handleRetry = () => { | ||||
|     this.props.onRetry(); | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   render () { | ||||
|     const { onClose, intl: { formatMessage } } = this.props; | ||||
|  |  | |||
|  | @ -23,7 +23,7 @@ export default class Column extends React.PureComponent { | |||
|     } | ||||
| 
 | ||||
|     this._interruptScrollAnimation = scrollTop(scrollable); | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   scrollTop () { | ||||
|     const scrollable = this.node.querySelector('.scrollable'); | ||||
|  | @ -40,11 +40,11 @@ export default class Column extends React.PureComponent { | |||
|     if (typeof this._interruptScrollAnimation !== 'undefined') { | ||||
|       this._interruptScrollAnimation(); | ||||
|     } | ||||
|   }, 200) | ||||
|   }, 200); | ||||
| 
 | ||||
|   setRef = (c) => { | ||||
|     this.node = c; | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   render () { | ||||
|     const { heading, icon, children, active, hideHeadingOnMobile } = this.props; | ||||
|  |  | |||
|  | @ -15,7 +15,7 @@ export default class ColumnHeader extends React.PureComponent { | |||
| 
 | ||||
|   handleClick = () => { | ||||
|     this.props.onClick(); | ||||
|   } | ||||
|   }; | ||||
| 
 | ||||
|   render () { | ||||
|     const { icon, type, active, columnHeaderId } = this.props; | ||||
|  |  | |||
Some files were not shown because too many files have changed in this diff Show more
		Reference in a new issue