Skip to content

Commit 1dcda7d

Browse files
committed
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)