Skip to content

Commit

Permalink
feat(gitee): user screen
Browse files Browse the repository at this point in the history
  • Loading branch information
pd4d10 committed Oct 17, 2020
1 parent 5534f96 commit b5a1948
Show file tree
Hide file tree
Showing 7 changed files with 265 additions and 2 deletions.
16 changes: 15 additions & 1 deletion lib/home.dart
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ import 'package:git_touch/models/theme.dart';
import 'package:git_touch/screens/bb_explore.dart';
import 'package:git_touch/screens/bb_teams.dart';
import 'package:git_touch/screens/bb_user.dart';
import 'package:git_touch/screens/gh_repo.dart';
import 'package:git_touch/screens/ge_user.dart';
import 'package:git_touch/screens/gl_search.dart';
import 'package:git_touch/screens/gt_orgs.dart';
import 'package:git_touch/screens/gt_user.dart';
Expand Down Expand Up @@ -88,6 +88,13 @@ class _HomeState extends State<Home> {
return GtUserScreen(auth.activeAccount.login, isViewer: true);
}
break;
case PlatformType.gitee:
switch (index) {
case 0:
case 1:
return GeUserScreen(auth.activeAccount.login, isViewer: true);
}
break;
}
}

Expand Down Expand Up @@ -178,6 +185,13 @@ class _HomeState extends State<Home> {
BottomNavigationBarItem(icon: Icon(Icons.person), label: 'Me'),
];
break;
case PlatformType.gitee:
navigationItems = [
BottomNavigationBarItem(
icon: Icon(Icons.group), label: 'Organizations'),
BottomNavigationBarItem(icon: Icon(Icons.person), label: 'Me'),
];
break;
}

switch (theme.theme) {
Expand Down
4 changes: 4 additions & 0 deletions lib/main.dart
Original file line number Diff line number Diff line change
Expand Up @@ -62,6 +62,10 @@ void main() async {
themeModel.router.define(GithubRouter.prefix + screen.path,
handler: Handler(handlerFunc: screen.handler));
});
GiteeRouter.routes.forEach((screen) {
themeModel.router.define(GiteeRouter.prefix + screen.path,
handler: Handler(handlerFunc: screen.handler));
});

