diff --git a/lib/router.dart b/lib/router.dart index 03a4088..1a702d9 100644 --- a/lib/router.dart +++ b/lib/router.dart @@ -17,7 +17,6 @@ import 'package:git_touch/screens/gl_starrers.dart'; 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_org.dart'; import 'package:git_touch/screens/gt_repo.dart'; import 'package:git_touch/screens/gt_user.dart'; import 'package:git_touch/screens/gl_blob.dart'; @@ -270,11 +269,7 @@ class GiteaRouter { GiteaRouter.pulls, ]; static final user = RouterScreen( - '/:login', - (context, params) => params['org'].first == '1' - ? GtOrgScreen(params['login'].first) - : GtUserScreen(params['login'].first), - ); + '/:login', (context, params) => GtUserScreen(params['login'].first)); static final repo = RouterScreen( '/:owner/:name', (context, params) => diff --git a/lib/screens/gt_org.dart b/lib/screens/gt_org.dart deleted file mode 100644 index d940a30..0000000 --- a/lib/screens/gt_org.dart +++ /dev/null @@ -1,67 +0,0 @@ -import 'package:flutter/material.dart'; -import 'package:flutter/widgets.dart'; -import 'package:git_touch/models/auth.dart'; -import 'package:git_touch/models/gitea.dart'; -import 'package:git_touch/scaffolds/refresh_stateful.dart'; -import 'package:git_touch/utils/utils.dart'; -import 'package:git_touch/widgets/repository_item.dart'; -import 'package:git_touch/widgets/user_header.dart'; -import 'package:provider/provider.dart'; -import 'package:tuple/tuple.dart'; -import 'package:timeago/timeago.dart' as timeago; - -class GtOrgScreen extends StatelessWidget { - final String login; - GtOrgScreen(this.login); - - @override - Widget build(BuildContext context) { - return RefreshStatefulScaffold>>( - title: Text(login), - fetchData: () async { - final auth = context.read(); - final res = await Future.wait([ - auth.fetchGitea('/orgs/$login'), - auth.fetchGitea('/orgs/$login/repos'), - ]); - return Tuple2( - GiteaOrg.fromJson(res[0]), - [for (var v in res[1]) GiteaRepository.fromJson(v)], - ); - }, - bodyBuilder: (data, _) { - final org = data.item1; - final repos = data.item2; - - return Column( - children: [ - UserHeader( - login: org.username, - avatarUrl: org.avatarUrl, - name: org.fullName, - createdAt: null, - bio: org.description, - ), - CommonStyle.border, - Column( - children: [ - for (var v in repos) - 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_repos.dart b/lib/screens/gt_repos.dart new file mode 100644 index 0000000..e69de29 diff --git a/lib/screens/gt_user.dart b/lib/screens/gt_user.dart index cc093b5..1cee244 100644 --- a/lib/screens/gt_user.dart +++ b/lib/screens/gt_user.dart @@ -1,4 +1,3 @@ -import 'dart:math'; import 'package:flutter/material.dart'; import 'package:flutter/widgets.dart'; import 'package:git_touch/models/auth.dart'; @@ -13,6 +12,11 @@ import 'package:provider/provider.dart'; import 'package:tuple/tuple.dart'; import 'package:timeago/timeago.dart' as timeago; +class GtUserScreenPayload { + Tuple3, List>> user; + Tuple2> org; +} + class GtUserScreen extends StatelessWidget { final String login; GtUserScreen(this.login); @@ -20,9 +24,8 @@ class GtUserScreen extends StatelessWidget { @override Widget build(BuildContext context) { - return RefreshStatefulScaffold< - Tuple3, List>>>( - title: Text(isViewer ? 'Me' : 'User'), + return RefreshStatefulScaffold( + title: Text(login ?? 'Me'), fetchData: () async { final auth = context.read(); final res = await Future.wait([ @@ -30,33 +33,53 @@ class GtUserScreen extends StatelessWidget { auth.fetchGitea(isViewer ? '/user/repos' : '/users/$login/repos'), auth.fetchGitea( '/users/${login ?? auth.activeAccount.login}/heatmap'), + auth.fetchGitea('/orgs/$login'), + auth.fetchGitea('/orgs/$login/repos'), ]); - final heatmapItems = [ - for (final v in res[2]) GiteaHeatmapItem.fromJson(v) - ]; - List> heatmapWeeks = [[]]; - for (var i = 0; i < heatmapItems.length; i++) { - if (i > 0 && - heatmapItems[i].timestamp - heatmapItems[i - 1].timestamp > - 86400) { - if (heatmapWeeks.last.length == 7) { - heatmapWeeks.add([]); - } - heatmapWeeks.last.add(ContributionDay(count: 0)); - } else { - if (heatmapWeeks.last.length == 7) { - heatmapWeeks.add([]); - } - heatmapWeeks.last - .add(ContributionDay(count: heatmapItems[i].contributions)); - } - } + final user = res[0]; + final userRepos = res[1]; + final userHeatmap = res[2]; + final org = res[3]; + final orgRepos = res[4]; - return Tuple3( - GiteaUser.fromJson(res[0]), - [for (var v in res[1]) GiteaRepository.fromJson(v)], - heatmapWeeks, - ); + final payload = GtUserScreenPayload(); + // user api also returns data for org, use org api here. + if (org['message'] == null) { + // org + payload.org = Tuple2( + GiteaOrg.fromJson(org), + [for (var v in orgRepos) GiteaRepository.fromJson(v)], + ); + } else { + // user + final heatmapItems = [ + for (final v in userHeatmap) GiteaHeatmapItem.fromJson(v) + ]; + List> heatmapWeeks = [[]]; + for (var i = 0; i < heatmapItems.length; i++) { + if (i > 0 && + heatmapItems[i].timestamp - heatmapItems[i - 1].timestamp > + 86400) { + if (heatmapWeeks.last.length == 7) { + heatmapWeeks.add([]); + } + heatmapWeeks.last.add(ContributionDay(count: 0)); + } else { + if (heatmapWeeks.last.length == 7) { + heatmapWeeks.add([]); + } + heatmapWeeks.last + .add(ContributionDay(count: heatmapItems[i].contributions)); + } + } + + payload.user = Tuple3( + GiteaUser.fromJson(user), + [for (var v in userRepos) GiteaRepository.fromJson(v)], + heatmapWeeks, + ); + } + return payload; }, action: isViewer ? ActionEntry( @@ -65,40 +88,76 @@ class GtUserScreen extends StatelessWidget { ) : null, bodyBuilder: (data, _) { - final user = data.item1; - final repos = data.item2; - final heatmapWeeks = data.item3; + if (data.user != null) { + final user = data.user.item1; + final repos = data.user.item2; + final heatmapWeeks = data.user.item3; - return Column( - children: [ - UserHeader( - login: user.login, - avatarUrl: user.avatarUrl, - name: user.fullName, - createdAt: user.created, - bio: '', - ), - CommonStyle.border, - ContributionWidget(weeks: heatmapWeeks), - CommonStyle.border, - Column( - children: [ - for (var v in repos) - 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}', - ) - ], - ) - ], - ); + return Column( + children: [ + UserHeader( + login: user.login, + avatarUrl: user.avatarUrl, + name: user.fullName, + createdAt: user.created, + bio: '', + ), + CommonStyle.border, + ContributionWidget(weeks: heatmapWeeks), + CommonStyle.border, + Column( + children: [ + for (var v in repos) + 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}', + ) + ], + ) + ], + ); + } else if (data.org != null) { + final org = data.org.item1; + final repos = data.org.item2; + + return Column( + children: [ + UserHeader( + login: org.username, + avatarUrl: org.avatarUrl, + name: org.fullName, + createdAt: null, + bio: org.description, + ), + CommonStyle.border, + Column( + children: [ + for (var v in repos) + 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}', + ) + ], + ) + ], + ); + } else { + return Text('404'); // TODO: + } }, ); }