From 6d3570355432ac535034ee9607d448cc5d40a8b8 Mon Sep 17 00:00:00 2001 From: Rongjian Zhang Date: Sun, 2 Feb 2020 17:30:48 +0800 Subject: [PATCH] feat(bb): explore screen --- lib/home.dart | 3 ++- lib/models/auth.dart | 21 +++++++++++++++---- lib/screens/bb_explore.dart | 35 ++++++++++++++++++++++++++++++++ lib/screens/bb_user.dart | 16 ++------------- lib/widgets/repository_item.dart | 17 ++++++++++++++++ 5 files changed, 73 insertions(+), 19 deletions(-) create mode 100644 lib/screens/bb_explore.dart diff --git a/lib/home.dart b/lib/home.dart index 40f235a..9be1ba5 100644 --- a/lib/home.dart +++ b/lib/home.dart @@ -3,6 +3,7 @@ import 'package:flutter/cupertino.dart'; import 'package:git_touch/models/auth.dart'; import 'package:git_touch/models/notification.dart'; import 'package:git_touch/models/theme.dart'; +import 'package:git_touch/screens/bb_explore.dart'; import 'package:git_touch/screens/bb_user.dart'; import 'package:git_touch/screens/gitea_orgs.dart'; import 'package:git_touch/screens/gitea_user.dart'; @@ -64,7 +65,7 @@ class _HomeState extends State { case PlatformType.bitbucket: switch (index) { case 0: - return BbUserScreen(null); + return BbExplore(); case 1: return BbUserScreen(null); } diff --git a/lib/models/auth.dart b/lib/models/auth.dart index 463386c..4bb2ade 100644 --- a/lib/models/auth.dart +++ b/lib/models/auth.dart @@ -40,6 +40,19 @@ class DataWithPage { }); } +class BbPagePayload { + T data; + String cursor; + bool hasMore; + int total; + BbPagePayload({ + @required this.data, + @required this.cursor, + @required this.hasMore, + this.total, + }); +} + class AuthModel with ChangeNotifier { static const _apiPrefix = 'https://api.github.com'; @@ -248,7 +261,7 @@ class AuthModel with ChangeNotifier { } Future fetchBb(String p) async { - if (!p.startsWith('/api')) p = '/api/2.0$p'; + if (p.startsWith('/') && !p.startsWith('/api')) p = '/api/2.0$p'; final input = Uri.parse(p); final uri = Uri.parse(activeAccount.domain).replace( userInfo: '${activeAccount.login}:${activeAccount.appPassword}', @@ -260,11 +273,11 @@ class AuthModel with ChangeNotifier { return info; } - Future> fetchBbWithPage(String p) async { + Future> fetchBbWithPage(String p) async { final res = await fetchBb(p); final v = BbPagination.fromJson(res); - return DataWithPage( - cursor: v.page, + return BbPagePayload( + cursor: v.next, total: v.size, data: v.values, hasMore: v.next != null, diff --git a/lib/screens/bb_explore.dart b/lib/screens/bb_explore.dart new file mode 100644 index 0000000..ef36357 --- /dev/null +++ b/lib/screens/bb_explore.dart @@ -0,0 +1,35 @@ +import 'package:flutter/material.dart'; +import 'package:git_touch/models/auth.dart'; +import 'package:git_touch/models/bitbucket.dart'; +import 'package:git_touch/scaffolds/list_stateful.dart'; +import 'package:git_touch/widgets/app_bar_title.dart'; +import 'package:git_touch/widgets/repository_item.dart'; +import 'package:provider/provider.dart'; + +class BbExplore extends StatelessWidget { + Future> _query(BuildContext context, + [String nextUrl]) async { + final auth = Provider.of(context); + final res = await auth.fetchBbWithPage( + nextUrl ?? '/repositories?role=member&sort=-updated_on'); + return ListPayload( + cursor: res.cursor, + hasMore: res.hasMore, + items: [ + for (var v in res.data) BbRepo.fromJson(v), + ], + ); + } + + @override + Widget build(BuildContext context) { + return ListStatefulScaffold( + title: AppBarTitle('Explore'), + onRefresh: () => _query(context), + onLoadMore: (page) => _query(context, page), + itemBuilder: (v) { + return RepositoryItem.bb(payload: v); + }, + ); + } +} diff --git a/lib/screens/bb_user.dart b/lib/screens/bb_user.dart index 90a44f4..ac361db 100644 --- a/lib/screens/bb_user.dart +++ b/lib/screens/bb_user.dart @@ -9,7 +9,6 @@ import 'package:git_touch/widgets/user_header.dart'; import 'package:provider/provider.dart'; import 'package:tuple/tuple.dart'; import 'package:git_touch/utils/utils.dart'; -import 'package:timeago/timeago.dart' as timeago; class BbUserScreen extends StatelessWidget { final String login; @@ -30,7 +29,7 @@ class BbUserScreen extends StatelessWidget { return Tuple2( BbUser.fromJson(res[0]), [ - for (var v in (res[1] as DataWithPage).data) + for (var v in (res[1] as BbPagePayload).data) BbRepo.fromJson(v) ], ); @@ -56,18 +55,7 @@ class BbUserScreen extends StatelessWidget { CommonStyle.border, Column( children: [ - for (var v in repos) - RepositoryItem( - owner: v.owner.displayName, - name: v.name, - url: '/bitbucket/${v.fullName}', - avatarUrl: v.avatarUrl, - avatarLink: '/bitbucket/${v.owner.displayName}', - note: 'Updated ${timeago.format(v.updatedOn)}', - description: v.description, - forkCount: 0, - starCount: 0, - ) + for (var v in repos) RepositoryItem.bb(payload: v) ], ) ], diff --git a/lib/widgets/repository_item.dart b/lib/widgets/repository_item.dart index d7d5d99..a020dd6 100644 --- a/lib/widgets/repository_item.dart +++ b/lib/widgets/repository_item.dart @@ -1,11 +1,13 @@ import 'package:flutter/material.dart'; import 'package:flutter/cupertino.dart'; +import 'package:git_touch/models/bitbucket.dart'; import 'package:git_touch/models/gitlab.dart'; import 'package:git_touch/models/theme.dart'; import 'package:git_touch/widgets/avatar.dart'; import 'package:provider/provider.dart'; import '../utils/utils.dart'; import 'link.dart'; +import 'package:timeago/timeago.dart' as timeago; class RepositoryItem extends StatelessWidget { final String owner; @@ -36,6 +38,21 @@ class RepositoryItem extends StatelessWidget { @required this.avatarLink, }); + RepositoryItem.bb({ + @required BbRepo payload, + this.primaryLanguageName, + this.primaryLanguageColor, + }) : owner = payload.owner.displayName, + name = payload.name, + url = '/bitbucket/${payload.fullName}', + avatarUrl = payload.avatarUrl, + avatarLink = '/bitbucket/${payload.owner.displayName}', + note = 'Updated ${timeago.format(payload.updatedOn)}', + description = payload.description, + forkCount = 0, + starCount = 0, + iconData = payload.isPrivate ? Octicons.lock : null; + RepositoryItem.gl({ @required GitlabProject payload, this.primaryLanguageName,