From f480dc048e8a7a6d1ec057009e19b0cf0389ca9c Mon Sep 17 00:00:00 2001 From: Rongjian Zhang Date: Wed, 14 Oct 2020 00:43:11 +0800 Subject: [PATCH] feat(gitee): add token login step --- lib/models/auth.dart | 28 ++++++++++++++++++++++++++++ lib/models/gitee.dart | 12 ++++++++++++ lib/models/gitee.g.dart | 18 ++++++++++++++++++ lib/screens/login.dart | 18 ++++++++++++++++++ 4 files changed, 76 insertions(+) create mode 100644 lib/models/gitee.dart create mode 100644 lib/models/gitee.g.dart diff --git a/lib/models/auth.dart b/lib/models/auth.dart index 68c48ee8..4435cf6e 100644 --- a/lib/models/auth.dart +++ b/lib/models/auth.dart @@ -3,6 +3,7 @@ import 'dart:convert'; import 'dart:async'; import 'package:git_touch/models/bitbucket.dart'; import 'package:git_touch/models/gitea.dart'; +import 'package:git_touch/models/gitee.dart'; import 'package:git_touch/utils/request_serilizer.dart'; import 'package:github/github.dart'; import 'package:gql_http_link/gql_http_link.dart'; @@ -26,6 +27,7 @@ class PlatformType { static const gitlab = 'gitlab'; static const bitbucket = 'bitbucket'; static const gitea = 'gitea'; + static const gitee = 'gitee'; } class DataWithPage { @@ -314,6 +316,32 @@ class AuthModel with ChangeNotifier { ); } + Future loginToGitee(String token) async { + token = token.trim(); + try { + loading = true; + notifyListeners(); + final res = await http.get('https://gitee.com/api/v5/user', + headers: {'Authorization': 'token $token'}); + final info = json.decode(res.body); + if (info['message'] != null) { + throw info['message']; + } + final user = GiteeUser.fromJson(info); + + await _addAccount(Account( + platform: PlatformType.gitea, + domain: 'https://gitee.com', + token: token, + login: user.login, + avatarUrl: user.avatarUrl, + )); + } finally { + loading = false; + notifyListeners(); + } + } + Future init() async { // Listen scheme _sub = getUriLinksStream().listen(_onSchemeDetected, onError: (err) { diff --git a/lib/models/gitee.dart b/lib/models/gitee.dart new file mode 100644 index 00000000..47022ec0 --- /dev/null +++ b/lib/models/gitee.dart @@ -0,0 +1,12 @@ +import 'package:json_annotation/json_annotation.dart'; + +part 'gitee.g.dart'; + +@JsonSerializable(fieldRename: FieldRename.snake) +class GiteeUser { + String login; + String avatarUrl; + GiteeUser(); + factory GiteeUser.fromJson(Map json) => + _$GiteeUserFromJson(json); +} diff --git a/lib/models/gitee.g.dart b/lib/models/gitee.g.dart new file mode 100644 index 00000000..a4666be2 --- /dev/null +++ b/lib/models/gitee.g.dart @@ -0,0 +1,18 @@ +// GENERATED CODE - DO NOT MODIFY BY HAND + +part of 'gitee.dart'; + +// ************************************************************************** +// JsonSerializableGenerator +// ************************************************************************** + +GiteeUser _$GiteeUserFromJson(Map json) { + return GiteeUser() + ..login = json['login'] as String + ..avatarUrl = json['avatar_url'] as String; +} + +Map _$GiteeUserToJson(GiteeUser instance) => { + 'login': instance.login, + 'avatar_url': instance.avatarUrl, + }; diff --git a/lib/screens/login.dart b/lib/screens/login.dart index 20648354..1f0377e2 100644 --- a/lib/screens/login.dart +++ b/lib/screens/login.dart @@ -293,6 +293,24 @@ class _LoginScreenState extends State { } }, ), + _buildAddItem( + text: 'Gitee Account', + brand: Octicons.git_branch, // TODO: brand icon + onTap: () async { + final result = await theme.showConfirm( + context, + _buildPopup(context), + ); + if (result == true) { + try { + await auth.loginToGitee(_tokenController.text); + _tokenController.clear(); + } catch (err) { + showError(err); + } + } + }, + ), Container( padding: CommonStyle.padding, child: Text(