forked from atom/github
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathopen-issueish-dialog.js
118 lines (99 loc) · 3.18 KB
/
open-issueish-dialog.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
import React from 'react';
import PropTypes from 'prop-types';
import {TextBuffer} from 'atom';
import IssueishDetailItem from '../items/issueish-detail-item';
import TabGroup from '../tab-group';
import DialogView from './dialog-view';
import {TabbableTextEditor} from './tabbable';
import {addEvent} from '../reporter-proxy';
const ISSUEISH_URL_REGEX = /^(?:https?:\/\/)?(github.com)\/([^/]+)\/([^/]+)\/(?:issues|pull)\/(\d+)/;
export default class OpenIssueishDialog extends React.Component {
static propTypes = {
// Model
request: PropTypes.shape({
getParams: PropTypes.func.isRequired,
accept: PropTypes.func.isRequired,
cancel: PropTypes.func.isRequired,
}).isRequired,
inProgress: PropTypes.bool,
error: PropTypes.instanceOf(Error),
// Atom environment
workspace: PropTypes.object.isRequired,
commands: PropTypes.object.isRequired,
}
constructor(props) {
super(props);
this.url = new TextBuffer();
this.state = {
acceptEnabled: false,
};
this.sub = this.url.onDidChange(this.didChangeURL);
this.tabGroup = new TabGroup();
}
render() {
return (
<DialogView
acceptEnabled={this.state.acceptEnabled}
acceptClassName="icon icon-git-pull-request"
acceptText="Open Issue or Pull Request"
accept={this.accept}
cancel={this.props.request.cancel}
tabGroup={this.tabGroup}
inProgress={this.props.inProgress}
error={this.props.error}
workspace={this.props.workspace}
commands={this.props.commands}>
<label className="github-DialogLabel">
Issue or pull request URL:
<TabbableTextEditor
tabGroup={this.tabGroup}
commands={this.props.commands}
autofocus
mini
className="github-OpenIssueish-url"
buffer={this.url}
/>
</label>
</DialogView>
);
}
componentDidMount() {
this.tabGroup.autofocus();
}
componentWillUnmount() {
this.sub.dispose();
}
accept = () => {
const issueishURL = this.url.getText();
if (issueishURL.length === 0) {
return Promise.resolve();
}
return this.props.request.accept(issueishURL);
}
parseUrl() {
const url = this.getIssueishUrl();
const matches = url.match(ISSUEISH_URL_REGEX);
if (!matches) {
return false;
}
const [_full, repoOwner, repoName, issueishNumber] = matches; // eslint-disable-line no-unused-vars
return {repoOwner, repoName, issueishNumber};
}
didChangeURL = () => {
const enabled = !this.url.isEmpty();
if (this.state.acceptEnabled !== enabled) {
this.setState({acceptEnabled: enabled});
}
}
}
export async function openIssueishItem(issueishURL, {workspace, workdir}) {
const matches = ISSUEISH_URL_REGEX.exec(issueishURL);
if (!matches) {
throw new Error('Not a valid issue or pull request URL');
}
const [, host, owner, repo, number] = matches;
const uri = IssueishDetailItem.buildURI({host, owner, repo, number, workdir});
const item = await workspace.open(uri, {searchAllPanes: true});
addEvent('open-issueish-in-pane', {package: 'github', from: 'dialog'});
return item;
}