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

Commit 4a48429

Browse files
render a github avatar
1 parent 82e6c50 commit 4a48429

File tree

6 files changed

+281
-43
lines changed

6 files changed

+281
-43
lines changed

lib/containers/__generated__/githubTabHeaderContainerQuery.graphql.js

Lines changed: 135 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.
Lines changed: 105 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,105 @@
1+
import React from 'react';
2+
import PropTypes from 'prop-types';
3+
import {QueryRenderer, graphql} from 'react-relay';
4+
5+
import {incrementCounter} from '../reporter-proxy';
6+
import {
7+
RemotePropType, RemoteSetPropType, BranchSetPropType, OperationStateObserverPropType, EndpointPropType,
8+
} from '../prop-types';
9+
import RelayNetworkLayerManager from '../relay-network-layer-manager';
10+
import {UNAUTHENTICATED, INSUFFICIENT} from '../shared/keytar-strategy';
11+
import RemoteController from '../controllers/remote-controller';
12+
import ObserveModel from '../views/observe-model';
13+
import LoadingView from '../views/loading-view';
14+
import QueryErrorView from '../views/query-error-view';
15+
import GithubLoginView from '../views/github-login-view';
16+
import Author, {nullAuthor} from '../models/author';
17+
import GithubTabHeaderView from '../views/github-tab-header-view';
18+
19+
export default class GithubTabHeaderContainer extends React.Component {
20+
static propTypes = {
21+
// Connection
22+
loginModel: PropTypes.object.isRequired,
23+
endpoint: EndpointPropType.isRequired,
24+
25+
currentWorkDir: PropTypes.string,
26+
27+
handleWorkDirSelect: PropTypes.func,
28+
onDidChangeWorkDirs: PropTypes.func,
29+
onDidUpdateRepo: PropTypes.func,
30+
}
31+
32+
render() {
33+
return (
34+
<ObserveModel model={this.props.loginModel} fetchData={this.fetchToken}>
35+
{this.renderWithToken}
36+
</ObserveModel>
37+
);
38+
}
39+
40+
renderWithToken = token => {
41+
if (
42+
token == null
43+
|| token instanceof Error
44+
|| token === UNAUTHENTICATED
45+
|| token === INSUFFICIENT
46+
) {
47+
return this.renderNoResult();
48+
}
49+
50+
const environment = RelayNetworkLayerManager.getEnvironmentForHost(this.props.endpoint, token);
51+
const query = graphql`
52+
query githubTabHeaderContainerQuery {
53+
viewer {
54+
name,
55+
email,
56+
avatarUrl,
57+
login
58+
}
59+
}
60+
`;
61+
62+
return (
63+
<QueryRenderer
64+
environment={environment}
65+
variables={{}}
66+
query={query}
67+
render={result => this.renderWithResult(result, token)}
68+
/>
69+
);
70+
}
71+
72+
renderWithResult({error, props, retry}, token) {
73+
if (error || props === null) {
74+
return this.renderNoResult();
75+
}
76+
77+
const {email, name, avatarUrl, login} = props.viewer;
78+
79+
return (
80+
<GithubTabHeaderView
81+
currentWorkDir={this.props.workingDirectory}
82+
committer={new Author(email, name, login, false, avatarUrl)}
83+
handleWorkDirSelect={this.props.handleWorkDirSelect}
84+
getCurrentWorkDirs={this.props.getCurrentWorkDirs}
85+
onDidChangeWorkDirs={this.props.onDidChangeWorkDirs}
86+
/>
87+
);
88+
}
89+
90+
renderNoResult() {
91+
return (
92+
<GithubTabHeaderView
93+
currentWorkDir={this.props.workingDirectory}
94+
committer={nullAuthor}
95+
handleWorkDirSelect={this.props.handleWorkDirSelect}
96+
getCurrentWorkDirs={this.props.getCurrentWorkDirs}
97+
onDidChangeWorkDirs={this.props.onDidChangeWorkDirs}
98+
/>
99+
);
100+
}
101+
102+
fetchToken = loginModel => {
103+
return loginModel.getToken(this.props.endpoint.getLoginAccount());
104+
}
105+
}

