diff --git a/lib/models/auth.dart b/lib/models/auth.dart index 68c48ee..4435cf6 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 0000000..47022ec --- /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 0000000..a4666be --- /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 2064835..1f0377e 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(