diff --git a/lib/models/auth.dart b/lib/models/auth.dart index e3c6490..8e0b3ad 100644 --- a/lib/models/auth.dart +++ b/lib/models/auth.dart @@ -266,6 +266,30 @@ class AuthModel with ChangeNotifier { return info; } + Future fetchGiteeWithPage(String path, + {int page, int limit}) async { + page = page ?? 1; + limit = limit ?? pageSize; + + var uri = Uri.parse('${activeAccount.domain}/api/v5$path'); + uri = uri.replace( + queryParameters: { + 'page': page.toString(), + 'per_page': limit.toString(), + ...uri.queryParameters, + }, + ); + final res = await http.get(uri, headers: {'Authorization': 'token $token'}); + final info = json.decode(utf8.decode(res.bodyBytes)); + + return DataWithPage( + data: info, + cursor: page + 1, + hasMore: int.tryParse(res.headers['total_page']) > page, + total: int.tryParse(res.headers['total_count'] ?? ''), + ); + } + Future loginToBb(String domain, String username, String appPassword) async { domain = domain.trim(); username = username.trim(); diff --git a/lib/router.dart b/lib/router.dart index 3a0359e..3955279 100644 --- a/lib/router.dart +++ b/lib/router.dart @@ -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_repos.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'; @@ -378,8 +379,19 @@ class GiteeRouter { static final routes = [ GiteeRouter.user, ]; - static final user = RouterScreen( - '/:login', - (context, params) => GeUserScreen(params['login'].first), - ); + static final user = RouterScreen('/:login', (context, p) { + final login = p['login'].first; + final tab = p['tab']?.first; + switch (tab) { + case 'followers': // + case 'following': // + case 'people': // + case 'stars': + return GeReposScreen.star(login); + case 'repositories': + return GeReposScreen(login); + default: + return GeUserScreen(login); + } + }); } diff --git a/lib/screens/ge_repos.dart b/lib/screens/ge_repos.dart new file mode 100644 index 0000000..fc01eab --- /dev/null +++ b/lib/screens/ge_repos.dart @@ -0,0 +1,49 @@ +import 'package:flutter/material.dart'; +import 'package:git_touch/models/gitee.dart'; +import 'package:git_touch/scaffolds/list_stateful.dart'; +import 'package:git_touch/widgets/app_bar_title.dart'; +import 'package:git_touch/models/auth.dart'; +import 'package:provider/provider.dart'; +import 'package:git_touch/widgets/repository_item.dart'; +import 'package:timeago/timeago.dart' as timeago; + +class GeReposScreen extends StatelessWidget { + final String api; + final String title; + + GeReposScreen(String owner) + : api = '/users/$owner/repos', + title = 'Repositories'; + GeReposScreen.star(String owner) + : api = '/users/$owner/starred', + title = 'Stars'; + + @override + Widget build(BuildContext context) { + return ListStatefulScaffold( + title: AppBarTitle(title), + fetch: (page) async { + final res = + await context.read().fetchGiteeWithPage(api, page: page); + return ListPayload( + cursor: res.cursor, + hasMore: res.hasMore, + items: [for (var v in res.data) GiteeRepo.fromJson(v)], + ); + }, + itemBuilder: (v) { + return 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}', + ); + }, + ); + } +}