feat(gitlab): members screen

This commit is contained in:
Rongjian Zhang 2020-02-01 12:14:03 +08:00
parent b56111db6f
commit d1d2e9e0fb
6 changed files with 72 additions and 1 deletions

View File

@ -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,

View File

@ -10,6 +10,7 @@ class GitlabUser {
String avatarUrl;
String bio;
DateTime createdAt;
int accessLevel;
GitlabUser();
factory GitlabUser.fromJson(Map<String, dynamic> json) =>
_$GitlabUserFromJson(json);

View File

@ -15,7 +15,8 @@ GitlabUser _$GitlabUserFromJson(Map<String, dynamic> 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<String, dynamic> _$GitlabUserToJson(GitlabUser instance) =>
@ -26,6 +27,7 @@ Map<String, dynamic> _$GitlabUserToJson(GitlabUser instance) =>
'avatar_url': instance.avatarUrl,
'bio': instance.bio,
'created_at': instance.createdAt?.toIso8601String(),
'access_level': instance.accessLevel,
};
GitlabGroup _$GitlabGroupFromJson(Map<String, dynamic> json) {

View File

@ -51,6 +51,7 @@ class GitlabGroupScreen extends StatelessWidget {
EntryItem(
count: data.item2,
text: 'Members',
url: '/gitlab/groups/$id/members',
),
]),
CommonStyle.border,

View File

@ -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<ListPayload<GitlabUser, int>> _query(BuildContext context,
[int page = 1]) async {
final auth = Provider.of<AuthModel>(context);
final res = await auth.fetchGitlabWithPage('/$type/$id/members?page=$page');
return ListPayload(
cursor: res.cursor,
hasMore: res.hasMore,
items: <GitlabUser>[
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<GitlabUser, int>(
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}',
);
},
);
}
}

View File

@ -96,6 +96,7 @@ class GitlabProjectScreen extends StatelessWidget {
EntryItem(
count: t.item4,
text: 'Members',
url: '/gitlab/projects/$id/members',
),
EntryItem(
count: p.starCount,