Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit 1dcda7d

Browse files
feat: update reviewer.
1 parent 9764978 commit 1dcda7d

File tree

10 files changed

+101
-43
lines changed

10 files changed

+101
-43
lines changed

‎package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -163,7 +163,7 @@
163163
"style-loader": "^2.0.0",
164164
"svg-inline-loader": "^0.8.2",
165165
"ts-loader": "^8.0.5",
166-
"typescript": "^4.0.3",
166+
"typescript": "^4.1.2",
167167
"webpack": "4",
168168
"webpack-cli": "^4.0.0"
169169
},

‎src/codingServer.ts

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -614,6 +614,52 @@ export class CodingServer {
614614
}
615615
}
616616

617+
public async addMRReviewers(iid: string, ids: number[]): Promise<number[]> {
618+
const { repoApiPrefix } = await this.getApiPrefix();
619+
const tasks: Promise<CodingResponse>[] = ids.map((id) => {
620+
return got
621+
.post(`${repoApiPrefix}/merge/${iid}/reviewers`, {
622+
searchParams: {
623+
user_id: id,
624+
access_token: this._session?.accessToken,
625+
},
626+
})
627+
.json();
628+
});
629+
const result: PromiseSettledResult<CodingResponse>[] = await Promise.allSettled(tasks);
630+
const fulfilled = ids.reduce((res, cur, idx) => {
631+
if (result[idx].status === `fulfilled`) {
632+
res = res.concat(cur);
633+
}
634+
635+
return res;
636+
}, [] as number[]);
637+
return fulfilled;
638+
}
639+
640+
public async removeMRReviewers(iid: string, ids: number[]): Promise<number[]> {
641+
const { repoApiPrefix } = await this.getApiPrefix();
642+
const tasks: Promise<CodingResponse>[] = ids.map((id) => {
643+
return got
644+
.delete(`${repoApiPrefix}/merge/${iid}/reviewers`, {
645+
searchParams: {
646+
user_id: id,
647+
access_token: this._session?.accessToken,
648+
},
649+
})
650+
.json();
651+
});
652+
const result: PromiseSettledResult<CodingResponse>[] = await Promise.allSettled(tasks);
653+
const fulfilled = ids.reduce((res, cur, idx) => {
654+
if (result[idx].status === `fulfilled`) {
655+
res = res.concat(cur);
656+
}
657+
658+
return res;
659+
}, [] as number[]);
660+
return fulfilled;
661+
}
662+
617663
get loggedIn() {
618664
return this._loggedIn;
619665
}

‎src/panel.ts