// To match status bar color to app bar color
SystemChrome.setSystemUIOverlayStyle(SystemUiOverlayStyle(
Expand Down
7 changes: 7 additions & 0 deletions lib/models/auth.dart
Original file line number Diff line number Diff line change
Expand Up @@ -259,6 +259,13 @@ class AuthModel with ChangeNotifier {
);
}

Future fetchGitee(String p) async {
final res = await http.get('${activeAccount.domain}/api/v5$p',
headers: {'Authorization': 'token $token'});
final info = json.decode(utf8.decode(res.bodyBytes));
return info;
}

Future loginToBb(String domain, String username, String appPassword) async {
domain = domain.trim();
username = username.trim();
Expand Down
37 changes: 37 additions & 0 deletions lib/models/gitee.dart
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,44 @@ part 'gitee.g.dart';
class GiteeUser {
String login;
String avatarUrl;
String name;
String htmlUrl;
String bio;
String blog;
int publicRepos;
int followers;
int following;
int stared;
int watched;
DateTime createdAt;
GiteeUser();
factory GiteeUser.fromJson(Map<String, dynamic> json) =>
_$GiteeUserFromJson(json);
}

@JsonSerializable(fieldRename: FieldRename.snake)
class GiteeRepo {
GiteeRepoOwner owner;
String path;
String description;
bool private;
bool public;
bool internal;
bool fork;
int forksCount;
int stargazersCount;
int watchersCount;
DateTime updatedAt;
GiteeRepo();
factory GiteeRepo.fromJson(Map<String, dynamic> json) =>
_$GiteeRepoFromJson(json);
}

@JsonSerializable(fieldRename: FieldRename.snake)
class GiteeRepoOwner {
String login;
String avatarUrl;
GiteeRepoOwner();
factory GiteeRepoOwner.fromJson(Map<String, dynamic> json) =>
_$GiteeRepoOwnerFromJson(json);
}
69 changes: 68 additions & 1 deletion lib/models/gitee.g.dart

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

12 changes: 12 additions & 0 deletions lib/router.dart
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ import 'package:git_touch/screens/bb_issues.dart';
import 'package:git_touch/screens/bb_pulls.dart';
import 'package:git_touch/screens/bb_user.dart';
import 'package:git_touch/screens/code_theme.dart';
import 'package:git_touch/screens/ge_user.dart';
import 'package:git_touch/screens/gh_commits.dart';
import 'package:git_touch/screens/gh_contributors.dart';
import 'package:git_touch/screens/gh_events.dart';
Expand Down Expand Up @@ -371,3 +372,14 @@ class BitbucketRouter {
(_, p) =>
BbPullsScreen(p['owner'].first, p['name'].first, p['ref'].first));
}

class GiteeRouter {
static const prefix = '/gitee';
static final routes = [
GiteeRouter.user,
];
static final user = RouterScreen(
'/:login',
(context, params) => GeUserScreen(params['login'].first),
);
}
122 changes: 122 additions & 0 deletions lib/screens/ge_user.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,122 @@
import 'package:flutter/material.dart';
import 'package:flutter/cupertino.dart';
import 'package:git_touch/models/gitee.dart';
import 'package:git_touch/scaffolds/refresh_stateful.dart';
import 'package:git_touch/utils/utils.dart';
import 'package:git_touch/widgets/action_entry.dart';
import 'package:git_touch/widgets/app_bar_title.dart';
import 'package:git_touch/models/auth.dart';
import 'package:git_touch/widgets/entry_item.dart';
import 'package:git_touch/widgets/repository_item.dart';
import 'package:git_touch/widgets/table_view.dart';
import 'package:git_touch/widgets/user_header.dart';
import 'package:provider/provider.dart';
import 'package:git_touch/widgets/action_button.dart';
import 'package:tuple/tuple.dart';
import 'package:timeago/timeago.dart' as timeago;

class GeUserScreen extends StatelessWidget {
final String login;
final bool isViewer;
GeUserScreen(this.login, {this.isViewer = false});

@override
Widget build(BuildContext context) {
final auth = Provider.of<AuthModel>(context);
return RefreshStatefulScaffold<Tuple2<GiteeUser, List<GiteeRepo>>>(
fetch: () async {
final res = await Future.wait([
auth.fetchGitee('/users/$login'),
auth.fetchGitee('/users/$login/repos?per_page=6'),
]);
return Tuple2(
GiteeUser.fromJson(res[0]),
[for (var v in res[1]) GiteeRepo.fromJson(v)],
);
},
title: AppBarTitle(isViewer ? 'Me' : login),
action: isViewer
? ActionEntry(
iconData: Icons.settings,
url: '/settings',
)
: null,
actionBuilder: isViewer
? null
: (p, setState) {
return ActionButton(
title: 'User Actions',
items: [...ActionItem.getUrlActions(p.item1.htmlUrl)],
);
},
bodyBuilder: (p, setState) {
final user = p.item1;
final repos = p.item2;

return Column(
children: <Widget>[
UserHeader(
login: user.login,
avatarUrl: user.avatarUrl,
name: user.name,
createdAt: user.createdAt,
isViewer: isViewer,
bio: user.bio,
),
CommonStyle.border,
Row(children: [
EntryItem(
count: user.publicRepos,
text: 'Repositories',
url: '/gitee/$login?tab=repositories',
),
EntryItem(
count: user.stared,
text: 'Stars',
url: '/gitee/$login?tab=stars',
),
EntryItem(
count: user.followers,
text: 'Followers',
url: '/gitee/$login?tab=followers',
),
EntryItem(
count: user.following,
text: 'Following',
url: '/gitee/$login?tab=following',
),
]),
// TableView(
// hasIcon: true,
// items: [
// TableViewItem(
// leftIconData: Octicons.home,
// text: Text('Organizations'),
// url: '/gitea/$login?tab=organizations',
// ),
// ],
// ),
CommonStyle.border,
Column(
children: <Widget>[
for (var v in repos)
RepositoryItem(
owner: v.owner.login,
avatarUrl: v.owner.avatarUrl,
name: v.path,
description: v.description,
starCount: v.stargazersCount,
forkCount: v.forksCount,
note: 'Updated ${timeago.format(v.updatedAt)}',
url: '/gitea/${v.owner.login}/${v.path}',
avatarLink: '/gitea/${v.owner.login}',
// iconData: , TODO:
)
],
),
],
);
},
);
}
}

0 comments on commit b5a1948

Please sign in to comment.