Skip to content
代码片段 群组 项目
提交 79ebf7dd 编辑于 作者: Raymond Liao's avatar Raymond Liao :nerd: 提交者: Neil Wang
浏览文件

fix: #657 粘贴 issue 和 mr url 无法跳转

上级 63bf4405
No related branches found
No related tags found
无相关合并请求
import 'package:flutter/material.dart';
import 'package:jihu_gitlab_app/core/clipboard.dart';
import 'package:jihu_gitlab_app/core/id.dart';
import 'package:jihu_gitlab_app/core/net/http_client.dart';
import 'package:jihu_gitlab_app/core/string_extension.dart';
import 'package:jihu_gitlab_app/core/user_provider/user_provider.dart';
import 'package:jihu_gitlab_app/core/widgets/toast.dart';
import 'package:jihu_gitlab_app/l10n/jihu_localizations.dart';
import 'package:jihu_gitlab_app/modules/issues/details/issue_details_page.dart';
import 'package:provider/provider.dart';
class PasteTypeIssueNavigation extends StatefulWidget {
final Widget child;
const PasteTypeIssueNavigation({super.key, required this.child});
@override
State<PasteTypeIssueNavigation> createState() => _PasteTypeIssueNavigationState();
}
class _PasteTypeIssueNavigationState extends State<PasteTypeIssueNavigation> {
final PasteTypeIssueNavigationModel _model = PasteTypeIssueNavigationModel();
@override
Widget build(BuildContext context) {
return Consumer<ConnectionProvider>(builder: (context, _, child) {
if (!ConnectionProvider.authorized) return Container();
return InkWell(
radius: 0.0,
child: widget.child,
onTap: () {
Clipboard().fromClipboard().then((value) {
_model.parseAndToward(value, context);
});
},
);
});
}
}
class PasteTypeIssueNavigationModel {
void parseAndToward(String value, BuildContext context) {
try {
var url = value.urls[0];
var host = ConnectionProvider.currentBaseUrl.get;
var urlWithoutHost = url.replaceFirst('$host/', '');
var projectFullPath = urlWithoutHost.split('/-/issues/')[0];
RegExp reg = RegExp('\\d+');
var issueIid = int.parse(reg.firstMatch(urlWithoutHost.split('/-/issues')[1])?[0] ?? '0');
HttpClient.instance().post('/api/graphql', {
"query": "query getIssue(\$fullPath: ID!, \$iid: String!) {\n project(fullPath: \$fullPath) {\n id\n nameWithNamespace\n issue(iid: \$iid) {\n id\n iid\n }\n }\n}\n",
"variables": {"fullPath": projectFullPath, "iid": "$issueIid"},
"operationName": "getIssue"
}).then((res) {
final params = <String, dynamic>{
'projectId': Id.fromGid(res.body()['data']['project']['id']).id,
'issueId': Id.fromGid(res.body()['data']['project']['issue']['id']).id,
'issueIid': int.parse(res.body()['data']['project']['issue']['iid']),
'targetId': Id.fromGid(res.body()['data']['project']['issue']['id']).id,
'targetIid': int.parse(res.body()['data']['project']['issue']['iid']),
'pathWithNamespace': res.body()['data']['project']['nameWithNamespace'],
'targetUrl': url,
'showLeading': true
};
Navigator.pushNamed(context, IssueDetailsPage.routeName, arguments: params);
});
} catch (e) {
debugPrint('Url parse error: $e');
Toast.error(context, JiHuLocalizations.dictionary().unrecognized_url);
}
}
}
......@@ -43,7 +43,7 @@ class PasteTypeUrlNavigationModel {
void parseAndToward(String value, BuildContext context) {
try {
var url = value.urls[0];
var host = ConnectionProvider.connection!.baseUrl;
String host = ConnectionProvider.connection!.baseUrl.get;
var urlWithoutHost = url.replaceFirst('$host/', '');
var projectFullPath = urlWithoutHost.split('/-/')[0];
RegExp reg = RegExp('\\d+');
......
......@@ -71,7 +71,21 @@ void main() {
when(client.get<Map<String, dynamic>>("/api/v4/projects/72936")).thenAnswer((_) => Future(() => Response.of<Map<String, dynamic>>({})));
when(client.get<Map<String, dynamic>>("/api/v4/projects/72936/issues/6")).thenAnswer((_) => Future(() => Response.of<Map<String, dynamic>>({})));
when(client.get<List<dynamic>>("/api/v4/projects/72936/labels")).thenAnswer((_) async => Future.value(Response.of<List<dynamic>>([])));
when(client.post('/api/graphql', any)).thenAnswer((_) => Future(() => Response.of<Map<String, dynamic>>({
when(client.post('/api/graphql', {
"variables": {"fullPath": 'ultimate-plan/jihu-gitlab-app/jihu-gitlab-app', "iid": "531"},
"query": """
query (\$fullPath: ID!, \$iid: String!) {
project(fullPath: \$fullPath) {
id
nameWithNamespace
issue(iid: \$iid) {
id
iid
}
}
}
""",
})).thenAnswer((_) => Future(() => Response.of<Map<String, dynamic>>({
"data": {
"project": {
"id": "gid://gitlab/Project/59893",
......@@ -173,5 +187,6 @@ void main() {
tearDown(() {
ConnectionProvider().fullReset();
reset(client);
});
}
0% 加载中 .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册