Skip to content

Commit 4cc7541

Browse files
committed
feat: add workspace repoInfo to context
1 parent 0397677 commit 4cc7541

File tree

5 files changed

+112
-59
lines changed

5 files changed

+112
-59
lines changed

src/services/codingServer.ts

Lines changed: 23 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -31,15 +31,14 @@ export default class CodingServer {
3131
const folders = await hx.workspace.getWorkspaceFolders();
3232

3333
if (!folders.length) {
34-
toast.warn('workspace 中没有目录');
3534
return;
3635
}
3736

3837
try {
3938
const remotes = await git.listRemotes({ fs, dir: folders[0].uri.path });
4039
return parseCloneUrl(remotes[0].url);
4140
} catch {
42-
toast.error('该目录没有进行 git 初始化');
41+
console.error('该目录没有进行 git 初始化');
4342
}
4443
}
4544

@@ -76,6 +75,11 @@ export default class CodingServer {
7675
sortDirection: `DESC`,
7776
},
7877
});
78+
79+
if (result.code) {
80+
return Promise.reject(result);
81+
}
82+
7983
return result?.data?.list || [];
8084
} catch (err) {
8185
console.error(err);
@@ -90,13 +94,17 @@ export default class CodingServer {
9094
headers: this.getHeaders(),
9195
});
9296

97+
if (result.code) {
98+
return Promise.reject(result);
99+
}
100+
93101
return result.data;
94102
} catch (err) {
95103
console.error(err);
96104
}
97105
}
98106

99-
async getDepotList(team: string = this._repo?.team, project: string = this._repo?.project) {
107+
async getDepotList(team: string, project: string = this._repo?.project) {
100108
// TODO: 使用新接口
101109
try {
102110
const result = await axios({
@@ -105,6 +113,10 @@ export default class CodingServer {
105113
headers: this.getHeaders(),
106114
});
107115

116+
if (result.code) {
117+
return Promise.reject(result);
118+
}
119+
108120
return result?.data?.depots || [];
109121
} catch (err) {
110122
console.error(err);
@@ -125,6 +137,10 @@ export default class CodingServer {
125137
},
126138
});
127139

140+
if (result.code) {
141+
return Promise.reject(result);
142+
}
143+
128144
return result.data;
129145
} catch (err) {
130146
console.error(err);
@@ -152,6 +168,10 @@ export default class CodingServer {
152168
}),
153169
});
154170

