diff --git a/lib/views/git-cache-view.js b/lib/views/git-cache-view.js
index e99925c857..f1062c3a6d 100644
--- a/lib/views/git-cache-view.js
+++ b/lib/views/git-cache-view.js
@@ -3,7 +3,6 @@ import PropTypes from 'prop-types';
import {inspect} from 'util';
import ObserveModel from './observe-model';
-import {autobind} from '../helpers';
const sortOrders = {
'by key': (a, b) => a.key.localeCompare(b.key),
@@ -26,7 +25,6 @@ export default class GitCacheView extends React.Component {
constructor(props, context) {
super(props, context);
- autobind(this, 'fetchRepositoryData', 'fetchCacheData', 'renderCache', 'didSelectItem', 'clearCache');
this.state = {
order: 'by key',
@@ -45,11 +43,11 @@ export default class GitCacheView extends React.Component {
return null;
}
- fetchRepositoryData(repository) {
+ fetchRepositoryData = repository => {
return repository.getCache();
}
- fetchCacheData(cache) {
+ fetchCacheData = cache => {
const cached = {};
const promises = [];
const now = performance.now();
@@ -85,7 +83,7 @@ export default class GitCacheView extends React.Component {
);
}
- renderCache(contents) {
+ renderCache = contents => {
const rows = Object.keys(contents || {}).map(key => {
return {
key,
@@ -188,7 +186,7 @@ export default class GitCacheView extends React.Component {
return parts.slice(parts.length - 2).join(' ');
}
- didSelectItem(event) {
+ didSelectItem = event => {
this.setState({order: event.target.value});
}
@@ -201,7 +199,7 @@ export default class GitCacheView extends React.Component {
cache.removePrimary(key);
}
- clearCache() {
+ clearCache = () => {
const cache = this.props.repository.getCache();
if (!cache) {
return;
diff --git a/lib/views/git-tab-view.js b/lib/views/git-tab-view.js
index 4ec74fde66..24981575c0 100644
--- a/lib/views/git-tab-view.js
+++ b/lib/views/git-tab-view.js
@@ -8,7 +8,7 @@ import GitLogo from './git-logo';
import CommitController from '../controllers/commit-controller';
import RecentCommitsController from '../controllers/recent-commits-controller';
import RefHolder from '../models/ref-holder';
-import {isValidWorkdir, autobind} from '../helpers';
+import {isValidWorkdir} from '../helpers';
import {AuthorPropType, UserStorePropType, RefHolderPropType} from '../prop-types';
export default class GitTabView extends React.Component {
@@ -65,7 +65,6 @@ export default class GitTabView extends React.Component {
constructor(props, context) {
super(props, context);
- autobind(this, 'initializeRepo', 'blur', 'advanceFocus', 'retreatFocus', 'quietlySelectItem');
this.subscriptions = new CompositeDisposable();
@@ -211,7 +210,7 @@ export default class GitTabView extends React.Component {
this.subscriptions.dispose();
}
- initializeRepo(event) {
+ initializeRepo = event => {
event.preventDefault();
let initPath = null;
const activeEditor = this.props.workspace.getActiveTextEditor();
@@ -243,11 +242,9 @@ export default class GitTabView extends React.Component {
return false;
}
- blur() {
- this.props.workspace.getCenter().activate();
- }
+ blur = () => this.props.workspace.getCenter().activate()
- async advanceFocus(evt) {
+ advanceFocus = async evt => {
const currentFocus = this.getFocus(document.activeElement);
let nextSeen = false;
@@ -263,7 +260,7 @@ export default class GitTabView extends React.Component {
}
}
- async retreatFocus(evt) {
+ retreatFocus = async evt => {
const currentFocus = this.getFocus(document.activeElement);
let previousSeen = false;
@@ -292,7 +289,7 @@ export default class GitTabView extends React.Component {
this.setFocus(GitTabView.focus.COMMIT_PREVIEW_BUTTON);
}
- quietlySelectItem(filePath, stagingStatus) {
+ quietlySelectItem = (filePath, stagingStatus) => {
return this.props.refStagingView.map(view => view.quietlySelectItem(filePath, stagingStatus)).getOr(false);
}
diff --git a/lib/views/git-timings-view.js b/lib/views/git-timings-view.js
index 6f1b6b88ce..bac6359a00 100644
--- a/lib/views/git-timings-view.js
+++ b/lib/views/git-timings-view.js
@@ -9,7 +9,6 @@ import memoize from 'lodash.memoize';
import fs from 'fs-extra';
import Octicon from '../atom/octicon';
-import {autobind} from '../helpers';
const genArray = memoize(function genArray(interval, count) {
const arr = [];
@@ -104,11 +103,6 @@ class MarkerSpan extends React.Component {
marker: PropTypes.instanceOf(Marker).isRequired,
}
- constructor(props) {
- super(props);
- autobind(this, 'handleMouseOver', 'handleMouseOut');
- }
-
render() {
const {marker, ...others} = this.props;
const timings = marker.getTimings();
@@ -134,7 +128,7 @@ class MarkerSpan extends React.Component {
);
}
- handleMouseOver(e) {
+ handleMouseOver = e => {
const elem = document.createElement('div');
ReactDom.render( , elem);
this.tooltipDisposable = atom.tooltips.add(this.element, {
@@ -149,7 +143,7 @@ class MarkerSpan extends React.Component {
this.tooltipDisposable = null;
}
- handleMouseOut(e) {
+ handleMouseOut = e => {
this.closeTooltip();
}
@@ -167,7 +161,6 @@ class Waterfall extends React.Component {
constructor(props, context) {
super(props, context);
- autobind(this, 'renderMarker');
this.state = this.getNextState(props);
}
@@ -239,7 +232,7 @@ class Waterfall extends React.Component {
);
}
- renderMarker(marker, i) {
+ renderMarker = (marker, i) => {
if (marker.getStart() === null || marker.getEnd() === null) { return ; }
const startOffset = marker.getStart() - this.state.startTime;
@@ -268,7 +261,6 @@ class WaterfallWidget extends React.Component {
constructor(props, context) {
super(props, context);
- autobind(this, 'handleZoomFactorChange', 'handleCollapseClick', 'handleExportClick');
this.state = {
zoomFactor: 0.3,
collapsed: false,
@@ -314,15 +306,11 @@ class WaterfallWidget extends React.Component {
);
}
- handleZoomFactorChange(e) {
- this.setState({zoomFactor: parseFloat(e.target.value)});
- }
+ handleZoomFactorChange = e => this.setState({zoomFactor: parseFloat(e.target.value)})
- handleCollapseClick(e) {
- this.setState(s => ({collapsed: !s.collapsed}));
- }
+ handleCollapseClick = () => this.setState(s => ({collapsed: !s.collapsed}))
- handleExportClick(e) {
+ handleExportClick = e => {
e.preventDefault();
const json = JSON.stringify(this.props.markers.map(m => m.serialize()), null, ' ');
const buffer = new TextBuffer({text: json});
@@ -391,11 +379,6 @@ export default class GitTimingsView extends React.Component {
return GitTimingsView.emitter.on('did-update', callback);
}
- constructor(props) {
- super(props);
- autobind(this, 'handleImportClick');
- }
-
componentDidMount() {
this.subscriptions = new CompositeDisposable(
GitTimingsView.onDidUpdate(() => this.forceUpdate()),
@@ -419,7 +402,7 @@ export default class GitTimingsView extends React.Component {
);
}
- handleImportClick(e) {
+ handleImportClick = e => {
e.preventDefault();
dialog.showOpenDialog({
properties: ['openFile'],
diff --git a/lib/views/github-dotcom-markdown.js b/lib/views/github-dotcom-markdown.js
index 5af7dfb7bd..4a5b1bb14a 100644
--- a/lib/views/github-dotcom-markdown.js
+++ b/lib/views/github-dotcom-markdown.js
@@ -8,7 +8,6 @@ import {handleClickEvent, openIssueishLinkInNewTab, openLinkInBrowser, getDataFr
import UserMentionTooltipItem from '../items/user-mention-tooltip-item';
import IssueishTooltipItem from '../items/issueish-tooltip-item';
import RelayEnvironment from './relay-environment';
-import {autobind} from '../helpers';
export class BareGithubDotcomMarkdown extends React.Component {
static propTypes = {
@@ -26,11 +25,6 @@ export class BareGithubDotcomMarkdown extends React.Component {
openLinkInBrowser,
}
- constructor(props) {
- super(props);
- autobind(this, 'handleClick', 'openLinkInNewTab', 'openLinkInThisTab', 'openLinkInBrowser');
- }
-
componentDidMount() {
this.commandSubscriptions = atom.commands.add(ReactDom.findDOMNode(this), {
'github:open-link-in-new-tab': this.openLinkInNewTab,
@@ -96,7 +90,7 @@ export class BareGithubDotcomMarkdown extends React.Component {
);
}
- handleClick(event) {
+ handleClick = event => {
if (event.target.dataset.url) {
return this.props.handleClickEvent(event, event.target.dataset.url);
} else {
@@ -104,18 +98,14 @@ export class BareGithubDotcomMarkdown extends React.Component {
}
}
- openLinkInNewTab(event) {
- return this.props.openIssueishLinkInNewTab(event.target.dataset.url);
- }
+ openLinkInNewTab = event => this.props.openIssueishLinkInNewTab(event.target.dataset.url)
- openLinkInThisTab(event) {
+ openLinkInThisTab = event => {
const {repoOwner, repoName, issueishNumber} = getDataFromGithubUrl(event.target.dataset.url);
this.props.switchToIssueish(repoOwner, repoName, issueishNumber);
}
- openLinkInBrowser(event) {
- return this.props.openLinkInBrowser(event.target.getAttribute('href'));
- }
+ openLinkInBrowser = event => this.props.openLinkInBrowser(event.target.getAttribute('href'))
}
export default class GithubDotcomMarkdown extends React.Component {
diff --git a/lib/views/github-login-view.js b/lib/views/github-login-view.js
index e959d06576..0017cead30 100644
--- a/lib/views/github-login-view.js
+++ b/lib/views/github-login-view.js
@@ -1,8 +1,6 @@
import React from 'react';
import PropTypes from 'prop-types';
-import {autobind} from '../helpers';
-
export default class GithubLoginView extends React.Component {
static propTypes = {
children: PropTypes.node,
@@ -11,15 +9,11 @@ export default class GithubLoginView extends React.Component {
static defaultProps = {
children: Log in to GitHub to access PR information and more!
,
- onLogin: token => {},
+ onLogin: () => {},
}
constructor(props, context) {
super(props, context);
- autobind(
- this,
- 'handleLoginClick', 'handleCancelTokenClick', 'handleSubmitTokenClick', 'handleSubmitToken', 'handleTokenChange',
- );
this.state = {
loggingIn: false,
token: '',
@@ -83,25 +77,19 @@ export default class GithubLoginView extends React.Component {
);
}
- handleLoginClick() {
- this.setState({loggingIn: true});
- }
+ handleLoginClick = () => new Promise(resolve => this.setState({loggingIn: true}, resolve))
- handleCancelTokenClick(e) {
+ handleCancelTokenClick = e => {
e.preventDefault();
- this.setState({loggingIn: false});
+ return new Promise(resolve => this.setState({loggingIn: false}, resolve));
}
- handleSubmitTokenClick(e) {
+ handleSubmitTokenClick = e => {
e.preventDefault();
this.handleSubmitToken();
}
- handleSubmitToken() {
- this.props.onLogin(this.state.token);
- }
+ handleSubmitToken = () => this.props.onLogin(this.state.token)
- handleTokenChange(e) {
- this.setState({token: e.target.value});
- }
+ handleTokenChange = e => new Promise(resolve => this.setState({token: e.target.value}, resolve))
}
diff --git a/lib/views/github-tile-view.js b/lib/views/github-tile-view.js
index 64a5185105..0c6c29ee6d 100644
--- a/lib/views/github-tile-view.js
+++ b/lib/views/github-tile-view.js
@@ -3,19 +3,13 @@ import PropTypes from 'prop-types';
import Octicon from '../atom/octicon';
import {addEvent} from '../reporter-proxy';
-import {autobind} from '../helpers';
export default class GithubTileView extends React.Component {
static propTypes = {
didClick: PropTypes.func.isRequired,
}
- constructor(props) {
- super(props);
- autobind(this, 'handleClick');
- }
-
- handleClick() {
+ handleClick = () => {
addEvent('click', {package: 'github', component: 'GithubTileView'});
this.props.didClick();
}
diff --git a/lib/views/hunk-header-view.js b/lib/views/hunk-header-view.js
index a2ed357015..72307bbb3b 100644
--- a/lib/views/hunk-header-view.js
+++ b/lib/views/hunk-header-view.js
@@ -2,7 +2,6 @@ import React, {Fragment} from 'react';
import PropTypes from 'prop-types';
import cx from 'classnames';
-import {autobind} from '../helpers';
import {RefHolderPropType} from '../prop-types';
import RefHolder from '../models/ref-holder';
import Tooltip from '../atom/tooltip';
@@ -36,7 +35,6 @@ export default class HunkHeaderView extends React.Component {
constructor(props) {
super(props);
- autobind(this, 'didMouseDown', 'renderButtons');
this.refDiscardButton = new RefHolder();
}
@@ -57,7 +55,7 @@ export default class HunkHeaderView extends React.Component {
);
}
- renderButtons() {
+ renderButtons = () => {
if (this.props.itemType === CommitDetailItem) {
return null;
} else {
@@ -90,7 +88,7 @@ export default class HunkHeaderView extends React.Component {
}
}
- didMouseDown(event) {
+ didMouseDown = event => {
return this.props.mouseDown(event, this.props.hunk);
}
}
diff --git a/lib/views/init-dialog.js b/lib/views/init-dialog.js
index 43985985e8..b80ae4a23b 100644
--- a/lib/views/init-dialog.js
+++ b/lib/views/init-dialog.js
@@ -3,7 +3,6 @@ import PropTypes from 'prop-types';
import {CompositeDisposable} from 'event-kit';
import Commands, {Command} from '../atom/commands';
-import {autobind} from '../helpers';
export default class InitDialog extends React.Component {
static propTypes = {
@@ -21,7 +20,6 @@ export default class InitDialog extends React.Component {
constructor(props, context) {
super(props, context);
- autobind(this, 'init', 'cancel', 'editorRef', 'setInitEnablement');
this.state = {
initDisabled: false,
@@ -70,7 +68,7 @@ export default class InitDialog extends React.Component {
);
}
- init() {
+ init = () => {
if (this.getProjectPath().length === 0) {
return;
}
@@ -78,11 +76,9 @@ export default class InitDialog extends React.Component {
this.props.didAccept(this.getProjectPath());
}
- cancel() {
- this.props.didCancel();
- }
+ cancel = () => this.props.didCancel()
- editorRef() {
+ editorRef = () => {
return element => {
if (!element) {
return;
@@ -112,7 +108,5 @@ export default class InitDialog extends React.Component {
return this.remoteUrlEditor ? this.remoteUrlEditor.getText() : '';
}
- setInitEnablement() {
- this.setState({initDisabled: this.getProjectPath().length === 0});
- }
+ setInitEnablement = () => this.setState({initDisabled: this.getProjectPath().length === 0})
}
diff --git a/lib/views/issueish-list-view.js b/lib/views/issueish-list-view.js
index 8b9ba5e917..c26f9d2a4f 100644
--- a/lib/views/issueish-list-view.js
+++ b/lib/views/issueish-list-view.js
@@ -1,7 +1,6 @@
import React, {Fragment} from 'react';
import PropTypes from 'prop-types';
-import {autobind} from '../helpers';
import {IssueishPropType} from '../prop-types';
import Accordion from './accordion';
import Timeago from './timeago';
@@ -30,12 +29,6 @@ export default class IssueishListView extends React.Component {
error: PropTypes.object,
}
- constructor(props) {
- super(props);
-
- autobind(this, 'renderIssueish', 'renderLoadingTile', 'renderEmptyTile', 'renderMoreTile');
- }
-
render() {
return (
{
return (
;
}
- renderLoadingTile() {
+ renderLoadingTile = () => {
return (
Loading
@@ -101,7 +94,7 @@ export default class IssueishListView extends React.Component {
);
}
- renderEmptyTile() {
+ renderEmptyTile = () => {
if (this.props.error) {
return ;
}
@@ -114,7 +107,7 @@ export default class IssueishListView extends React.Component {
return null;
}
- renderMoreTile() {
+ renderMoreTile = () => {
/* eslint-disable jsx-a11y/anchor-is-valid */
if (this.props.onMoreClick) {
return (
diff --git a/lib/views/issueish-timeline-view.js b/lib/views/issueish-timeline-view.js
index 6523173807..cbef881a6f 100644
--- a/lib/views/issueish-timeline-view.js
+++ b/lib/views/issueish-timeline-view.js
@@ -2,7 +2,6 @@ import React from 'react';
import PropTypes from 'prop-types';
import {RelayConnectionPropType} from '../prop-types';
-import {autobind} from '../helpers';
import Octicon from '../atom/octicon';
import CommitsView from './timeline-items/commits-view.js';
import IssueCommentView from './timeline-items/issue-comment-view.js';
@@ -26,16 +25,11 @@ export function collectionRenderer(Component, styleAsTimelineItem = true) {
return Component.getFragment(frag, ...args);
}
- constructor(props) {
- super(props);
- autobind(this, 'renderNode');
- }
-
render() {
return {this.props.nodes.map(this.renderNode)};
}
- renderNode(node, i) {
+ renderNode = (node, i) => {
return (
{
this.props.relay.loadMore(10, () => {
this.forceUpdate();
});
diff --git a/lib/views/multi-file-patch-view.js b/lib/views/multi-file-patch-view.js
index 5d1407e496..be2c0e5aa5 100644
--- a/lib/views/multi-file-patch-view.js
+++ b/lib/views/multi-file-patch-view.js
@@ -4,7 +4,6 @@ import cx from 'classnames';
import {Range} from 'atom';
import {CompositeDisposable} from 'event-kit';
-import {autobind} from '../helpers';
import {RefHolderPropType, MultiFilePatchPropType} from '../prop-types';
import AtomTextEditor from '../atom/atom-text-editor';
import Marker from '../atom/marker';
@@ -64,13 +63,6 @@ export default class MultiFilePatchView extends React.Component {
constructor(props) {
super(props);
- autobind(
- this,
- 'didMouseDownOnHeader', 'didMouseDownOnLineNumber', 'didMouseMoveOnLineNumber', 'didMouseUp',
- 'didConfirm', 'didToggleSelectionMode', 'selectNextHunk', 'selectPreviousHunk',
- 'didOpenFile', 'didAddSelection', 'didChangeSelectionRange', 'didDestroySelection',
- 'oldLineNumberLabel', 'newLineNumberLabel',
- );
this.mouseSelectionInProgress = false;
this.lastMouseMoveLine = null;
@@ -108,7 +100,7 @@ export default class MultiFilePatchView extends React.Component {
});
this.subs.add(
- this.props.config.onDidChange('github.showDiffIconGutter', ({newValue}) => this.forceUpdate()),
+ this.props.config.onDidChange('github.showDiffIconGutter', () => this.forceUpdate()),
);
}
@@ -129,7 +121,7 @@ export default class MultiFilePatchView extends React.Component {
return newSelectionRange;
}
- componentDidUpdate(prevProps, prevState, newSelectionRange) {
+ componentDidUpdate(prevProps, _prevState, newSelectionRange) {
if (prevProps.refInitialFocus !== this.props.refInitialFocus) {
prevProps.refInitialFocus && prevProps.refInitialFocus.setter(null);
this.props.refInitialFocus && this.refEditorElement.map(this.props.refInitialFocus.setter);
@@ -650,12 +642,12 @@ export default class MultiFilePatchView extends React.Component {
}
}
- didMouseDownOnHeader(event, hunk) {
+ didMouseDownOnHeader = (event, hunk) => {
this.nextSelectionMode = 'hunk';
this.handleSelectionEvent(event, hunk.getRange());
}
- didMouseDownOnLineNumber(event) {
+ didMouseDownOnLineNumber = event => {
const line = event.bufferRow;
if (line === undefined || isNaN(line)) {
return;
@@ -667,7 +659,7 @@ export default class MultiFilePatchView extends React.Component {
}
}
- didMouseMoveOnLineNumber(event) {
+ didMouseMoveOnLineNumber = event => {
if (!this.mouseSelectionInProgress) {
return;
}
@@ -682,7 +674,7 @@ export default class MultiFilePatchView extends React.Component {
this.handleSelectionEvent(event.domEvent, [[line, 0], [line, Infinity]], {add: true});
}
- didMouseUp() {
+ didMouseUp = () => {
this.mouseSelectionInProgress = false;
}
@@ -790,11 +782,11 @@ export default class MultiFilePatchView extends React.Component {
return true;
}
- didConfirm() {
+ didConfirm = () => {
return this.props.toggleRows(this.props.selectedRows, this.props.selectionMode);
}
- didToggleSelectionMode() {
+ didToggleSelectionMode = () => {
const selectedHunks = this.getSelectedHunks();
this.withSelectionMode({
line: () => {
@@ -836,7 +828,7 @@ export default class MultiFilePatchView extends React.Component {
);
}
- selectNextHunk() {
+ selectNextHunk = () => {
this.refEditor.map(editor => {
const nextHunks = new Set(
this.withSelectedHunks(hunk => this.getHunkAfter(hunk) || hunk),
@@ -848,7 +840,7 @@ export default class MultiFilePatchView extends React.Component {
});
}
- selectPreviousHunk() {
+ selectPreviousHunk = () => {
this.refEditor.map(editor => {
const nextHunks = new Set(
this.withSelectedHunks(hunk => this.getHunkBefore(hunk) || hunk),
@@ -860,7 +852,7 @@ export default class MultiFilePatchView extends React.Component {
});
}
- didOpenFile({selectedFilePatch} = {}) {
+ didOpenFile = ({selectedFilePatch} = {}) => {
const cursorsByFilePatch = new Map();
this.refEditor.map(editor => {
@@ -949,11 +941,9 @@ export default class MultiFilePatchView extends React.Component {
}).getOr(new Set());
}
- didAddSelection() {
- this.didChangeSelectedRows();
- }
+ didAddSelection = () => this.didChangeSelectedRows()
- didChangeSelectionRange(event) {
+ didChangeSelectionRange = event => {
if (
!event ||
event.oldBufferRange.start.row !== event.newBufferRange.start.row ||
@@ -963,9 +953,7 @@ export default class MultiFilePatchView extends React.Component {
}
}
- didDestroySelection() {
- this.didChangeSelectedRows();
- }
+ didDestroySelection = () => this.didChangeSelectedRows()
didChangeSelectedRows() {
if (this.suppressChanges) {
@@ -984,7 +972,7 @@ export default class MultiFilePatchView extends React.Component {
);
}
- oldLineNumberLabel({bufferRow, softWrapped}) {
+ oldLineNumberLabel = ({bufferRow, softWrapped}) => {
const hunk = this.props.multiFilePatch.getHunkAt(bufferRow);
if (hunk === undefined) {
return this.pad('');
@@ -998,7 +986,7 @@ export default class MultiFilePatchView extends React.Component {
return this.pad(oldRow);
}
- newLineNumberLabel({bufferRow, softWrapped}) {
+ newLineNumberLabel = ({bufferRow, softWrapped}) => {
const hunk = this.props.multiFilePatch.getHunkAt(bufferRow);
if (hunk === undefined) {
return this.pad('');
diff --git a/lib/views/observe-model.js b/lib/views/observe-model.js
index 5bd8eb5e21..040862e220 100644
--- a/lib/views/observe-model.js
+++ b/lib/views/observe-model.js
@@ -2,7 +2,6 @@ import React from 'react';
import PropTypes from 'prop-types';
import ModelObserver from '../models/model-observer';
-import {autobind} from '../helpers';
export default class ObserveModel extends React.Component {
static propTypes = {
@@ -15,7 +14,6 @@ export default class ObserveModel extends React.Component {
constructor(props, context) {
super(props, context);
- autobind(this, 'fetchData', 'didUpdate');
this.state = {data: null};
this.modelObserver = new ModelObserver({fetchData: this.fetchData, didUpdate: this.didUpdate});
}
@@ -29,11 +27,9 @@ export default class ObserveModel extends React.Component {
this.modelObserver.setActiveModel(nextProps.model);
}
- fetchData(model) {
- return this.props.fetchData(model);
- }
+ fetchData = model => this.props.fetchData(model)
- didUpdate(model) {
+ didUpdate = () => {
if (this.mounted) {
const data = this.modelObserver.getActiveModelData();
this.setState({data});
diff --git a/lib/views/open-issueish-dialog.js b/lib/views/open-issueish-dialog.js
index dbd21ff04d..6098fb3ba1 100644
--- a/lib/views/open-issueish-dialog.js
+++ b/lib/views/open-issueish-dialog.js
@@ -3,7 +3,6 @@ import PropTypes from 'prop-types';
import {CompositeDisposable} from 'event-kit';
import Commands, {Command} from '../atom/commands';
-import {autobind} from '../helpers';
const ISSUEISH_URL_REGEX = /^(?:https?:\/\/)?github.com\/([^/]+)\/([^/]+)\/(?:issues|pull)\/(\d+)/;
@@ -21,7 +20,6 @@ export default class OpenIssueishDialog extends React.Component {
constructor(props, context) {
super(props, context);
- autobind(this, 'accept', 'cancel', 'editorRefs', 'didChangeIssueishUrl');
this.state = {
cloneDisabled: false,
@@ -70,7 +68,7 @@ export default class OpenIssueishDialog extends React.Component {
);
}
- accept() {
+ accept = () => {
if (this.getIssueishUrl().length === 0) {
return;
}
@@ -87,11 +85,11 @@ export default class OpenIssueishDialog extends React.Component {
this.props.didAccept({repoOwner, repoName, issueishNumber});
}
- cancel() {
+ cancel = () => {
this.props.didCancel();
}
- editorRefs(baseName) {
+ editorRefs = baseName => {
const elementName = `${baseName}Element`;
const modelName = `${baseName}Editor`;
const subName = `${baseName}Subs`;
@@ -118,7 +116,7 @@ export default class OpenIssueishDialog extends React.Component {
};
}
- didChangeIssueishUrl() {
+ didChangeIssueishUrl = () => {
this.setState({error: null});
}
diff --git a/lib/views/pr-commit-view.js b/lib/views/pr-commit-view.js
index 3ec3afc578..74b27d4f99 100644
--- a/lib/views/pr-commit-view.js
+++ b/lib/views/pr-commit-view.js
@@ -4,8 +4,6 @@ import {emojify} from 'node-emoji';
import moment from 'moment';
import {graphql, createFragmentContainer} from 'react-relay';
-import {autobind} from '../helpers';
-
const avatarAltText = 'committer avatar';
export class PrCommitView extends React.Component {
@@ -29,16 +27,11 @@ export class PrCommitView extends React.Component {
constructor(props) {
super(props);
this.state = {showMessageBody: false};
- autobind(this, 'toggleShowCommitMessageBody', 'humanizeTimeSince');
}
- toggleShowCommitMessageBody() {
- this.setState({showMessageBody: !this.state.showMessageBody});
- }
+ toggleShowCommitMessageBody = () => this.setState({showMessageBody: !this.state.showMessageBody})
- humanizeTimeSince(date) {
- return moment(date).fromNow();
- }
+ humanizeTimeSince = date => moment(date).fromNow()
openCommitDetailItem = () => this.props.openCommit({sha: this.props.item.sha})
diff --git a/lib/views/pr-commits-view.js b/lib/views/pr-commits-view.js
index 5398c58ad1..af8036f8cb 100644
--- a/lib/views/pr-commits-view.js
+++ b/lib/views/pr-commits-view.js
@@ -4,8 +4,6 @@ import {graphql, createPaginationContainer} from 'react-relay';
import {RelayConnectionPropType} from '../prop-types';
import PrCommitView from './pr-commit-view';
-import {autobind} from '../helpers';
-
const PAGE_SIZE = 50;
export class PrCommitsView extends React.Component {
@@ -28,12 +26,7 @@ export class PrCommitsView extends React.Component {
openCommit: PropTypes.func.isRequired,
}
- constructor(props) {
- super(props);
- autobind(this, 'loadMore');
- }
-
- loadMore() {
+ loadMore = () => {
this.props.relay.loadMore(PAGE_SIZE, () => {
this.forceUpdate();
});
diff --git a/lib/views/pr-statuses-view.js b/lib/views/pr-statuses-view.js
index 96c68db617..200b758148 100644
--- a/lib/views/pr-statuses-view.js
+++ b/lib/views/pr-statuses-view.js
@@ -2,7 +2,7 @@ import React from 'react';
import {createRefetchContainer, graphql} from 'react-relay';
import PropTypes from 'prop-types';
-import {toSentence, autobind} from '../helpers';
+import {toSentence} from '../helpers';
import PrStatusContextView from './pr-status-context-view';
import Octicon from '../atom/octicon';
import StatusDonutChart from './status-donut-chart';
@@ -61,11 +61,6 @@ export class BarePrStatusesView extends React.Component {
static PENDING_REFRESH_TIMEOUT = 30 * 1000
static MINIMUM_REFRESH_INTERVAL = 15 * 1000
- constructor(props) {
- super(props);
- autobind(this, 'refresh');
- }
-
componentDidMount() {
this.refresher = new PeriodicRefresher(this.constructor, {
interval: () => {
@@ -86,7 +81,7 @@ export class BarePrStatusesView extends React.Component {
this.refresher.destroy();
}
- refresh() {
+ refresh = () => {
this.props.relay.refetch({
id: this.props.pullRequest.id,
}, null, null, {force: true});
diff --git a/lib/views/staging-view.js b/lib/views/staging-view.js
index 474db1aaa0..6941f12aad 100644
--- a/lib/views/staging-view.js
+++ b/lib/views/staging-view.js
@@ -16,7 +16,6 @@ import CommitView from './commit-view';
import RefHolder from '../models/ref-holder';
import ChangedFileItem from '../items/changed-file-item';
import Commands, {Command} from '../atom/commands';
-import {autobind} from '../helpers';
import {addEvent} from '../reporter-proxy';
const debounce = (fn, wait) => {
@@ -83,14 +82,6 @@ export default class StagingView extends React.Component {
constructor(props) {
super(props);
- autobind(
- this,
- 'dblclickOnItem', 'contextMenuOnItem', 'mousedownOnItem', 'mousemoveOnItem', 'mouseup', 'registerItemElement',
- 'renderBody', 'openFile', 'discardChanges', 'activateNextList', 'activatePreviousList', 'activateLastList',
- 'stageAll', 'unstageAll', 'stageAllMergeConflicts', 'discardAll', 'confirmSelectedItems', 'selectAll',
- 'selectFirst', 'selectLast', 'diveIntoSelection', 'showDiffView', 'showBulkResolveMenu', 'showActionsMenu',
- 'resolveCurrentAsOurs', 'resolveCurrentAsTheirs', 'quietlySelectItem', 'didChangeSelectedItems',
- );
this.subs = new CompositeDisposable(
atom.config.observe('github.keyboardNavigationDelay', value => {
@@ -194,7 +185,7 @@ export default class StagingView extends React.Component {
);
}
- renderBody() {
+ renderBody = () => {
const selectedItems = this.state.selection.getSelectedItems();
return (
@@ -430,12 +421,12 @@ export default class StagingView extends React.Component {
return this.getSelectedItemFilePaths();
}
- openFile() {
+ openFile = () => {
const filePaths = this.getSelectedItemFilePaths();
return this.props.openFiles(filePaths);
}
- discardChanges({eventSource} = {}) {
+ discardChanges = ({eventSource} = {}) => {
const filePaths = this.getSelectedItemFilePaths();
addEvent('discard-unstaged-changes', {
package: 'github',
@@ -447,7 +438,7 @@ export default class StagingView extends React.Component {
return this.props.discardWorkDirChangesForPaths(filePaths);
}
- activateNextList() {
+ activateNextList = () => {
return new Promise(resolve => {
let advanced = false;
@@ -463,7 +454,7 @@ export default class StagingView extends React.Component {
});
}
- activatePreviousList() {
+ activatePreviousList = () => {
return new Promise(resolve => {
let retreated = false;
this.setState(prevState => {
@@ -478,7 +469,7 @@ export default class StagingView extends React.Component {
});
}
- activateLastList() {
+ activateLastList = () => {
return new Promise(resolve => {
let emptySelection = false;
this.setState(prevState => {
@@ -494,23 +485,23 @@ export default class StagingView extends React.Component {
});
}
- stageAll() {
+ stageAll = () => {
if (this.props.unstagedChanges.length === 0) { return null; }
return this.props.attemptStageAllOperation('unstaged');
}
- unstageAll() {
+ unstageAll = () => {
if (this.props.stagedChanges.length === 0) { return null; }
return this.props.attemptStageAllOperation('staged');
}
- stageAllMergeConflicts() {
+ stageAllMergeConflicts = () => {
if (this.props.mergeConflicts.length === 0) { return null; }
const filePaths = this.props.mergeConflicts.map(conflict => conflict.filePath);
return this.props.attemptFileStageOperation(filePaths, 'unstaged');
}
- discardAll({eventSource} = {}) {
+ discardAll = ({eventSource} = {}) => {
if (this.props.unstagedChanges.length === 0) { return null; }
const filePaths = this.props.unstagedChanges.map(filePatch => filePatch.filePath);
addEvent('discard-unstaged-changes', {
@@ -551,7 +542,7 @@ export default class StagingView extends React.Component {
});
}
- selectAll() {
+ selectAll = () => {
return new Promise(resolve => {
this.setState(prevState => ({
selection: prevState.selection.selectAllItems().coalesce(),
@@ -559,7 +550,7 @@ export default class StagingView extends React.Component {
});
}
- selectFirst(preserveTail = false) {
+ selectFirst = (preserveTail = false) => {
return new Promise(resolve => {
this.setState(prevState => ({
selection: prevState.selection.selectFirstItem(preserveTail).coalesce(),
@@ -567,7 +558,7 @@ export default class StagingView extends React.Component {
});
}
- selectLast(preserveTail = false) {
+ selectLast = (preserveTail = false) => {
return new Promise(resolve => {
this.setState(prevState => ({
selection: prevState.selection.selectLastItem(preserveTail).coalesce(),
@@ -575,7 +566,7 @@ export default class StagingView extends React.Component {
});
}
- async diveIntoSelection() {
+ diveIntoSelection = async () => {
const selectedItems = this.state.selection.getSelectedItems();
if (selectedItems.size !== 1) {
return;
@@ -611,7 +602,7 @@ export default class StagingView extends React.Component {
}
}
- async showDiffView() {
+ showDiffView = async () => {
const selectedItems = this.state.selection.getSelectedItems();
if (selectedItems.size !== 1) {
return;
@@ -627,7 +618,7 @@ export default class StagingView extends React.Component {
}
}
- showBulkResolveMenu(event) {
+ showBulkResolveMenu = event => {
const conflictPaths = this.props.mergeConflicts.map(c => c.filePath);
event.preventDefault();
@@ -647,7 +638,7 @@ export default class StagingView extends React.Component {
menu.popup(remote.getCurrentWindow());
}
- showActionsMenu(event) {
+ showActionsMenu = event => {
event.preventDefault();
const menu = new Menu();
@@ -676,18 +667,14 @@ export default class StagingView extends React.Component {
menu.popup(remote.getCurrentWindow());
}
- resolveCurrentAsOurs() {
- this.props.resolveAsOurs(this.getSelectedConflictPaths());
- }
+ resolveCurrentAsOurs = () => this.props.resolveAsOurs(this.getSelectedConflictPaths())
- resolveCurrentAsTheirs() {
- this.props.resolveAsTheirs(this.getSelectedConflictPaths());
- }
+ resolveCurrentAsTheirs = () => this.props.resolveAsTheirs(this.getSelectedConflictPaths())
// Directly modify the selection to include only the item identified by the file path and stagingStatus tuple.
// Re-render the component, but don't notify didSelectSingleItem() or other callback functions. This is useful to
// avoid circular callback loops for actions originating in FilePatchView or TextEditors with merge conflicts.
- quietlySelectItem(filePath, stagingStatus) {
+ quietlySelectItem = (filePath, stagingStatus) => {
return new Promise(resolve => {
this.setState(prevState => {
const item = prevState.selection.findItem((each, key) => each.filePath === filePath && key === stagingStatus);
@@ -713,7 +700,7 @@ export default class StagingView extends React.Component {
});
}
- didChangeSelectedItems(openNew) {
+ didChangeSelectedItems = openNew => {
const selectedItems = Array.from(this.state.selection.getSelectedItems());
if (selectedItems.length === 1) {
this.didSelectSingleItem(selectedItems[0], openNew);
@@ -814,11 +801,11 @@ export default class StagingView extends React.Component {
return new File(absolutePath).exists();
}
- dblclickOnItem(event, item) {
+ dblclickOnItem = (_event, item) => {
return this.props.attemptFileStageOperation([item.filePath], this.state.selection.listKeyForItem(item));
}
- async contextMenuOnItem(event, item) {
+ contextMenuOnItem = async (event, item) => {
if (!this.state.selection.getSelectedItems().has(item)) {
event.stopPropagation();
@@ -839,7 +826,7 @@ export default class StagingView extends React.Component {
}
}
- async mousedownOnItem(event, item) {
+ mousedownOnItem = async (event, item) => {
const windows = process.platform === 'win32';
if (event.ctrlKey && !windows) { return; } // simply open context menu
if (event.button === 0) {
@@ -860,7 +847,7 @@ export default class StagingView extends React.Component {
}
}
- async mousemoveOnItem(event, item) {
+ mousemoveOnItem = async (_event, item) => {
if (this.mouseSelectionInProgress) {
await new Promise(resolve => {
this.setState(prevState => ({
@@ -870,7 +857,7 @@ export default class StagingView extends React.Component {
}
}
- async mouseup() {
+ mouseup = async () => {
const hadSelectionInProgress = this.mouseSelectionInProgress;
this.mouseSelectionInProgress = false;
@@ -902,9 +889,7 @@ export default class StagingView extends React.Component {
return this.state.selection.getActiveListKey() === listKey ? 'is-focused' : '';
}
- registerItemElement(item, element) {
- this.listElementsByItem.set(item, element);
- }
+ registerItemElement = (item, element) => this.listElementsByItem.set(item, element)
getFocus(element) {
return this.refRoot.map(root => root.contains(element)).getOr(false) ? StagingView.focus.STAGING : null;
diff --git a/lib/worker-manager.js b/lib/worker-manager.js
index e6811314c4..b4c2d7426d 100644
--- a/lib/worker-manager.js
+++ b/lib/worker-manager.js
@@ -5,7 +5,7 @@ import {remote, ipcRenderer as ipc} from 'electron';
const {BrowserWindow} = remote;
import {Emitter, Disposable, CompositeDisposable} from 'event-kit';
-import {getPackageRoot, autobind} from './helpers';
+import {getPackageRoot} from './helpers';
export default class WorkerManager {
static instance = null;
@@ -23,8 +23,6 @@ export default class WorkerManager {
}
constructor() {
- autobind(this, 'onDestroyed', 'onCrashed', 'onSick');
-
this.workers = new Set();
this.activeWorker = null;
this.createNewWorker();
@@ -59,18 +57,18 @@ export default class WorkerManager {
this.workers.add(this.activeWorker);
}
- onDestroyed(destroyedWorker) {
+ onDestroyed = destroyedWorker => {
this.workers.delete(destroyedWorker);
}
- onCrashed(crashedWorker) {
+ onCrashed = crashedWorker => {
if (crashedWorker === this.getActiveWorker()) {
this.createNewWorker({operationCountLimit: crashedWorker.getOperationCountLimit()});
}
crashedWorker.getRemainingOperations().forEach(operation => this.activeWorker.executeOperation(operation));
}
- onSick(sickWorker) {
+ onSick = sickWorker => {
if (!atom.inSpecMode()) {
// eslint-disable-next-line no-console
console.warn(`Sick worker detected.
@@ -108,12 +106,6 @@ export class Worker {
static channelName = 'github:renderer-ipc';
constructor({operationCountLimit, onSick, onCrashed, onDestroyed}) {
- autobind(
- this,
- 'handleDataReceived', 'onOperationComplete', 'handleCancelled', 'handleExecStarted', 'handleSpawnError',
- 'handleStdinError', 'handleSick', 'handleCrashed',
- );
-
this.operationCountLimit = operationCountLimit;
this.onSick = onSick;
this.onCrashed = onCrashed;
@@ -166,7 +158,7 @@ export class Worker {
return this.rendererProcess.cancelOperation(operation);
}
- handleDataReceived({id, results}) {
+ handleDataReceived = ({id, results}) => {
const operation = this.operationsById.get(id);
operation.complete(results, data => {
const {timing} = data;
@@ -177,7 +169,7 @@ export class Worker {
});
}
- onOperationComplete(operation) {
+ onOperationComplete = operation => {
this.completedOperationCount++;
this.operationsById.delete(operation.id);
@@ -186,7 +178,7 @@ export class Worker {
}
}
- handleCancelled({id}) {
+ handleCancelled = ({id}) => {
const operation = this.operationsById.get(id);
if (operation) {
// handleDataReceived() can be received before handleCancelled()
@@ -194,27 +186,27 @@ export class Worker {
}
}
- handleExecStarted({id}) {
+ handleExecStarted = ({id}) => {
const operation = this.operationsById.get(id);
operation.setInProgress();
}
- handleSpawnError({id, err}) {
+ handleSpawnError = ({id, err}) => {
const operation = this.operationsById.get(id);
operation.error(err);
}
- handleStdinError({id, stdin, err}) {
+ handleStdinError = ({id, err}) => {
const operation = this.operationsById.get(id);
operation.error(err);
}
- handleSick() {
+ handleSick = () => {
this.sick = true;
this.onSick(this);
}
- handleCrashed() {
+ handleCrashed = () => {
this.onCrashed(this);
this.destroy();
}
@@ -257,7 +249,6 @@ Sends operations to renderer processes
export class RendererProcess {
constructor({loadUrl,
onDestroyed, onCrashed, onSick, onData, onCancelled, onSpawnError, onStdinError, onExecStarted}) {
- autobind(this, 'handleDestroy');
this.onDestroyed = onDestroyed;
this.onCrashed = onCrashed;
this.onSick = onSick;
@@ -297,7 +288,7 @@ export class RendererProcess {
return this.ready;
}
- handleDestroy(...args) {
+ handleDestroy = (...args) => {
this.destroy();
this.onCrashed(...args);
}
diff --git a/test/async-queue.test.js b/test/async-queue.test.js
index 7178673bc4..782be8f9c3 100644
--- a/test/async-queue.test.js
+++ b/test/async-queue.test.js
@@ -1,17 +1,14 @@
-import {autobind} from '../lib/helpers';
import AsyncQueue from '../lib/async-queue';
class Task {
constructor(name, error) {
- autobind(this, 'run', 'finish');
-
this.name = name;
this.error = error;
this.started = false;
this.finished = false;
}
- run() {
+ run = () => {
this.started = true;
this.finished = false;
return new Promise((resolve, reject) => {
@@ -20,7 +17,7 @@ class Task {
});
}
- finish() {
+ finish = () => {
this.finished = true;
if (this.error) {
this.reject(new Error(this.name));
diff --git a/test/views/pr-commits-view.test.js b/test/views/pr-commits-view.test.js
index 5b0cbf705e..ca107034e9 100644
--- a/test/views/pr-commits-view.test.js
+++ b/test/views/pr-commits-view.test.js
@@ -82,8 +82,8 @@ describe('PrCommitsView', function() {
it('calls relay.loadMore when load more button is clicked', function() {
const commitSpecs = [commitSpec, commitSpec];
- const loadMoreStub = sinon.stub(PrCommitsView.prototype, 'loadMore');
- const wrapper = shallow(buildApp({relayHasMore: () => true, commitSpecs}));
+ const loadMoreStub = sinon.stub().returns(true);
+ const wrapper = shallow(buildApp({relayHasMore: () => true, relayLoadMore: loadMoreStub, commitSpecs}));
assert.strictEqual(loadMoreStub.callCount, 0);
wrapper.find('.github-PrCommitsView-load-more-button').simulate('click');
assert.strictEqual(loadMoreStub.callCount, 1);