From d9ca01b99d515eb7815ba17b610714e6f25f5b58 Mon Sep 17 00:00:00 2001 From: Rongjian Zhang Date: Sat, 17 Oct 2020 20:46:47 +0800 Subject: [PATCH] feat(gitee): commits screen --- lib/models/auth.dart | 7 +++-- lib/models/gitee.dart | 31 ++++++++++++++++++++++ lib/models/gitee.g.dart | 53 +++++++++++++++++++++++++++++++++++++ lib/router.dart | 6 +++++ lib/screens/ge_commits.dart | 41 ++++++++++++++++++++++++++++ lib/screens/ge_repos.dart | 6 ++--- 6 files changed, 139 insertions(+), 5 deletions(-) create mode 100644 lib/screens/ge_commits.dart diff --git a/lib/models/auth.dart b/lib/models/auth.dart index 8e0b3ad..b407949 100644 --- a/lib/models/auth.dart +++ b/lib/models/auth.dart @@ -282,11 +282,14 @@ class AuthModel with ChangeNotifier { final res = await http.get(uri, headers: {'Authorization': 'token $token'}); final info = json.decode(utf8.decode(res.bodyBytes)); + final totalPage = int.tryParse(res.headers['total_page'] ?? ''); + final totalCount = int.tryParse(res.headers['total_count'] ?? ''); + return DataWithPage( data: info, cursor: page + 1, - hasMore: int.tryParse(res.headers['total_page']) > page, - total: int.tryParse(res.headers['total_count'] ?? ''), + hasMore: totalPage == null ? info.length > limit : totalPage > page, + total: totalCount, ); } diff --git a/lib/models/gitee.dart b/lib/models/gitee.dart index 51db8c9..f08ed41 100644 --- a/lib/models/gitee.dart +++ b/lib/models/gitee.dart @@ -71,3 +71,34 @@ class GiteeRepoNamespace { factory GiteeRepoNamespace.fromJson(Map json) => _$GiteeRepoNamespaceFromJson(json); } + +@JsonSerializable(fieldRename: FieldRename.snake) +class GiteeCommit { + GiteeUser author; + GiteeCommitDetail commit; + String sha; + String htmlUrl; + GiteeCommit(); + factory GiteeCommit.fromJson(Map json) => + _$GiteeCommitFromJson(json); +} + +@JsonSerializable(fieldRename: FieldRename.snake) +class GiteeCommitDetail { + String message; + GiteeCommitAuthor author; + GiteeCommitAuthor committer; + GiteeCommitDetail(); + factory GiteeCommitDetail.fromJson(Map json) => + _$GiteeCommitDetailFromJson(json); +} + +@JsonSerializable(fieldRename: FieldRename.snake) +class GiteeCommitAuthor { + String name; + String email; + DateTime date; + GiteeCommitAuthor(); + factory GiteeCommitAuthor.fromJson(Map json) => + _$GiteeCommitAuthorFromJson(json); +} diff --git a/lib/models/gitee.g.dart b/lib/models/gitee.g.dart index aec40c9..16b5eb1 100644 --- a/lib/models/gitee.g.dart +++ b/lib/models/gitee.g.dart @@ -120,3 +120,56 @@ Map _$GiteeRepoNamespaceToJson(GiteeRepoNamespace instance) => { 'path': instance.path, }; + +GiteeCommit _$GiteeCommitFromJson(Map json) { + return GiteeCommit() + ..author = json['author'] == null + ? null + : GiteeUser.fromJson(json['author'] as Map) + ..commit = json['commit'] == null + ? null + : GiteeCommitDetail.fromJson(json['commit'] as Map) + ..sha = json['sha'] as String + ..htmlUrl = json['html_url'] as String; +} + +Map _$GiteeCommitToJson(GiteeCommit instance) => + { + 'author': instance.author, + 'commit': instance.commit, + 'sha': instance.sha, + 'html_url': instance.htmlUrl, + }; + +GiteeCommitDetail _$GiteeCommitDetailFromJson(Map json) { + return GiteeCommitDetail() + ..message = json['message'] as String + ..author = json['author'] == null + ? null + : GiteeCommitAuthor.fromJson(json['author'] as Map) + ..committer = json['committer'] == null + ? null + : GiteeCommitAuthor.fromJson(json['committer'] as Map); +} + +Map _$GiteeCommitDetailToJson(GiteeCommitDetail instance) => + { + 'message': instance.message, + 'author': instance.author, + 'committer': instance.committer, + }; + +GiteeCommitAuthor _$GiteeCommitAuthorFromJson(Map json) { + return GiteeCommitAuthor() + ..name = json['name'] as String + ..email = json['email'] as String + ..date = + json['date'] == null ? null : DateTime.parse(json['date'] as String); +} + +Map _$GiteeCommitAuthorToJson(GiteeCommitAuthor instance) => + { + 'name': instance.name, + 'email': instance.email, + 'date': instance.date?.toIso8601String(), + }; diff --git a/lib/router.dart b/lib/router.dart index 48e2705..5b21326 100644 --- a/lib/router.dart +++ b/lib/router.dart @@ -6,6 +6,7 @@ import 'package:git_touch/screens/bb_issues.dart'; import 'package:git_touch/screens/bb_pulls.dart'; import 'package:git_touch/screens/bb_user.dart'; import 'package:git_touch/screens/code_theme.dart'; +import 'package:git_touch/screens/ge_commits.dart'; import 'package:git_touch/screens/ge_repo.dart'; import 'package:git_touch/screens/ge_repos.dart'; import 'package:git_touch/screens/ge_user.dart'; @@ -384,6 +385,7 @@ class GiteeRouter { GiteeRouter.stargazers, GiteeRouter.watchers, GiteeRouter.forks, + GiteeRouter.commits, ]; static final user = RouterScreen('/:login', (context, p) { final login = p['login'].first; @@ -416,4 +418,8 @@ class GiteeRouter { static final forks = RouterScreen('/:owner/:name/forks', (_, p) { return GeReposScreen.forks(p['owner'].first, p['name'].first); }); + static final commits = RouterScreen( + '/:owner/:name/commits', + (_, p) => GeCommitsScreen(p['owner'].first, p['name'].first), + ); } diff --git a/lib/screens/ge_commits.dart b/lib/screens/ge_commits.dart new file mode 100644 index 0000000..4678ecc --- /dev/null +++ b/lib/screens/ge_commits.dart @@ -0,0 +1,41 @@ +import 'package:flutter/material.dart'; +import 'package:git_touch/models/auth.dart'; +import 'package:git_touch/models/gitee.dart'; +import 'package:git_touch/scaffolds/list_stateful.dart'; +import 'package:git_touch/widgets/app_bar_title.dart'; +import 'package:git_touch/widgets/commit_item.dart'; +import 'package:provider/provider.dart'; + +class GeCommitsScreen extends StatelessWidget { + final String owner; + final String name; + // final String branch; // TODO: + GeCommitsScreen(this.owner, this.name); + + @override + Widget build(BuildContext context) { + return ListStatefulScaffold( + title: AppBarTitle('Commits'), + fetch: (page) async { + final res = await context + .read() + .fetchGiteeWithPage('/repos/$owner/$name/commits', page: page); + return ListPayload( + cursor: res.cursor, + hasMore: res.hasMore, + items: [for (var v in res.data) GiteeCommit.fromJson(v)], + ); + }, + itemBuilder: (c) { + return CommitItem( + author: c.commit.author.name, + avatarUrl: c.author.avatarUrl, + avatarLink: '/gitee/${c.author.login}', + createdAt: c.commit.author.date, + message: c.commit.message, + url: c.htmlUrl, + ); + }, + ); + } +} diff --git a/lib/screens/ge_repos.dart b/lib/screens/ge_repos.dart index 21d2375..5aa7994 100644 --- a/lib/screens/ge_repos.dart +++ b/lib/screens/ge_repos.dart @@ -36,15 +36,15 @@ class GeReposScreen extends StatelessWidget { }, itemBuilder: (v) { return RepositoryItem( - owner: v.owner.login, + owner: v.namespace.path, avatarUrl: v.owner.avatarUrl, name: v.path, description: v.description, starCount: v.stargazersCount, forkCount: v.forksCount, note: 'Updated ${timeago.format(v.updatedAt)}', - url: '/gitea/${v.owner.login}/${v.path}', - avatarLink: '/gitea/${v.owner.login}', + url: '/gitea/${v.namespace.path}/${v.path}', + avatarLink: '/gitea/${v.namespace.path}', ); }, );