171+
if (result.code) {
172+
return Promise.reject(result);
173+
}
174+
155175
return result.data;
156176
} catch (err) {
157177
console.error(err);

src/trees/depotMR.ts

Lines changed: 76 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ import hx from 'hbuilderx';
22
import ACTIONS, { dispatch } from '../utils/actions';
33
import toast from '../utils/toast';
44
import { getMrListParams } from '../utils/mr';
5-
import { IDepot, IMRItem, IReviewer } from '../typings/common';
5+
import { IDepot, IMRItem, IReviewer, IRepoInfo } from '../typings/common';
66

77
interface IItem extends ITreeItem {
88
_create: boolean;
@@ -14,6 +14,14 @@ interface IItem extends ITreeItem {
1414

1515
type IElement = IDepot & IMRItem & IItem;
1616

17+
const LOGIN = [
18+
{
19+
name: '登录 CODING',
20+
_login: true,
21+
_isDepot: true,
22+
},
23+
];
24+
1725
const getCommand = (element: IElement) => {
1826
if (element.children || element._disabled) return '';
1927
if (element._login) return 'codingPlugin.login';
@@ -31,63 +39,84 @@ class DepotMRTreeDataProvider extends hx.TreeDataProvider {
3139
}
3240

3341
getRepoInfo() {
34-
const { selectedDepot, depots } = this.context;
35-
return getMrListParams(selectedDepot, depots, this.user);
42+
const { selectedDepot } = this.context;
43+
return getMrListParams(selectedDepot, this.user);
3644
}
3745

38-
async getChildren(element: IElement) {
46+
async getUser() {
3947
const { codingServer, token } = this.context;
40-
4148
if (!this.user) {
4249
this.user = await codingServer.getUserInfo(token);
50+
if (this.user) {
51+
dispatch(ACTIONS.SET_USER_INFO, {
52+
context: this.context,
53+
value: this.user,
54+
});
55+
}
4356
}
57+
return this.user;
58+
}
4459

45-
if (!this.user) {
46-
return Promise.resolve([
47-
{
48-
name: '登录 CODING',
49-
_login: true,
50-
_isDepot: true,
51-
},
52-
]);
60+
async getData(repoInfo?: IRepoInfo) {
61+
const { codingServer } = this.context;
62+
const promises = [codingServer.getDepotList(this.user.team)];
63+
if (repoInfo) {
64+
promises.push(codingServer.getMrList(repoInfo));
5365
}
5466

55-
dispatch(ACTIONS.SET_USER_INFO, {
67+
const [depots, list] = await Promise.all(promises);
68+
let createdList: IMRItem[] = [];
69+
let reviewerList: IMRItem[] = [];
70+
let others = [];
71+
if (list) {
72+
createdList = list.filter((item: IMRItem) => item.author.id === this.user.id);
73+
reviewerList = list.filter((item: IMRItem) =>
74+
item.reviewers.find((r: IReviewer) => r.reviewer.id === this.user.id),
75+
);
76+
others = list.filter((item: IMRItem) => {
77+
const isNotInCreatedList = createdList.findIndex((i) => i.id === item.id) === -1;
78+
const isNotInReviewerList = reviewerList.findIndex((i) => i.id === item.id) === -1;
79+
return isNotInCreatedList && isNotInReviewerList;
80+
});
81+
}
82+
83+
dispatch(ACTIONS.SET_DEPOTS, {
5684
context: this.context,
57-
value: this.user,
85+
value: depots,
5886
});
5987

88+
return {
89+
depots,
90+
MRList: [createdList, reviewerList, others],
91+
};
92+
}
93+
94+
async getChildren(element: IElement) {
95+
if (!this.user) {
96+
try {
97+
this.user = await this.getUser();
98+
} catch (err) {
99+
if (err.code === 1000) {
100+
return Promise.resolve(LOGIN);
101+
}
102+
}
103+
}
104+
105+
if (!this.user) {
106+
return Promise.resolve(LOGIN);
107+
}
108+
60109
if (element) {
61110
return Promise.resolve(element.children);
62111
}
63112

64-
const repoInfo = this.getRepoInfo();
65-
const promises = [this.context.codingServer.getDepotList()];
66-
if (repoInfo) {
67-
promises.push(this.context.codingServer.getMrList(repoInfo));
68-
}
113+
const repoInfo = await this.getRepoInfo();
69114

70115
try {
71-
const [depots, list] = await Promise.all(promises);
72-
let createdList: IMRItem[] = [];
73-
let reviewerList: IMRItem[] = [];
74-
let others = [];
75-
if (list) {
76-
createdList = list.filter((item: IMRItem) => item.author.id === this.user.id);
77-
reviewerList = list.filter((item: IMRItem) =>
78-
item.reviewers.find((r: IReviewer) => r.reviewer.id === this.user.id),
79-
);
80-
others = list.filter((item: IMRItem) => {
81-
const isNotInCreatedList = createdList.findIndex((i) => i.id === item.id) === -1;
82-
const isNotInReviewerList = reviewerList.findIndex((i) => i.id === item.id) === -1;
83-
return isNotInCreatedList && isNotInReviewerList;
84-
});
85-
}
86-
87-
dispatch(ACTIONS.SET_DEPOTS, {
88-
context: this.context,
89-
value: depots,
90-
});
116+
const {
117+
depots,
118+
MRList: [createdList, reviewerList, others],
119+
} = await this.getData(repoInfo);
91120

92121
return Promise.resolve([
93122
{
@@ -101,7 +130,7 @@ class DepotMRTreeDataProvider extends hx.TreeDataProvider {
101130
_isDepot: true,
102131
},
103132
{
104-
title: `合并请求列表(当前仓库 ${this.context.selectedDepot?.name || '-'})`,
133+
title: `合并请求列表(当前仓库${repoInfo?.repo || '-'})`,
105134
children: [
106135
{
107136
title: `我创建的 (${createdList?.length})`,
@@ -118,8 +147,12 @@ class DepotMRTreeDataProvider extends hx.TreeDataProvider {
118147
],
119148
},
120149
]);
121-
} catch {
122-
toast.error('获取数据失败');
150+
} catch (err) {
151+
const { code } = err;
152+
if (code === 1100 || code === 1400) {
153+
toast.error(`请登录 ${repoInfo?.repo} 代码仓库对应的服务`);
154+
return Promise.resolve(LOGIN);
155+
}
123156
}
124157
}
125158

src/trees/mr.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ class MRTreeDataProvider extends hx.TreeDataProvider {
2121
getRepoInfo() {
2222
const { selectedDepot, depots, codingServer } = this.context;
2323
const user = codingServer.session?.user;
24-
return getMrListParams(selectedDepot, depots, user);
24+
return getMrListParams(selectedDepot, user);
2525
}
2626

2727
getUser() {
@@ -37,7 +37,7 @@ class MRTreeDataProvider extends hx.TreeDataProvider {
3737
const user = this.getUser();
3838
const userId = user?.id;
3939

40-
const repoInfo = this.getRepoInfo();
40+
const repoInfo = await this.getRepoInfo();
4141

4242
if (!repoInfo) {
4343
return Promise.resolve([
@@ -56,7 +56,7 @@ class MRTreeDataProvider extends hx.TreeDataProvider {
5656

5757
return Promise.resolve([
5858
{
59-
title: `当前代码仓库:${repoInfo.repo}`,
59+
title: `当前代码仓库:${repoInfo?.repo}`,
6060
_disabled: true,
6161
},
6262
{

src/utils/axios.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,8 @@ const handleResponse = (response: any) => {
1212
if (result.code) {
1313
const message = formatErrorMessage(result.msg);
1414
toast.error(message);
15-
throw new Error(message);
15+
console.error(`${response.config.url}:`, result);
16+
return result;
1617
}
1718

1819
return result;

src/utils/mr.ts

Lines changed: 8 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,23 +1,22 @@
11
import hx from 'hbuilderx';
22
import os from 'os';
33
import { IRepoInfo, IDepot, IUserInfo } from '../typings/common';
4+
import CodingServer from '../services/codingServer';
45

5-
export const getMrListParams = (selectedDepot: IDepot, depots: IDepot[], user: IUserInfo): IRepoInfo | undefined => {
6-
const team = user?.team;
7-
let depot = selectedDepot;
6+
export const getMrListParams = async (selectedDepot: IDepot, user: IUserInfo): Promise<IRepoInfo | undefined> => {
7+
const team = user.team;
88

9-
if (!depot) {
10-
depot = depots?.[0];
11-
}
12-
13-
if (depot) {
14-
const { depotPath } = depot;
9+
if (selectedDepot) {
10+
const { depotPath } = selectedDepot;
1511
const matchRes = depotPath.match(/\/p\/([^/]+)\/d\/([^/]+)\//);
1612
if (matchRes) {
1713
const [, project, repo] = matchRes;
1814
return { team, project, repo };
1915
}
2016
}
17+
18+
const result = await CodingServer.getRepoParams();
19+
return result;
2120
};
2221

2322
export const getHostsPath = () => {

0 commit comments

Comments
 (0)