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

Commit f1d164a

Browse files
authored
Merge pull request #2325 from wadethestealth/avatar
Add avatar and split up TabHeaderView
2 parents 0b19e6d + 373bf6a commit f1d164a

37 files changed

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

lib/controllers/git-tab-controller.js

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@ import path from 'path';
33
import React from 'react';
44
import PropTypes from 'prop-types';
55

6-
import Author from '../models/author';
76
import GitTabView from '../views/git-tab-view';
87
import UserStore from '../models/user-store';
98
import RefHolder from '../models/ref-holder';
@@ -279,11 +278,7 @@ export default class GitTabController extends React.Component {
279278

280279
await repo.undoLastCommit();
281280
repo.setCommitMessage(lastCommit.getFullMessage());
282-
283-
const coAuthors = lastCommit.getCoAuthors().map(author =>
284-
new Author(author.email, author.name));
285-
286-
this.updateSelectedCoAuthors(coAuthors);
281+
this.updateSelectedCoAuthors(lastCommit.getCoAuthors());
287282

288283
return null;
289284
}
Lines changed: 88 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,88 @@
1+
import React from 'react';
2+
import PropTypes from 'prop-types';
3+
import {CompositeDisposable} from 'atom';
4+
import {nullAuthor} from '../models/author';
5+
import GitTabHeaderView from '../views/git-tab-header-view';
6+
7+
export default class GitTabHeaderController extends React.Component {
8+
static propTypes = {
9+
getCommitter: PropTypes.func.isRequired,
10+
11+
// Workspace
12+
currentWorkDir: PropTypes.string,
13+
getCurrentWorkDirs: PropTypes.func.isRequired,
14+
15+
// Event Handlers
16+
handleWorkDirSelect: PropTypes.func.isRequired,
17+
onDidChangeWorkDirs: PropTypes.func.isRequired,
18+
onDidUpdateRepo: PropTypes.func.isRequired,
19+
}
20+
21+
constructor(props) {
22+
super(props);
23+
this._isMounted = false;
24+
this.state = {currentWorkDirs: [], committer: nullAuthor};
25+
this.disposable = new CompositeDisposable();
26+
}
27+
28+
static getDerivedStateFromProps(props, state) {
29+
return {
30+
currentWorkDirs: props.getCurrentWorkDirs(),
31+
};
32+
}
33+
34+
componentDidMount() {
35+
this._isMounted = true;
36+
this.disposable.add(this.props.onDidChangeWorkDirs(this.resetWorkDirs));
37+
this.disposable.add(this.props.onDidUpdateRepo(this.updateCommitter));
38+
this.updateCommitter();
39+
}
40+
41+
componentDidUpdate(prevProps) {
42+
if (
43+
prevProps.onDidChangeWorkDirs !== this.props.onDidChangeWorkDirs
44+
|| prevProps.onDidUpdateRepo !== this.props.onDidUpdateRepo
45+
) {
46+
this.disposable.dispose();
47+
this.disposable = new CompositeDisposable();
48+
this.disposable.add(this.props.onDidChangeWorkDirs(this.resetWorkDirs));
49+
this.disposable.add(this.props.onDidUpdateRepo(this.updateCommitter));
50+
}
51+
if (prevProps.getCommitter !== this.props.getCommitter) {
52+
this.updateCommitter();
53+
}
54+
}
55+
56+
render() {
57+
return (
58+
<GitTabHeaderView
59+
committer={this.state.committer}
60+
61+
// Workspace
62+
workdir={this.props.currentWorkDir}
63+
workdirs={this.state.currentWorkDirs}
64+
65+
// Event Handlers
66+
handleWorkDirSelect={this.props.handleWorkDirSelect}
67+
/>
68+
);
69+
}
70+
71+
resetWorkDirs = () => {
72+
this.setState((state, props) => ({
73+
currentWorkDirs: [],
74+
}));
75+
}
76+
77+
updateCommitter = async () => {
78+
const committer = await this.props.getCommitter() || nullAuthor;
79+
if (this._isMounted) {
80+
this.setState({committer});
81+
}
82+
}
83+
84+
componentWillUnmount() {
85+
this._isMounted = false;
86+
this.disposable.dispose();
87+
}
88+
}

lib/controllers/github-tab-controller.js

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

4747
return (
4848
<GitHubTabView
49+
// Connection
50+
loginModel={this.props.loginModel}
51+
4952
workspace={this.props.workspace}
5053
refresher={this.props.refresher}
51-
loginModel={this.props.loginModel}
5254
rootHolder={this.props.rootHolder}
5355

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

0 commit comments

Comments
 (0)