From d1d2e9e0fbe60d6ba5894cc26fac141a3ec11562 Mon Sep 17 00:00:00 2001 From: Rongjian Zhang Date: Sat, 1 Feb 2020 12:14:03 +0800 Subject: [PATCH] feat(gitlab): members screen --- lib/main.dart | 3 ++ lib/models/gitlab.dart | 1 + lib/models/gitlab.g.dart | 4 ++- lib/screens/gitlab_group.dart | 1 + lib/screens/gitlab_members.dart | 63 +++++++++++++++++++++++++++++++++ lib/screens/gitlab_project.dart | 1 + 6 files changed, 72 insertions(+), 1 deletion(-) create mode 100644 lib/screens/gitlab_members.dart diff --git a/lib/main.dart b/lib/main.dart index f08b5fb..9758985 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -15,6 +15,7 @@ import 'package:git_touch/screens/gitlab_commits.dart'; import 'package:git_touch/screens/gitlab_group.dart'; import 'package:git_touch/screens/gitlab_issue.dart'; import 'package:git_touch/screens/gitlab_issues.dart'; +import 'package:git_touch/screens/gitlab_members.dart'; import 'package:git_touch/screens/gitlab_merge_requests.dart'; import 'package:git_touch/screens/gitlab_project.dart'; import 'package:git_touch/screens/gitlab_tree.dart'; @@ -79,6 +80,8 @@ void main() async { gitlabIssuesRouter, gitlabMergeRequestsRouter, gitlabCommitsRouter, + gitlabProjectMembersRouter, + gitlabGroupMembersRouter, giteaUserRouter, giteaRepoRouter, giteaObjectRouter, diff --git a/lib/models/gitlab.dart b/lib/models/gitlab.dart index 5309aa2..096e25b 100644 --- a/lib/models/gitlab.dart +++ b/lib/models/gitlab.dart @@ -10,6 +10,7 @@ class GitlabUser { String avatarUrl; String bio; DateTime createdAt; + int accessLevel; GitlabUser(); factory GitlabUser.fromJson(Map json) => _$GitlabUserFromJson(json); diff --git a/lib/models/gitlab.g.dart b/lib/models/gitlab.g.dart index cd9f83f..32aac01 100644 --- a/lib/models/gitlab.g.dart +++ b/lib/models/gitlab.g.dart @@ -15,7 +15,8 @@ GitlabUser _$GitlabUserFromJson(Map json) { ..bio = json['bio'] as String ..createdAt = json['created_at'] == null ? null - : DateTime.parse(json['created_at'] as String); + : DateTime.parse(json['created_at'] as String) + ..accessLevel = json['access_level'] as int; } Map _$GitlabUserToJson(GitlabUser instance) => @@ -26,6 +27,7 @@ Map _$GitlabUserToJson(GitlabUser instance) => 'avatar_url': instance.avatarUrl, 'bio': instance.bio, 'created_at': instance.createdAt?.toIso8601String(), + 'access_level': instance.accessLevel, }; GitlabGroup _$GitlabGroupFromJson(Map json) { diff --git a/lib/screens/gitlab_group.dart b/lib/screens/gitlab_group.dart index f2e96b0..e33f1db 100644 --- a/lib/screens/gitlab_group.dart +++ b/lib/screens/gitlab_group.dart @@ -51,6 +51,7 @@ class GitlabGroupScreen extends StatelessWidget { EntryItem( count: data.item2, text: 'Members', + url: '/gitlab/groups/$id/members', ), ]), CommonStyle.border, diff --git a/lib/screens/gitlab_members.dart b/lib/screens/gitlab_members.dart new file mode 100644 index 0000000..5476dad --- /dev/null +++ b/lib/screens/gitlab_members.dart @@ -0,0 +1,63 @@ +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/utils/utils.dart'; +import 'package:git_touch/widgets/app_bar_title.dart'; +import 'package:git_touch/widgets/user_item.dart'; +import 'package:provider/provider.dart'; + +final gitlabProjectMembersRouter = RouterScreen( + '/gitlab/projects/:id/members', + (context, parameters) => + GitlabMembers(int.parse(parameters['id'].first), 'projects')); + +final gitlabGroupMembersRouter = RouterScreen( + '/gitlab/groups/:id/members', + (context, parameters) => + GitlabMembers(int.parse(parameters['id'].first), 'groups')); + +class GitlabMembers extends StatelessWidget { + final int id; + final String type; + GitlabMembers(this.id, this.type); + + Future> _query(BuildContext context, + [int page = 1]) async { + final auth = Provider.of(context); + final res = await auth.fetchGitlabWithPage('/$type/$id/members?page=$page'); + return ListPayload( + cursor: res.cursor, + hasMore: res.hasMore, + items: [ + for (var v in res.data) GitlabUser.fromJson(v), + ], + ); + } + + // https://docs.gitlab.com/ee/api/access_requests.html#valid-access-levels + static const accessLevelMap = { + 10: 'Guest', + 20: 'Reporter', + 30: 'Developer', + 40: 'Maintainer', + 50: 'Owner', + }; + + @override + Widget build(BuildContext context) { + return ListStatefulScaffold( + title: AppBarTitle('Members'), + onRefresh: () => _query(context), + onLoadMore: (page) => _query(context, page), + itemBuilder: (v) { + return UserItem( + avatarUrl: v.avatarUrl, + login: v.username, + bio: Text(accessLevelMap[v.accessLevel] ?? ''), + url: '/gitlab/user/${v.id}', + ); + }, + ); + } +} diff --git a/lib/screens/gitlab_project.dart b/lib/screens/gitlab_project.dart index 7bf39d0..a80b7e0 100644 --- a/lib/screens/gitlab_project.dart +++ b/lib/screens/gitlab_project.dart @@ -96,6 +96,7 @@ class GitlabProjectScreen extends StatelessWidget { EntryItem( count: t.item4, text: 'Members', + url: '/gitlab/projects/$id/members', ), EntryItem( count: p.starCount,