Skip to content
This repository was archived by the owner on Dec 15, 2022. It is now read-only.

Commit bacd74e

Browse files
authored
Merge pull request #2329 from atom/aw/github-blank-slates
Blank states for GitHub tab
2 parents 2d0b976 + 86a8dd2 commit bacd74e

32 files changed

+681
-311
lines changed

lib/containers/comment-decorations-container.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -146,6 +146,7 @@ export default class CommentDecorationsContainer extends React.Component {
146146

147147
if (
148148
!props || !props.repository || !props.repository.ref ||
149+
!props.repository.ref.associatedPullRequests ||
149150
props.repository.ref.associatedPullRequests.totalCount === 0
150151
) {
151152
// no loading spinner for you

lib/containers/current-pull-request-container.js

Lines changed: 2 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,7 @@ import {QueryRenderer, graphql} from 'react-relay';
44
import {Disposable} from 'event-kit';
55

66
import {autobind, CHECK_SUITE_PAGE_SIZE, CHECK_RUN_PAGE_SIZE} from '../helpers';
7-
import {
8-
RemotePropType, RemoteSetPropType, BranchSetPropType, OperationStateObserverPropType, EndpointPropType,
9-
} from '../prop-types';
7+
import {RemotePropType, RemoteSetPropType, BranchSetPropType, EndpointPropType} from '../prop-types';
108
import IssueishListController, {BareIssueishListController} from '../controllers/issueish-list-controller';
119
import CreatePullRequestTile from '../views/create-pull-request-tile';
1210
import RelayNetworkLayerManager from '../relay-network-layer-manager';
@@ -30,7 +28,6 @@ export default class CurrentPullRequestContainer extends React.Component {
3028
limit: PropTypes.number,
3129

3230
// Repository model attributes
33-
remoteOperationObserver: OperationStateObserverPropType.isRequired,
3431
remote: RemotePropType.isRequired,
3532
remotes: RemoteSetPropType.isRequired,
3633
branches: BranchSetPropType.isRequired,
@@ -120,18 +117,10 @@ export default class CurrentPullRequestContainer extends React.Component {
120117
}
121118

122119
renderEmptyResult() {
123-
this.sub.dispose();
124-
this.sub = this.props.remoteOperationObserver.onDidComplete(() => this.forceUpdate());
125-
126120
return <BareIssueishListController isLoading={false} {...this.controllerProps()} />;
127121
}
128122

129-
renderQueryResult({error, props, retry}) {
130-
if (retry) {
131-
this.sub.dispose();
132-
this.sub = this.props.remoteOperationObserver.onDidComplete(retry);
133-
}
134-
123+
renderQueryResult({error, props}) {
135124
if (error) {
136125
return (
137126
<BareIssueishListController

lib/containers/github-tab-container.js

Lines changed: 37 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,11 @@
11
import React from 'react';
22
import PropTypes from 'prop-types';
33
import yubikiri from 'yubikiri';
4+
import {Disposable} from 'event-kit';
45

56
import {GithubLoginModelPropType, RefHolderPropType} from '../prop-types';
67
import OperationStateObserver, {PUSH, PULL, FETCH} from '../models/operation-state-observer';
8+
import Refresher from '../models/refresher';
79
import GitHubTabController from '../controllers/github-tab-controller';
810
import ObserveModel from '../views/observe-model';
911
import RemoteSet from '../models/remote-set';
@@ -15,21 +17,51 @@ export default class GitHubTabContainer extends React.Component {
1517
repository: PropTypes.object,
1618
loginModel: GithubLoginModelPropType.isRequired,
1719
rootHolder: RefHolderPropType.isRequired,
20+
21+
changeWorkingDirectory: PropTypes.func.isRequired,
22+
onDidChangeWorkDirs: PropTypes.func.isRequired,
23+
getCurrentWorkDirs: PropTypes.func.isRequired,
24+
openCreateDialog: PropTypes.func.isRequired,
25+
openPublishDialog: PropTypes.func.isRequired,
26+
openCloneDialog: PropTypes.func.isRequired,
27+
openGitTab: PropTypes.func.isRequired,
1828
}
1929

20-
state = {};
30+
constructor(props) {
31+
super(props);
32+
33+
this.state = {
34+
lastRepository: null,
35+
remoteOperationObserver: new Disposable(),
36+
refresher: new Refresher(),
37+
observerSub: new Disposable(),
38+
};
39+
}
2140

2241
static getDerivedStateFromProps(props, state) {
2342
if (props.repository !== state.lastRepository) {
43+
state.remoteOperationObserver.dispose();
44+
state.observerSub.dispose();
45+
46+
const remoteOperationObserver = new OperationStateObserver(props.repository, PUSH, PULL, FETCH);
47+
const observerSub = remoteOperationObserver.onDidComplete(() => state.refresher.trigger());
48+
2449
return {
2550
lastRepository: props.repository,
26-
remoteOperationObserver: new OperationStateObserver(props.repository, PUSH, PULL, FETCH),
51+
remoteOperationObserver,
52+
observerSub,
2753
};
2854
}
2955

3056
return null;
3157
}
3258

59+
componentWillUnmount() {
60+
this.state.observerSub.dispose();
61+
this.state.remoteOperationObserver.dispose();
62+
this.state.refresher.dispose();
63+
}
64+
3365
fetchRepositoryData = repository => {
3466
return yubikiri({
3567
workingDirectory: repository.getWorkingDirectoryPath(),
@@ -58,7 +90,7 @@ export default class GitHubTabContainer extends React.Component {
5890
return (
5991
<GitHubTabController
6092
{...this.props}
61-
remoteOperationObserver={this.state.remoteOperationObserver}
93+
refresher={this.state.refresher}
6294

6395
allRemotes={new RemoteSet()}
6496
branches={new BranchSet()}
@@ -73,7 +105,7 @@ export default class GitHubTabContainer extends React.Component {
73105
return (
74106
<GitHubTabController
75107
{...this.props}
76-
remoteOperationObserver={this.state.remoteOperationObserver}
108+
refresher={this.state.refresher}
77109

78110
allRemotes={new RemoteSet()}
79111
branches={new BranchSet()}
@@ -88,7 +120,7 @@ export default class GitHubTabContainer extends React.Component {
88120
<GitHubTabController
89121
{...data}
90122
{...this.props}
91-
remoteOperationObserver={this.state.remoteOperationObserver}
123+
refresher={this.state.refresher}
92124
isLoading={false}
93125
/>
94126
);

lib/containers/issueish-search-container.js

Lines changed: 2 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ import {QueryRenderer, graphql} from 'react-relay';
44
import {Disposable} from 'event-kit';
55

66
import {autobind, CHECK_SUITE_PAGE_SIZE, CHECK_RUN_PAGE_SIZE} from '../helpers';
7-
import {SearchPropType, OperationStateObserverPropType, EndpointPropType} from '../prop-types';
7+
import {SearchPropType, EndpointPropType} from '../prop-types';
88
import IssueishListController, {BareIssueishListController} from '../controllers/issueish-list-controller';
99
import RelayNetworkLayerManager from '../relay-network-layer-manager';
1010

@@ -17,7 +17,6 @@ export default class IssueishSearchContainer extends React.Component {
1717
// Search model
1818
limit: PropTypes.number,
1919
search: SearchPropType.isRequired,
20-
remoteOperationObserver: OperationStateObserverPropType.isRequired,
2120

2221
// Action methods
2322
onOpenIssueish: PropTypes.func.isRequired,
@@ -89,12 +88,7 @@ export default class IssueishSearchContainer extends React.Component {
8988
);
9089
}
9190

92-
renderQueryResult({error, props, retry}) {
93-
if (retry) {
94-
this.sub.dispose();
95-
this.sub = this.props.remoteOperationObserver.onDidComplete(retry);
96-
}
97-
91+
renderQueryResult({error, props}) {
9892
if (error) {
9993
return (
10094
<BareIssueishListController

lib/containers/remote-container.js

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,7 @@ import PropTypes from 'prop-types';
33
import {QueryRenderer, graphql} from 'react-relay';
44

55
import {incrementCounter} from '../reporter-proxy';
6-
import {
7-
RemotePropType, RemoteSetPropType, BranchSetPropType, OperationStateObserverPropType, EndpointPropType,
8-
} from '../prop-types';
6+
import {RemotePropType, RemoteSetPropType, BranchSetPropType, RefresherPropType, EndpointPropType} from '../prop-types';
97
import RelayNetworkLayerManager from '../relay-network-layer-manager';
108
import {UNAUTHENTICATED, INSUFFICIENT} from '../shared/keytar-strategy';
119
import RemoteController from '../controllers/remote-controller';
@@ -21,7 +19,7 @@ export default class RemoteContainer extends React.Component {
2119
endpoint: EndpointPropType.isRequired,
2220

2321
// Repository attributes
24-
remoteOperationObserver: OperationStateObserverPropType.isRequired,
22+
refresher: RefresherPropType.isRequired,
2523
pushInProgress: PropTypes.bool.isRequired,
2624
workingDirectory: PropTypes.string,
2725
workspace: PropTypes.object.isRequired,
@@ -104,6 +102,8 @@ export default class RemoteContainer extends React.Component {
104102
}
105103

106104
renderWithResult({error, props, retry}, token) {
105+
this.props.refresher.setRetryCallback(this, retry);
106+
107107
if (error) {
108108
return (
109109
<QueryErrorView
@@ -126,7 +126,6 @@ export default class RemoteContainer extends React.Component {
126126

127127
repository={props.repository}
128128

129-
remoteOperationObserver={this.props.remoteOperationObserver}
130129
workingDirectory={this.props.workingDirectory}
131130
workspace={this.props.workspace}
132131
remote={this.props.remote}

lib/controllers/github-tab-controller.js

Lines changed: 15 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,19 +2,19 @@ import React from 'react';
22
import PropTypes from 'prop-types';
33

44
import {
5-
GithubLoginModelPropType, RefHolderPropType, RemoteSetPropType, BranchSetPropType, OperationStateObserverPropType,
5+
GithubLoginModelPropType, RefHolderPropType, RemoteSetPropType, BranchSetPropType, RefresherPropType,
66
} from '../prop-types';
77
import GitHubTabView from '../views/github-tab-view';
88

99
export default class GitHubTabController extends React.Component {
1010
static propTypes = {
1111
workspace: PropTypes.object.isRequired,
12-
repository: PropTypes.object.isRequired,
13-
remoteOperationObserver: OperationStateObserverPropType.isRequired,
12+
refresher: RefresherPropType.isRequired,
1413
loginModel: GithubLoginModelPropType.isRequired,
1514
rootHolder: RefHolderPropType.isRequired,
1615

1716
workingDirectory: PropTypes.string,
17+
repository: PropTypes.object.isRequired,
1818
allRemotes: RemoteSetPropType.isRequired,
1919
branches: BranchSetPropType.isRequired,
2020
selectedRemoteName: PropTypes.string,
@@ -26,6 +26,10 @@ export default class GitHubTabController extends React.Component {
2626
changeWorkingDirectory: PropTypes.func.isRequired,
2727
onDidChangeWorkDirs: PropTypes.func.isRequired,
2828
getCurrentWorkDirs: PropTypes.func.isRequired,
29+
openCreateDialog: PropTypes.func.isRequired,
30+
openPublishDialog: PropTypes.func.isRequired,
31+
openCloneDialog: PropTypes.func.isRequired,
32+
openGitTab: PropTypes.func.isRequired,
2933
}
3034

3135
render() {
@@ -43,11 +47,12 @@ export default class GitHubTabController extends React.Component {
4347
return (
4448
<GitHubTabView
4549
workspace={this.props.workspace}
46-
remoteOperationObserver={this.props.remoteOperationObserver}
50+
refresher={this.props.refresher}
4751
loginModel={this.props.loginModel}
4852
rootHolder={this.props.rootHolder}
4953

5054
workingDirectory={this.props.workingDirectory || this.props.currentWorkDir}
55+
repository={this.props.repository}
5156
branches={this.props.branches}
5257
currentBranch={currentBranch}
5358
remotes={gitHubRemotes}
@@ -62,6 +67,10 @@ export default class GitHubTabController extends React.Component {
6267
changeWorkingDirectory={this.props.changeWorkingDirectory}
6368
getCurrentWorkDirs={this.props.getCurrentWorkDirs}
6469
onDidChangeWorkDirs={this.props.onDidChangeWorkDirs}
70+
openCreateDialog={this.props.openCreateDialog}
71+
openBoundPublishDialog={this.openBoundPublishDialog}
72+
openCloneDialog={this.props.openCloneDialog}
73+
openGitTab={this.props.openGitTab}
6574
/>
6675
);
6776
}
@@ -77,4 +86,6 @@ export default class GitHubTabController extends React.Component {
7786
e.preventDefault();
7887
return this.props.repository.setConfig('atomGithub.currentRemote', remote.getName());
7988
}
89+
90+
openBoundPublishDialog = () => this.props.openPublishDialog(this.props.repository);
8091
}

lib/controllers/issueish-searches-controller.js

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,7 @@ import React from 'react';
22
import PropTypes from 'prop-types';
33
import {shell} from 'electron';
44

5-
import {
6-
RemotePropType, RemoteSetPropType, BranchSetPropType, OperationStateObserverPropType, EndpointPropType,
7-
} from '../prop-types';
5+
import {RemotePropType, RemoteSetPropType, BranchSetPropType, EndpointPropType} from '../prop-types';
86
import Search from '../models/search';
97
import IssueishSearchContainer from '../containers/issueish-search-container';
108
import CurrentPullRequestContainer from '../containers/current-pull-request-container';
@@ -31,7 +29,6 @@ export default class IssueishSearchesController extends React.Component {
3129
workspace: PropTypes.object.isRequired,
3230

3331
// Repository model attributes
34-
remoteOperationObserver: OperationStateObserverPropType.isRequired,
3532
workingDirectory: PropTypes.string,
3633
remote: RemotePropType.isRequired,
3734
remotes: RemoteSetPropType.isRequired,
@@ -60,7 +57,6 @@ export default class IssueishSearchesController extends React.Component {
6057
repository={this.props.repository}
6158
token={this.props.token}
6259
endpoint={this.props.endpoint}
63-
remoteOperationObserver={this.props.remoteOperationObserver}
6460
remote={this.props.remote}
6561
remotes={this.props.remotes}
6662
branches={this.props.branches}
@@ -79,7 +75,6 @@ export default class IssueishSearchesController extends React.Component {
7975
token={this.props.token}
8076
endpoint={this.props.endpoint}
8177
search={search}
82-
remoteOperationObserver={this.props.remoteOperationObserver}
8378

8479
onOpenIssueish={this.onOpenIssueish}
8580
onOpenSearch={this.onOpenSearch}

lib/controllers/remote-controller.js

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,7 @@ import {shell} from 'electron';
44

55
import {autobind} from '../helpers';
66
import {incrementCounter} from '../reporter-proxy';
7-
import {
8-
RemotePropType, RemoteSetPropType, BranchSetPropType, OperationStateObserverPropType, EndpointPropType,
9-
} from '../prop-types';
7+
import {RemotePropType, RemoteSetPropType, BranchSetPropType, EndpointPropType} from '../prop-types';
108
import IssueishSearchesController from './issueish-searches-controller';
119

1210
export default class RemoteController extends React.Component {
@@ -25,7 +23,6 @@ export default class RemoteController extends React.Component {
2523
token: PropTypes.string.isRequired,
2624

2725
// Repository derived attributes
28-
remoteOperationObserver: OperationStateObserverPropType.isRequired,
2926
workingDirectory: PropTypes.string,
3027
workspace: PropTypes.object.isRequired,
3128
remote: RemotePropType.isRequired,
@@ -49,7 +46,6 @@ export default class RemoteController extends React.Component {
4946
endpoint={this.props.endpoint}
5047
token={this.props.token}
5148

52-
remoteOperationObserver={this.props.remoteOperationObserver}
5349
workingDirectory={this.props.workingDirectory}
5450
repository={this.props.repository}
5551

lib/controllers/root-controller.js

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -312,6 +312,10 @@ export default class RootController extends React.Component {
312312
getCurrentWorkDirs={getCurrentWorkDirs}
313313
onDidChangeWorkDirs={onDidChangeWorkDirs}
314314
changeWorkingDirectory={this.props.changeWorkingDirectory}
315+
openCreateDialog={this.openCreateDialog}
316+
openPublishDialog={this.openPublishDialog}
317+
openCloneDialog={this.openCloneDialog}
318+
openGitTab={this.gitTabTracker.toggleFocus}
315319
/>
316320
)}
317321
</PaneItem>

lib/github-package.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -466,10 +466,10 @@ export default class GithubPackage {
466466
}
467467

468468
this.workdirCache.invalidate();
469-
470469
this.project.addPath(projectPath);
471-
472470
await this.scheduleActiveContextUpdate();
471+
472+
reporterProxy.addEvent('clone-repository', {project: 'github'});
473473
}
474474

475475
getRepositoryForWorkdir(projectPath) {

0 commit comments

Comments
 (0)