diff --git a/lib/models/gitlab.dart b/lib/models/gitlab.dart index e8ccdaa..efb6f12 100644 --- a/lib/models/gitlab.dart +++ b/lib/models/gitlab.dart @@ -201,3 +201,12 @@ class GitlabIssue { factory GitlabIssue.fromJson(Map json) => _$GitlabIssueFromJson(json); } + +@JsonSerializable(fieldRename: FieldRename.snake) +class GitlabStarrer { + DateTime starredSince; + GitlabUser user; + GitlabStarrer(); + factory GitlabStarrer.fromJson(Map json) => + _$GitlabStarrerFromJson(json); +} diff --git a/lib/models/gitlab.g.dart b/lib/models/gitlab.g.dart index d8a33c8..5192722 100644 --- a/lib/models/gitlab.g.dart +++ b/lib/models/gitlab.g.dart @@ -348,3 +348,19 @@ Map _$GitlabIssueToJson(GitlabIssue instance) => 'updated_at': instance.updatedAt?.toIso8601String(), 'labels': instance.labels, }; + +GitlabStarrer _$GitlabStarrerFromJson(Map json) { + return GitlabStarrer() + ..starredSince = json['starred_since'] == null + ? null + : DateTime.parse(json['starred_since'] as String) + ..user = json['user'] == null + ? null + : GitlabUser.fromJson(json['user'] as Map); +} + +Map _$GitlabStarrerToJson(GitlabStarrer instance) => + { + 'starred_since': instance.starredSince?.toIso8601String(), + 'user': instance.user, + }; diff --git a/lib/router.dart b/lib/router.dart index ebab84c..2490eea 100644 --- a/lib/router.dart +++ b/lib/router.dart @@ -7,6 +7,7 @@ import 'package:git_touch/screens/code_theme.dart'; import 'package:git_touch/screens/gh_commits.dart'; import 'package:git_touch/screens/gh_org_repos.dart'; import 'package:git_touch/screens/gl_commit.dart'; +import 'package:git_touch/screens/gl_starrers.dart'; import 'package:git_touch/screens/gt_commits.dart'; import 'package:git_touch/screens/gt_issues.dart'; import 'package:git_touch/screens/gt_object.dart'; @@ -144,6 +145,7 @@ class GitlabRouter { GitlabRouter.blob, GitlabRouter.tree, GitlabRouter.project, + GitlabRouter.starrers, GitlabRouter.issues, GitlabRouter.mergeRequests, GitlabRouter.commits, @@ -168,6 +170,8 @@ class GitlabRouter { path: params['path']?.first)); static final project = RouterScreen('/projects/:id', (context, params) => GlProjectScreen(int.parse(params['id'].first))); + static final starrers = RouterScreen('/projects/:id/starrers', + (context, params) => GlStarrersScreen(int.parse(params['id'].first))); static final issues = RouterScreen( '/projects/:id/issues', (context, params) => GlIssuesScreen( diff --git a/lib/screens/gl_project.dart b/lib/screens/gl_project.dart index d07a8de..66271b5 100644 --- a/lib/screens/gl_project.dart +++ b/lib/screens/gl_project.dart @@ -96,6 +96,7 @@ class GlProjectScreen extends StatelessWidget { EntryItem( count: p.starCount, text: 'Stars', + url: '/gitlab/projects/$id/starrers', ), EntryItem( count: p.forksCount, diff --git a/lib/screens/gl_starrers.dart b/lib/screens/gl_starrers.dart new file mode 100644 index 0000000..dcabf49 --- /dev/null +++ b/lib/screens/gl_starrers.dart @@ -0,0 +1,44 @@ +import 'package:flutter/material.dart'; +import 'package:git_touch/models/auth.dart'; +import 'package:git_touch/models/gitlab.dart'; +import 'package:git_touch/scaffolds/list_stateful.dart'; +import 'package:git_touch/widgets/app_bar_title.dart'; +import 'package:git_touch/widgets/user_item.dart'; +import 'package:provider/provider.dart'; +import 'package:timeago/timeago.dart' as timeago; + +class GlStarrersScreen extends StatelessWidget { + final int id; + GlStarrersScreen(this.id); + + Future> _query(BuildContext context, + [int page = 1]) async { + final auth = Provider.of(context); + final res = + await auth.fetchGitlabWithPage('/projects/$id/starrers?page=$page'); + return ListPayload( + cursor: res.cursor, + hasMore: res.hasMore, + items: [ + for (var v in res.data) GitlabStarrer.fromJson(v), + ], + ); + } + + @override + Widget build(BuildContext context) { + return ListStatefulScaffold( + title: AppBarTitle('Members'), + onRefresh: () => _query(context), + onLoadMore: (page) => _query(context, page), + itemBuilder: (v) { + return UserItem( + avatarUrl: v.user.avatarUrl, + login: v.user.username, + bio: Text('Starred ' + timeago.format(v.starredSince)), + url: '/gitlab/user/${v.user.id}', + ); + }, + ); + } +}