lib/controllers/github-tab-controller.js

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,9 +42,11 @@ export default class GitHubTabController extends React.Component {
4242

4343
return (
4444
<GitHubTabView
45+
// Connection
46+
loginModel={this.props.loginModel}
47+
4548
workspace={this.props.workspace}
4649
remoteOperationObserver={this.props.remoteOperationObserver}
47-
loginModel={this.props.loginModel}
4850
rootHolder={this.props.rootHolder}
4951

5052
workingDirectory={this.props.workingDirectory || this.props.currentWorkDir}

lib/models/author.js

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -3,14 +3,15 @@ const NEW = Symbol('new');
33
export const NO_REPLY_GITHUB_EMAIL = '[email protected]';
44

55
export default class Author {
6-
constructor(email, fullName, login = null, isNew = null) {
7-
const match = email.match(/^(\d+)\+[^@]+@users.noreply.github.com$/);
8-
9-
let avatarUrl;
10-
if (match) {
11-
avatarUrl = 'https://avatars.githubusercontent.com/u/' + match[1] + '?s=32';
12-
} else {
13-
avatarUrl = 'https://avatars.githubusercontent.com/u/e?email=' + encodeURIComponent(email) + '&s=32';
6+
constructor(email, fullName, login = null, isNew = null, avatarUrl = null) {
7+
if (avatarUrl == null) {
8+
const match = email.match(/^(\d+)\+[^@]+@users.noreply.github.com$/);
9+
10+
if (match) {
11+
avatarUrl = 'https://avatars.githubusercontent.com/u/' + match[1] + '?s=32';
12+
} else {
13+
avatarUrl = 'https://avatars.githubusercontent.com/u/e?email=' + encodeURIComponent(email) + '&s=32';
14+
}
1415
}
1516

1617
this.email = email;

lib/views/github-tab-header-view.js

Lines changed: 7 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -2,24 +2,22 @@ import React from 'react';
22
import PropTypes from 'prop-types';
33
import path from 'path';
44
import {CompositeDisposable} from 'atom';
5-
import {nullAuthor} from '../models/author';
5+
import {AuthorPropType} from '../prop-types';
66

77
export default class GithubTabHeaderView extends React.Component {
88
static propTypes = {
99
currentWorkDir: PropTypes.string,
10+
committer: AuthorPropType.isRequired,
1011

1112
handleWorkDirSelect: PropTypes.func,
1213
onDidChangeWorkDirs: PropTypes.func,
13-
onDidUpdateRepo: PropTypes.func,
14-
isRepoDestroyed: PropTypes.func.isRequired,
1514
getCurrentWorkDirs: PropTypes.func.isRequired,
16-
getCommitter: PropTypes.func.isRequired,
1715
}
1816

1917
constructor(props) {
2018
super(props);
2119
this._isMounted = false;
22-
this.state = {currentWorkDirs: [], committer: nullAuthor};
20+
this.state = {currentWorkDirs: []};
2321
this.disposable = new CompositeDisposable();
2422
}
2523

@@ -35,28 +33,17 @@ export default class GithubTabHeaderView extends React.Component {
3533
if (this.props.onDidChangeWorkDirs) {
3634
this.disposable.add(this.props.onDidChangeWorkDirs(this.updateWorkDirs));
3735
}
38-
if (this.props.onDidUpdateRepo) {
39-
this.disposable.add(this.props.onDidUpdateRepo(this.updateCommitter));
40-
}
41-
this.updateCommitter();
4236
}
4337

4438
componentDidUpdate(prevProps) {
4539
if (
4640
prevProps.onDidChangeWorkDirs !== this.props.onDidChangeWorkDirs
47-
|| prevProps.onDidUpdateRepo !== this.props.onDidUpdateRepo
4841
) {
4942
this.disposable.dispose();
5043
this.disposable = new CompositeDisposable();
5144
if (this.props.onDidChangeWorkDirs) {
5245
this.disposable.add(this.props.onDidChangeWorkDirs(this.updateWorkDirs));
5346
}
54-
if (this.props.onDidUpdateRepo && !this.props.isRepoDestroyed()) {
55-
this.disposable.add(this.props.onDidUpdateRepo(this.updateCommitter));
56-
}
57-
}
58-
if (prevProps.getCommitter !== this.props.getCommitter) {
59-
this.updateCommitter();
6047
}
6148
}
6249

@@ -88,26 +75,18 @@ export default class GithubTabHeaderView extends React.Component {
8875
}
8976

9077
renderCommitter() {
91-
const email = this.state.committer.getEmail();
92-
const avatarUrl = this.state.committer.getAvatarUrl();
93-
const name = this.state.committer.getFullName();
78+
const login = this.props.committer.getLogin();
79+
const avatarUrl = this.props.committer.getAvatarUrl();
9480

9581
return (
9682
<img className="github-Project-avatar"
9783
src={avatarUrl ? avatarUrl : 'atom://github/img/avatar.svg'}
98-
title={`${name} ${email}`}
99-
alt={`${name}'s avatar`}
84+
title={`@${login}`}
85+
alt={`@${login}'s avatar`}
10086
/>
10187
);
10288
}
10389

104-
updateCommitter = async () => {
105-
const committer = await this.props.getCommitter() || nullAuthor;
106-
if (this._isMounted) {
107-
this.setState({committer});
108-
}
109-
}
110-
11190
componentWillUnmount() {
11291
this._isMounted = false;
11392
if (this.disposable && this.disposable.dispose) {

0 commit comments

Comments
 (0)