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

Commit eb0c5fb

Browse files
authored
Merge pull request #2572 from atom/login-before-create
Increase priority of login prompt on GitHub tab
2 parents 2c9ffe3 + 5705c96 commit eb0c5fb

17 files changed

+450
-338
lines changed

lib/containers/github-tab-container.js

Lines changed: 43 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,10 @@ import Refresher from '../models/refresher';
99
import GitHubTabController from '../controllers/github-tab-controller';
1010
import ObserveModel from '../views/observe-model';
1111
import RemoteSet from '../models/remote-set';
12+
import {nullRemote} from '../models/remote';
1213
import BranchSet from '../models/branch-set';
14+
import {nullBranch} from '../models/branch';
15+
import {DOTCOM} from '../models/endpoint';
1316

1417
export default class GitHubTabContainer extends React.Component {
1518
static propTypes = {
@@ -77,6 +80,8 @@ export default class GitHubTabContainer extends React.Component {
7780
});
7881
}
7982

83+
fetchToken = (loginModel, endpoint) => loginModel.getToken(endpoint.getLoginAccount());
84+
8085
render() {
8186
return (
8287
<ObserveModel model={this.props.repository} fetchData={this.fetchRepositoryData}>
@@ -85,18 +90,47 @@ export default class GitHubTabContainer extends React.Component {
8590
);
8691
}
8792

88-
renderRepositoryData = data => {
89-
if (!data || this.props.repository.isLoading()) {
93+
renderRepositoryData = repoData => {
94+
let endpoint = DOTCOM;
95+
96+
if (repoData) {
97+
repoData.githubRemotes = repoData.allRemotes.filter(remote => remote.isGithubRepo());
98+
repoData.currentBranch = repoData.branches.getHeadBranch();
99+
100+
repoData.currentRemote = repoData.githubRemotes.withName(repoData.selectedRemoteName);
101+
repoData.manyRemotesAvailable = false;
102+
if (!repoData.currentRemote.isPresent() && repoData.githubRemotes.size() === 1) {
103+
repoData.currentRemote = Array.from(repoData.githubRemotes)[0];
104+
} else if (!repoData.currentRemote.isPresent() && repoData.githubRemotes.size() > 1) {
105+
repoData.manyRemotesAvailable = true;
106+
}
107+
repoData.endpoint = endpoint = repoData.currentRemote.getEndpointOrDotcom();
108+
}
109+
110+
return (
111+
<ObserveModel model={this.props.loginModel} fetchData={this.fetchToken} fetchParams={[endpoint]}>
112+
{token => this.renderToken(token, repoData)}
113+
</ObserveModel>
114+
);
115+
}
116+
117+
renderToken(token, repoData) {
118+
if (!repoData || this.props.repository.isLoading()) {
90119
return (
91120
<GitHubTabController
92121
{...this.props}
93122
refresher={this.state.refresher}
94123

95124
allRemotes={new RemoteSet()}
125+
githubRemotes={new RemoteSet()}
126+
currentRemote={nullRemote}
96127
branches={new BranchSet()}
128+
currentBranch={nullBranch}
97129
aheadCount={0}
130+
manyRemotesAvailable={false}
98131
pushInProgress={false}
99132
isLoading={true}
133+
token={token}
100134
/>
101135
);
102136
}
@@ -108,20 +142,26 @@ export default class GitHubTabContainer extends React.Component {
108142
refresher={this.state.refresher}
109143

110144
allRemotes={new RemoteSet()}
145+
githubRemotes={new RemoteSet()}
146+
currentRemote={nullRemote}
111147
branches={new BranchSet()}
148+
currentBranch={nullBranch}
112149
aheadCount={0}
150+
manyRemotesAvailable={false}
113151
pushInProgress={false}
114152
isLoading={false}
153+
token={token}
115154
/>
116155
);
117156
}
118157

119158
return (
120159
<GitHubTabController
121-
{...data}
160+
{...repoData}
122161
{...this.props}
123162
refresher={this.state.refresher}
124163
isLoading={false}
164+
token={token}
125165
/>
126166
);
127167
}

lib/containers/github-tab-header-container.js

Lines changed: 9 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -2,18 +2,17 @@ import React from 'react';
22
import PropTypes from 'prop-types';
33
import {QueryRenderer, graphql} from 'react-relay';
44

5-
import {EndpointPropType} from '../prop-types';
5+
import {EndpointPropType, TokenPropType} from '../prop-types';
66
import RelayNetworkLayerManager from '../relay-network-layer-manager';
77
import {UNAUTHENTICATED, INSUFFICIENT} from '../shared/keytar-strategy';
8-
import ObserveModel from '../views/observe-model';
98
import Author, {nullAuthor} from '../models/author';
109
import GithubTabHeaderController from '../controllers/github-tab-header-controller';
1110

1211
export default class GithubTabHeaderContainer extends React.Component {
1312
static propTypes = {
1413
// Connection
15-
loginModel: PropTypes.object.isRequired,
1614
endpoint: EndpointPropType.isRequired,
15+
token: TokenPropType,
1716

1817
// Workspace
1918
currentWorkDir: PropTypes.string,
@@ -27,24 +26,16 @@ export default class GithubTabHeaderContainer extends React.Component {
2726
}
2827

2928
render() {
30-
return (
31-
<ObserveModel model={this.props.loginModel} fetchData={this.fetchToken}>
32-
{this.renderWithToken}
33-
</ObserveModel>
34-
);
35-
}
36-
37-
renderWithToken = token => {
3829
if (
39-
token == null
40-
|| token instanceof Error
41-
|| token === UNAUTHENTICATED
42-
|| token === INSUFFICIENT
30+
this.props.token == null
31+
|| this.props.token instanceof Error
32+
|| this.props.token === UNAUTHENTICATED
33+
|| this.props.token === INSUFFICIENT
4334
) {
4435
return this.renderNoResult();
4536
}
4637

47-
const environment = RelayNetworkLayerManager.getEnvironmentForHost(this.props.endpoint, token);
38+
const environment = RelayNetworkLayerManager.getEnvironmentForHost(this.props.endpoint, this.props.token);
4839
const query = graphql`
4940
query githubTabHeaderContainerQuery {
5041
viewer {
@@ -61,12 +52,12 @@ export default class GithubTabHeaderContainer extends React.Component {
6152
environment={environment}
6253
variables={{}}
6354
query={query}
64-
render={result => this.renderWithResult(result)}
55+
render={this.renderWithResult}
6556
/>
6657
);
6758
}
6859

69-
renderWithResult({error, props}) {
60+
renderWithResult = ({error, props}) => {
7061
if (error || props === null) {
7162
return this.renderNoResult();
7263
}
@@ -108,8 +99,4 @@ export default class GithubTabHeaderContainer extends React.Component {
10899
/>
109100
);
110101
}
111-
112-
fetchToken = loginModel => {
113-
return loginModel.getToken(this.props.endpoint.getLoginAccount());
114-
}
115102
}

lib/containers/remote-container.js

Lines changed: 13 additions & 65 deletions
Original file line numberDiff line numberDiff line change
@@ -2,21 +2,20 @@ import React from 'react';
22
import PropTypes from 'prop-types';
33
import {QueryRenderer, graphql} from 'react-relay';
44

5-
import {incrementCounter} from '../reporter-proxy';
6-
import {RemotePropType, RemoteSetPropType, BranchSetPropType, RefresherPropType, EndpointPropType} from '../prop-types';
5+
import {
6+
RemotePropType, RemoteSetPropType, BranchSetPropType, RefresherPropType,
7+
EndpointPropType, TokenPropType,
8+
} from '../prop-types';
79
import RelayNetworkLayerManager from '../relay-network-layer-manager';
8-
import {UNAUTHENTICATED, INSUFFICIENT} from '../shared/keytar-strategy';
910
import RemoteController from '../controllers/remote-controller';
10-
import ObserveModel from '../views/observe-model';
1111
import LoadingView from '../views/loading-view';
1212
import QueryErrorView from '../views/query-error-view';
13-
import GithubLoginView from '../views/github-login-view';
1413

1514
export default class RemoteContainer extends React.Component {
1615
static propTypes = {
1716
// Connection
18-
loginModel: PropTypes.object.isRequired,
1917
endpoint: EndpointPropType.isRequired,
18+
token: TokenPropType.isRequired,
2019

2120
// Repository attributes
2221
refresher: RefresherPropType.isRequired,
@@ -29,52 +28,13 @@ export default class RemoteContainer extends React.Component {
2928
aheadCount: PropTypes.number,
3029

3130
// Action methods
31+
handleLogin: PropTypes.func.isRequired,
32+
handleLogout: PropTypes.func.isRequired,
3233
onPushBranch: PropTypes.func.isRequired,
3334
}
3435

35-
fetchToken = loginModel => {
36-
return loginModel.getToken(this.props.endpoint.getLoginAccount());
37-
}
38-
3936
render() {
40-
return (
41-
<ObserveModel model={this.props.loginModel} fetchData={this.fetchToken}>
42-
{this.renderWithToken}
43-
</ObserveModel>
44-
);
45-
}
46-
47-
renderWithToken = token => {
48-
if (token === null) {
49-
return <LoadingView />;
50-
}
51-
52-
if (token instanceof Error) {
53-
return (
54-
<QueryErrorView
55-
error={token}
56-
retry={this.handleTokenRetry}
57-
login={this.handleLogin}
58-
logout={this.handleLogout}
59-
/>
60-
);
61-
}
62-
63-
if (token === UNAUTHENTICATED) {
64-
return <GithubLoginView onLogin={this.handleLogin} />;
65-
}
66-
67-
if (token === INSUFFICIENT) {
68-
return (
69-
<GithubLoginView onLogin={this.handleLogin}>
70-
<p>
71-
Your token no longer has sufficient authorizations. Please re-authenticate and generate a new one.
72-
</p>
73-
</GithubLoginView>
74-
);
75-
}
76-
77-
const environment = RelayNetworkLayerManager.getEnvironmentForHost(this.props.endpoint, token);
37+
const environment = RelayNetworkLayerManager.getEnvironmentForHost(this.props.endpoint, this.props.token);
7838
const query = graphql`
7939
query remoteContainerQuery($owner: String!, $name: String!) {
8040
repository(owner: $owner, name: $name) {
@@ -96,21 +56,21 @@ export default class RemoteContainer extends React.Component {
9656
environment={environment}
9757
variables={variables}
9858
query={query}
99-
render={result => this.renderWithResult(result, token)}
59+
render={this.renderWithResult}
10060
/>
10161
);
10262
}
10363

104-
renderWithResult({error, props, retry}, token) {
64+
renderWithResult = ({error, props, retry}) => {
10565
this.props.refresher.setRetryCallback(this, retry);
10666

10767
if (error) {
10868
return (
10969
<QueryErrorView
11070
error={error}
111-
login={this.handleLogin}
71+
login={this.props.handleLogin}
72+
logout={this.props.handleLogout}
11273
retry={retry}
113-
logout={this.handleLogout}
11474
/>
11575
);
11676
}
@@ -122,7 +82,7 @@ export default class RemoteContainer extends React.Component {
12282
return (
12383
<RemoteController
12484
endpoint={this.props.endpoint}
125-
token={token}
85+
token={this.props.token}
12686

12787
repository={props.repository}
12888

@@ -139,16 +99,4 @@ export default class RemoteContainer extends React.Component {
13999
/>
140100
);
141101
}
142-
143-
handleLogin = token => {
144-
incrementCounter('github-login');
145-
this.props.loginModel.setToken(this.props.endpoint.getLoginAccount(), token);
146-
}
147-
148-
handleLogout = () => {
149-
incrementCounter('github-logout');
150-
this.props.loginModel.removeToken(this.props.endpoint.getLoginAccount());
151-
}
152-
153-
handleTokenRetry = () => this.props.loginModel.didUpdate();
154102
}

0 commit comments

Comments
 (0)