Lines changed: 27 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -122,21 +122,43 @@ export class Panel {
122122
const getActivitiesRes = await this._codingSrv.getMRActivities(args);
123123
this.replyMessage(message, getActivitiesRes.data);
124124
break;
125-
case 'mr.update.addReviewer': {
125+
case 'mr.update.reviewers': {
126126
try {
127+
const [iid, selected]: [string, number[]] = args;
127128
const {
128129
data: { list: memberList },
129130
} = await codingSrv.getProjectMembers();
130-
const list = memberList.map((i) => ({
131-
label: i.user.name,
132-
description: i.user.global_key,
133-
}));
131+
const list = memberList
132+
.filter((i) => i.user.global_key !== codingSrv.session?.user?.global_key)
133+
.map((i) => ({
134+
label: i.user.name,
135+
description: i.user.global_key,
136+
picked: selected.includes(i.user.id),
137+
userId: i.user.id,
138+
}));
134139
const selection = await vscode.window.showQuickPick(list, {
135140
canPickMany: true,
141+
ignoreFocusOut: true,
136142
});
143+
137144
if (!selection) {
138145
return;
139146
}
147+
148+
const s = selection.map((i) => i.userId);
149+
const added = s.filter((i) => !selected.includes(i));
150+
const removed = selected.filter((i) => !s.includes(i));
151+
const tasks = [];
152+
if (added.length) {
153+
tasks.push(codingSrv.addMRReviewers(iid, added));
154+
}
155+
if (removed.length) {
156+
tasks.push(codingSrv.removeMRReviewers(iid, removed));
157+
}
158+
159+
await Promise.all(tasks);
160+
const resp = await codingSrv.getMRReviewers(iid);
161+
this.broadcast(command, resp.data);
140162
} catch (err) {}
141163
break;
142164
}

‎src/tsconfig.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
"compilerOptions": {
33
"module": "commonjs",
44
"target": "es2019",
5-
"lib": ["ES2019", "dom"],
5+
"lib": ["es2019", "dom", "es2020"],
66
"outDir": "../out",
77
"sourceMap": true,
88
"strict": true,

‎tsconfig.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
"outDir": "out/webviews",
66
"module": "esnext",
77
"target": "es5",
8-
"lib": ["es6", "dom", "esnext.asynciterable"],
8+
"lib": ["es2020", "es6", "dom", "esnext.asynciterable"],
99
"sourceMap": true,
1010
"allowJs": true,
1111
"jsx": "react",
@@ -21,7 +21,7 @@
2121
"allowSyntheticDefaultImports": true,
2222
"paths": {
2323
"webviews/*": ["webviews/*"],
24-
"src/*": ["src/*"],
24+
"src/*": ["src/*"]
2525
}
2626
},
2727
"include": ["webviews", "types"]

‎webviews/components/Reviewers.tsx

Lines changed: 12 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,10 @@
1-
import React from 'react';
1+
import React,{useCallback} from 'react';
22
import styled from 'styled-components';
33
import { view } from '@risingstack/react-easy-state';
44

55
import appStore from 'webviews/store/appStore';
66
import { Avatar, AuthorLink } from 'webviews/components/User';
7-
import PlusIcon from 'webviews/assets/plus.svg';
8-
import CheckIcon from 'webviews/assets/check.svg';
9-
import DeleteIcon from 'webviews/assets/delete.svg';
7+
import EditIcon from 'webviews/assets/edit.svg';
108

119
const Title = styled.div`
1210
margin-top: 15px;
@@ -21,10 +19,6 @@ const Item = styled(FlexCenter)`
2119
padding: 5px 0;
2220
justify-content: space-between;
2321
24-
:hover {
25-
cursor: pointer;
26-
}
27-
2822
a:first-child {
2923
margin-right: 5px;
3024
}
@@ -51,24 +45,24 @@ const IconButton = styled.button`
5145
fill: var(--vscode-foreground);
5246
}
5347
`;
54-
const Check = styled(CheckIcon)`
55-
svg path {
56-
fill: var(--vscode-button-background);
57-
}
58-
`;
5948

6049
function Reviewers() {
61-
const { reviewers } = appStore;
50+
const { reviewers, currentMR } = appStore;
6251
const { reviewers: rReviewers = [], volunteer_reviewers: volunteerReviewers = [] } = reviewers;
6352
const allReviewers = [...rReviewers, ...volunteerReviewers];
64-
const { addReviewers } = appStore;
53+
const { updateReviewers } = appStore;
54+
55+
const onUpdateReviewer = useCallback(() => {
56+
const list = allReviewers.map((i) => i.reviewer.id);
57+
updateReviewers(currentMR.iid, list);
58+
}, [allReviewers]);
6559

6660
return (
6761
<div>
6862
<Title>
6963
Reviewers
70-
<IconButton onClick={addReviewers}>
71-
<PlusIcon />
64+
<IconButton onClick={onUpdateReviewer}>
65+
<EditIcon />
7266
</IconButton>
7367
</Title>
7468
{allReviewers.map((r) => {
@@ -78,10 +72,7 @@ function Reviewers() {
7872
<Avatar for={r.reviewer} />
7973
<AuthorLink for={r.reviewer} />
8074
</FlexCenter>
81-
{r.value === 100 && <Check />}
82-
<IconButton>
83-
<DeleteIcon />
84-
</IconButton>
75+
{r.value === 100 && `👍`}
8576
</Item>
8677
);
8778
})}

‎webviews/hooks/messageTransferHook.tsx

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -27,14 +27,14 @@ export default function messageTransferHook() {
2727
updateMRActivities(res);
2828
break;
2929
}
30-
case actions.UPDATE_MR_REVIEWERS: {
31-
updateMRReviewers(res);
32-
break;
33-
}
3430
case actions.MR_UPDATE_COMMENTS: {
3531
updateMRComments(res);
3632
break;
3733
}
34+
case actions.MR_UPDATE_REVIEWERS: {
35+
res && updateMRReviewers(res);
36+
break;
37+
}
3838
default:
3939
break;
4040
}

‎webviews/store/appStore.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -113,10 +113,10 @@ const appStore = store({
113113
appStore.comments.push([result] as any);
114114
return result;
115115
},
116-
async addReviewers() {
116+
async updateReviewers(iid: string,list: number[]) {
117117
const result = await vscode.postMessage({
118-
command: actions.MR_ADD_REVIEWER,
119-
args: {},
118+
command: actions.MR_UPDATE_REVIEWERS,
119+
args: [iid,list],
120120
});
121121
return result;
122122
},

‎webviews/store/constants.ts

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,11 +5,10 @@ export enum actions {
55
MR_APPROVE = `mr.approve`,
66
MR_DISAPPROVE = `mr.disapprove`,
77
MR_MERGE = `mr.merge`,
8-
UPDATE_MR_REVIEWERS = `mr.update.reviewers`,
98
MR_UPDATE_TITLE = `mr.update.title`,
109
MR_UPDATE_COMMENTS = `mr.udpate.comments`,
1110
MR_ADD_COMMENT = `mr.add.comment`,
1211
MR_GET_ACTIVITIES = `mr.get.activities`,
1312
MR_TOGGLE_LOADING = `mr.update.toggleLoading`,
14-
MR_ADD_REVIEWER = `mr.update.addReviewer`,
13+
MR_UPDATE_REVIEWERS = `mr.update.reviewers`,
1514
}

‎yarn.lock

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7317,10 +7317,10 @@ typedarray@^0.0.6:
73177317
resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777"
73187318
integrity sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=
73197319

7320-
typescript@^4.0.3:
7321-
version "4.0.3"
7322-
resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.0.3.tgz#153bbd468ef07725c1df9c77e8b453f8d36abba5"
7323-
integrity sha512-tEu6DGxGgRJPb/mVPIZ48e69xCn2yRmCgYmDugAVwmJ6o+0u1RI18eO7E7WBTLYLaEVVOhwQmcdhQHweux/WPg==
7320+
typescript@^4.1.2:
7321+
version "4.1.2"
7322+
resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.1.2.tgz#6369ef22516fe5e10304aae5a5c4862db55380e9"
7323+
integrity sha512-thGloWsGH3SOxv1SoY7QojKi0tc+8FnOmiarEGMbd/lar7QOEd3hvlx3Fp5y6FlDUGl9L+pd4n2e+oToGMmhRQ==
73247324

73257325
typical@^5.0.0, typical@^5.2.0:
73267326
version "5.2.0"

0 commit comments

Comments
(0)

AltStyle によって変換されたページ (->オリジナル) /