Skip to content

Commit 66ab665

Browse files
committed
feat(gitee): repo screen
1 parent a5d64fd commit 66ab665

File tree

6 files changed

+171
-5
lines changed

6 files changed

+171
-5
lines changed

lib/models/gitee.dart

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@ class GiteeListUser {
3434

3535
@JsonSerializable(fieldRename: FieldRename.snake)
3636
class GiteeRepo {
37+
GiteeRepoNamespace namespace;
3738
GiteeRepoOwner owner;
3839
String path;
3940
String description;
@@ -45,6 +46,10 @@ class GiteeRepo {
4546
int stargazersCount;
4647
int watchersCount;
4748
DateTime updatedAt;
49+
String license;
50+
String homepage;
51+
int openIssuesCount;
52+
bool pullRequestsEnabled;
4853
GiteeRepo();
4954
factory GiteeRepo.fromJson(Map<String, dynamic> json) =>
5055
_$GiteeRepoFromJson(json);
@@ -58,3 +63,11 @@ class GiteeRepoOwner {
5863
factory GiteeRepoOwner.fromJson(Map<String, dynamic> json) =>
5964
_$GiteeRepoOwnerFromJson(json);
6065
}
66+
67+
@JsonSerializable(fieldRename: FieldRename.snake)
68+
class GiteeRepoNamespace {
69+
String path;
70+
GiteeRepoNamespace();
71+
factory GiteeRepoNamespace.fromJson(Map<String, dynamic> json) =>
72+
_$GiteeRepoNamespaceFromJson(json);
73+
}

lib/models/gitee.g.dart

Lines changed: 22 additions & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

lib/router.dart

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import 'package:git_touch/screens/bb_issues.dart';
66
import 'package:git_touch/screens/bb_pulls.dart';
77
import 'package:git_touch/screens/bb_user.dart';
88
import 'package:git_touch/screens/code_theme.dart';
9+
import 'package:git_touch/screens/ge_repo.dart';
910
import 'package:git_touch/screens/ge_repos.dart';
1011
import 'package:git_touch/screens/ge_user.dart';
1112
import 'package:git_touch/screens/ge_users.dart';
@@ -379,6 +380,10 @@ class GiteeRouter {
379380
static const prefix = '/gitee';
380381
static final routes = [
381382
GiteeRouter.user,
383+
GiteeRouter.repo,
384+
GiteeRouter.stargazers,
385+
GiteeRouter.watchers,
386+
GiteeRouter.forks,
382387
];
383388
static final user = RouterScreen('/:login', (context, p) {
384389
final login = p['login'].first;
@@ -397,4 +402,18 @@ class GiteeRouter {
397402
return GeUserScreen(login);
398403
}
399404
});
405+
static final repo = RouterScreen(
406+
'/:owner/:name',
407+
(context, params) =>
408+
GeRepoScreen(params['owner'].first, params['name'].first),
409+
);
410+
static final stargazers = RouterScreen('/:owner/:name/stargazers', (_, p) {
411+
return GeUsersScreen.stargazers(p['owner'].first, p['name'].first);
412+
});
413+
static final watchers = RouterScreen('/:owner/:name/watchers', (_, p) {
414+
return GeUsersScreen.watchers(p['owner'].first, p['name'].first);
415+
});
416+
static final forks = RouterScreen('/:owner/:name/forks', (_, p) {
417+
return GeReposScreen.forks(p['owner'].first, p['name'].first);
418+
});
400419
}

lib/screens/ge_repo.dart

Lines changed: 110 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,110 @@
1+
import 'package:flutter/material.dart';
2+
import 'package:git_touch/models/auth.dart';
3+
import 'package:git_touch/models/gitee.dart';
4+
import 'package:git_touch/models/theme.dart';
5+
import 'package:git_touch/scaffolds/refresh_stateful.dart';
6+
import 'package:git_touch/utils/utils.dart';
7+
import 'package:git_touch/widgets/app_bar_title.dart';
8+
import 'package:git_touch/widgets/entry_item.dart';
9+
import 'package:git_touch/widgets/markdown_view.dart';
10+
import 'package:git_touch/widgets/repo_header.dart';
11+
import 'package:git_touch/widgets/table_view.dart';
12+
import 'package:provider/provider.dart';
13+
import 'package:tuple/tuple.dart';
14+
15+
class GeRepoScreen extends StatelessWidget {
16+
final String owner;
17+
final String name;
18+
GeRepoScreen(this.owner, this.name);
19+
20+
@override
21+
Widget build(BuildContext context) {
22+
return RefreshStatefulScaffold<Tuple2<GiteeRepo, String>>(
23+
title: AppBarTitle('Repository'),
24+
fetch: () async {
25+
final auth = context.read<AuthModel>();
26+
final res = await Future.wait([
27+
auth.fetchGitee('/repos/$owner/$name'),
28+
auth.fetchGitee('/repos/$owner/$name/readme'),
29+
]);
30+
return Tuple2(
31+
GiteeRepo.fromJson(res[0]),
32+
(res[1]['content'] as String)?.base64ToUtf8,
33+
);
34+
},
35+
bodyBuilder: (t, setState) {
36+
final theme = Provider.of<ThemeModel>(context);
37+
final p = t.item1;
38+
return Column(
39+
crossAxisAlignment: CrossAxisAlignment.stretch,
40+
children: <Widget>[
41+
RepoHeader(
42+
avatarUrl: p.owner.avatarUrl,
43+
avatarLink: '/gitee/${p.namespace.path}',
44+
owner: p.namespace.path,
45+
name: p.path,
46+
description: p.description,
47+
homepageUrl: p.homepage,
48+
),
49+
CommonStyle.border,
50+
Row(
51+
children: <Widget>[
52+
EntryItem(
53+
text: 'Watchers',
54+
url: '/gitee/$owner/$name/watchers',
55+
),
56+
EntryItem(
57+
count: p.stargazersCount,
58+
text: 'Stars',
59+
url: '/gitee/$owner/$name/stargazers',
60+
),
61+
EntryItem(
62+
count: p.forksCount,
63+
text: 'Forks',
64+
url: '/gitee/$owner/$name/forks',
65+
),
66+
],
67+
),
68+
CommonStyle.border,
69+
TableView(
70+
hasIcon: true,
71+
items: [
72+
TableViewItem(
73+
leftIconData: Octicons.code,
74+
text: Text('Code'),
75+
rightWidget: Text(p.license ?? ''),
76+
url: '/gitee/$owner/$name/blob',
77+
),
78+
TableViewItem(
79+
leftIconData: Octicons.issue_opened,
80+
text: Text('Issues'),
81+
rightWidget: Text(numberFormat.format(p.openIssuesCount)),
82+
url: 'https://gitee.com/$owner/$name/issues', // TODO:
83+
),
84+
if (p.pullRequestsEnabled)
85+
TableViewItem(
86+
leftIconData: Octicons.git_pull_request,
87+
text: Text('Pull requests'),
88+
url: 'https://gitee.com/$owner/$name/pulls', // TODO:
89+
),
90+
TableViewItem(
91+
leftIconData: Octicons.history,
92+
text: Text('Commits'),
93+
url: '/gitee/$owner/$name/commits',
94+
),
95+
],
96+
),
97+
CommonStyle.verticalGap,
98+
if (t.item2 != null)
99+
Container(
100+
padding: CommonStyle.padding,
101+
color: theme.palette.background,
102+
child: MarkdownView(t.item2),
103+
),
104+
CommonStyle.verticalGap,
105+
],
106+
);
107+
},
108+
);
109+
}
110+
}

lib/screens/ge_repos.dart

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,9 @@ class GeReposScreen extends StatelessWidget {
1717
GeReposScreen.star(String owner)
1818
: api = '/users/$owner/starred',
1919
title = 'Stars';
20+
GeReposScreen.forks(String owner, String name)
21+
: api = '/repos/$owner/$name/forks',
22+
title = 'Forks';
2023

2124
@override
2225
Widget build(BuildContext context) {

lib/screens/ge_user.dart

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -92,7 +92,7 @@ class GeUserScreen extends StatelessWidget {
9292
// TableViewItem(
9393
// leftIconData: Octicons.home,
9494
// text: Text('Organizations'),
95-
// url: '/gitea/$login?tab=organizations',
95+
// url: '/gitee/$login?tab=organizations',
9696
// ),
9797
// ],
9898
// ),
@@ -101,15 +101,15 @@ class GeUserScreen extends StatelessWidget {
101101
children: <Widget>[
102102
for (var v in repos)
103103
RepositoryItem(
104-
owner: v.owner.login,
104+
owner: v.namespace.path,
105105
avatarUrl: v.owner.avatarUrl,
106106
name: v.path,
107107
description: v.description,
108108
starCount: v.stargazersCount,
109109
forkCount: v.forksCount,
110110
note: 'Updated ${timeago.format(v.updatedAt)}',
111-
url: '/gitea/${v.owner.login}/${v.path}',
112-
avatarLink: '/gitea/${v.owner.login}',
111+
url: '/gitee/${v.namespace.path}/${v.path}',
112+
avatarLink: '/gitee/${v.namespace.path}',
113113
// iconData: , TODO:
114114
)
115115
],

0 commit comments

Comments
 (0)