From 25633b44d98a28233b69298ef043ed849bdeeb01 Mon Sep 17 00:00:00 2001 From: Rongjian Zhang Date: Mon, 5 Oct 2020 17:23:43 +0800 Subject: [PATCH] feat(gt): user repos and stars --- lib/router.dart | 15 +++++++++-- lib/screens/gt_repos.dart | 52 +++++++++++++++++++++++++++++++++++++++ lib/screens/gt_user.dart | 16 +++++++++++- 3 files changed, 80 insertions(+), 3 deletions(-) diff --git a/lib/router.dart b/lib/router.dart index 1a702d9..d230285 100644 --- a/lib/router.dart +++ b/lib/router.dart @@ -18,6 +18,7 @@ import 'package:git_touch/screens/gt_commits.dart'; import 'package:git_touch/screens/gt_issues.dart'; import 'package:git_touch/screens/gt_object.dart'; import 'package:git_touch/screens/gt_repo.dart'; +import 'package:git_touch/screens/gt_repos.dart'; import 'package:git_touch/screens/gt_user.dart'; import 'package:git_touch/screens/gl_blob.dart'; import 'package:git_touch/screens/gl_commits.dart'; @@ -268,8 +269,18 @@ class GiteaRouter { GiteaRouter.issues, GiteaRouter.pulls, ]; - static final user = RouterScreen( - '/:login', (context, params) => GtUserScreen(params['login'].first)); + static final user = RouterScreen('/:login', (context, p) { + final login = p['login'].first; + final tab = p['tab']?.first; + switch (tab) { + case 'stars': + return GtReposScreen.star(login); + case 'repositories': + return GtReposScreen(login); + default: + return GtUserScreen(login); + } + }); static final repo = RouterScreen( '/:owner/:name', (context, params) => diff --git a/lib/screens/gt_repos.dart b/lib/screens/gt_repos.dart index e69de29..a975b9c 100644 --- a/lib/screens/gt_repos.dart +++ b/lib/screens/gt_repos.dart @@ -0,0 +1,52 @@ +import 'package:flutter/material.dart'; +import 'package:git_touch/models/gitea.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 GtReposScreen extends StatelessWidget { + final String owner; + final String api; + final String title; + + GtReposScreen(this.owner) + : api = '/users/$owner/repos', + title = 'Repositories'; + GtReposScreen.star(this.owner) + : api = '/users/$owner/starred', + title = 'Stars'; + + @override + Widget build(BuildContext context) { + return ListStatefulScaffold( + title: AppBarTitle(title), + onLoadMore: (page) async { + page = page ?? 1; + final res = await context + .read() + .fetchGiteaWithPage('$api?page=$page'); + return ListPayload( + cursor: page + 1, + hasMore: res.hasMore, + items: [for (var v in res.data) GiteaRepository.fromJson(v)], + ); + }, + itemBuilder: (v) { + return RepositoryItem( + owner: v.owner.login, + avatarUrl: v.owner.avatarUrl, + name: v.name, + description: v.description, + starCount: v.starsCount, + forkCount: v.forksCount, + note: 'Updated ${timeago.format(v.updatedAt)}', + url: '/gitea/${v.owner.login}/${v.name}', + avatarLink: '/gitea/${v.owner.login}', + ); + }, + ); + } +} diff --git a/lib/screens/gt_user.dart b/lib/screens/gt_user.dart index 1cee244..bc7a7eb 100644 --- a/lib/screens/gt_user.dart +++ b/lib/screens/gt_user.dart @@ -6,6 +6,7 @@ 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/contribution.dart'; +import 'package:git_touch/widgets/entry_item.dart'; import 'package:git_touch/widgets/repository_item.dart'; import 'package:git_touch/widgets/user_header.dart'; import 'package:provider/provider.dart'; @@ -30,7 +31,8 @@ class GtUserScreen extends StatelessWidget { final auth = context.read(); final res = await Future.wait([ auth.fetchGitea(isViewer ? '/user' : '/users/$login'), - auth.fetchGitea(isViewer ? '/user/repos' : '/users/$login/repos'), + auth.fetchGitea( + isViewer ? '/user/repos?limit=6' : '/users/$login/repos?limit=6'), auth.fetchGitea( '/users/${login ?? auth.activeAccount.login}/heatmap'), auth.fetchGitea('/orgs/$login'), @@ -103,6 +105,18 @@ class GtUserScreen extends StatelessWidget { bio: '', ), CommonStyle.border, + Row(children: [ + EntryItem( + count: 0, // TODO: count + text: 'Repositories', + url: '/gitea/$login?tab=repositories', + ), + EntryItem( + count: 0, + text: 'Stars', + url: '/gitea/$login?tab=stars', + ), + ]), ContributionWidget(weeks: heatmapWeeks), CommonStyle.border, Column(