Skip to content

Commit a105eb6

Browse files
committed
feat(gh): org repos screen
related: #25
1 parent 8159b9e commit a105eb6

File tree

4 files changed

+79
-19
lines changed

4 files changed

+79
-19
lines changed

lib/router.dart

+3
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import 'package:git_touch/screens/bb_repo.dart';
55
import 'package:git_touch/screens/bb_user.dart';
66
import 'package:git_touch/screens/code_theme.dart';
77
import 'package:git_touch/screens/gh_commits.dart';
8+
import 'package:git_touch/screens/gh_org_repos.dart';
89
import 'package:git_touch/screens/gt_commits.dart';
910
import 'package:git_touch/screens/gt_issues.dart';
1011
import 'package:git_touch/screens/gt_object.dart';
@@ -83,6 +84,8 @@ class GithubRouter {
8384
return GhReposScreen.stars(login);
8485
case 'repositories':
8586
return GhReposScreen(login);
87+
case 'orgrepo':
88+
return GhOrgReposScreen(login);
8689
default:
8790
return GhUserScreen(login);
8891
}

lib/screens/gh_org_repos.dart

+56
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
import 'package:flutter/material.dart';
2+
import 'package:git_touch/models/auth.dart';
3+
import 'package:git_touch/scaffolds/list_stateful.dart';
4+
import 'package:git_touch/widgets/app_bar_title.dart';
5+
import 'package:git_touch/widgets/repository_item.dart';
6+
import 'package:provider/provider.dart';
7+
import 'package:github/github.dart';
8+
import 'package:timeago/timeago.dart' as timeago;
9+
10+
/// There are some restrictions of organization repos with OAuth
11+
///
12+
/// https://help.github.com/en/github/setting-up-and-managing-organizations-and-teams/restricting-access-to-your-organizations-data
13+
///
14+
/// So we use RESTful API here for repos of org
15+
class GhOrgReposScreen extends StatelessWidget {
16+
final String owner;
17+
GhOrgReposScreen(this.owner);
18+
19+
Future<ListPayload<Repository, int>> _query(BuildContext context,
20+
[int page = 1]) async {
21+
final auth = Provider.of<AuthModel>(context);
22+
final rs = await auth.ghClient.getJSON<List, List<Repository>>(
23+
'/orgs/$owner/repos?sort=updated&page=$page',
24+
convert: (vs) => [for (var v in vs) Repository.fromJson(v)],
25+
);
26+
return ListPayload(
27+
cursor: page + 1,
28+
items: rs,
29+
hasMore: rs.isNotEmpty, // TODO:
30+
);
31+
}
32+
33+
@override
34+
Widget build(BuildContext context) {
35+
return ListStatefulScaffold<Repository, int>(
36+
title: AppBarTitle('Repositories'),
37+
onRefresh: () => _query(context),
38+
onLoadMore: (cursor) => _query(context, cursor),
39+
itemBuilder: (v) {
40+
return RepositoryItem.gh(
41+
owner: v.owner.login,
42+
avatarUrl: v.owner.avatarUrl,
43+
name: v.name,
44+
description: v.description,
45+
starCount: v.stargazersCount,
46+
forkCount: v.forksCount,
47+
primaryLanguageName: v.language,
48+
primaryLanguageColor: null,
49+
note: 'Updated ${timeago.format(v.updatedAt)}',
50+
isPrivate: v.isPrivate,
51+
isFork: v.isFork,
52+
);
53+
},
54+
);
55+
}
56+
}

lib/screens/gh_repos.dart

+19-18
Original file line numberDiff line numberDiff line change
@@ -44,23 +44,24 @@ class GhReposScreen extends StatelessWidget {
4444
@override
4545
Widget build(BuildContext context) {
4646
return ListStatefulScaffold<GhReposRepository, String>(
47-
title: AppBarTitle(title),
48-
onRefresh: () => _query(context),
49-
onLoadMore: (cursor) => _query(context, cursor),
50-
itemBuilder: (v) {
51-
return RepositoryItem.gh(
52-
owner: v.owner.login,
53-
avatarUrl: v.owner.avatarUrl,
54-
name: v.name,
55-
description: v.description,
56-
starCount: v.stargazers.totalCount,
57-
forkCount: v.forks.totalCount,
58-
primaryLanguageName: v.primaryLanguage?.name,
59-
primaryLanguageColor: v.primaryLanguage?.color,
60-
note: 'Updated ${timeago.format(v.updatedAt)}',
61-
isPrivate: v.isPrivate,
62-
isFork: v.isFork,
63-
);
64-
});
47+
title: AppBarTitle(title),
48+
onRefresh: () => _query(context),
49+
onLoadMore: (cursor) => _query(context, cursor),
50+
itemBuilder: (v) {
51+
return RepositoryItem.gh(
52+
owner: v.owner.login,
53+
avatarUrl: v.owner.avatarUrl,
54+
name: v.name,
55+
description: v.description,
56+
starCount: v.stargazers.totalCount,
57+
forkCount: v.forks.totalCount,
58+
primaryLanguageName: v.primaryLanguage?.name,
59+
primaryLanguageColor: v.primaryLanguage?.color,
60+
note: 'Updated ${timeago.format(v.updatedAt)}',
61+
isPrivate: v.isPrivate,
62+
isFork: v.isFork,
63+
);
64+
},
65+
);
6566
}
6667
}

lib/screens/gh_user.dart

+1-1
Original file line numberDiff line numberDiff line change
@@ -237,7 +237,7 @@ class GhUserScreen extends StatelessWidget {
237237
EntryItem(
238238
count: p.pinnableItems.totalCount,
239239
text: 'Repositories',
240-
url: '/${p.login}?tab=repositories',
240+
url: '/${p.login}?tab=orgrepo',
241241
),
242242
EntryItem(
243243
count: p.membersWithRole.totalCount,

0 commit comments

Comments
 (0)