diff --git a/lib/screens/organization.dart b/lib/screens/organization.dart index d317cb9..a408af6 100644 --- a/lib/screens/organization.dart +++ b/lib/screens/organization.dart @@ -1,5 +1,6 @@ import 'package:flutter/material.dart'; import 'package:flutter/cupertino.dart'; +import 'package:git_touch/screens/repos.dart'; import 'package:git_touch/screens/users.dart'; import 'package:git_touch/widgets/app_bar_title.dart'; import 'package:git_touch/widgets/entry_item.dart'; @@ -21,13 +22,17 @@ class OrganizationScreen extends StatelessWidget { Iterable _buildRepos(payload) { String title; - List items; + List items = []; - if ((payload['pinnedItems']['nodes'] as List).isNotEmpty) { + var pinnedItems = payload['pinnedItems']['nodes'] as List; + var repositories = payload['pinnableItems']['nodes'] as List; + + if (pinnedItems.isNotEmpty) { title = 'pinned repositories'; - items = payload['pinnedItems']['nodes'] as List; - } else { - items = []; + items = pinnedItems; + } else if (repositories.isNotEmpty) { + title = 'popular repositories'; + items = repositories; } items = items @@ -51,6 +56,7 @@ class OrganizationScreen extends StatelessWidget { Widget build(BuildContext context) { return RefreshScaffold( onRefresh: () async { + // Use pinnableItems instead of organization here due to token permission var data = await Provider.of(context).query(''' { organization(login: "$login") { @@ -61,13 +67,21 @@ class OrganizationScreen extends StatelessWidget { email websiteUrl url - pinnedItems(first: $pageSize) { + pinnedItems(first: 6) { nodes { ... on Repository { $repoChunk } } } + pinnableItems(first: 6, types: [REPOSITORY]) { + totalCount + nodes { + ... on Repository { + $repoChunk + } + } + } membersWithRole { totalCount } @@ -105,6 +119,11 @@ class OrganizationScreen extends StatelessWidget { ), borderView, Row(children: [ + EntryItem( + count: payload['pinnableItems']['totalCount'], + text: 'Repositories', + screenBuilder: (context) => ReposScreen(login, org: true), + ), EntryItem( count: payload['membersWithRole']['totalCount'], text: 'Members', diff --git a/lib/screens/repos.dart b/lib/screens/repos.dart index 2fde36b..b92604f 100644 --- a/lib/screens/repos.dart +++ b/lib/screens/repos.dart @@ -6,7 +6,7 @@ import 'package:provider/provider.dart'; import '../utils/utils.dart'; import '../widgets/repo_item.dart'; -/// Repos of user +// TODO: refactor class ReposScreen extends StatelessWidget { final String login; final bool star; @@ -15,7 +15,8 @@ class ReposScreen extends StatelessWidget { ReposScreen(this.login, {this.star = false, this.org = false}); String get scope => org ? 'organization' : 'user'; - String get resource => star ? 'starredRepositories' : 'repositories'; + String get resource => + org ? 'pinnableItems' : star ? 'starredRepositories' : 'repositories'; String get fieldOrderBy { if (star) { return 'STARRED_AT'; @@ -27,18 +28,21 @@ class ReposScreen extends StatelessWidget { } Future _queryRepos(BuildContext context, [String cursor]) async { + var filterChunk = org + ? ', types: [REPOSITORY],' + : ', orderBy: {field: $fieldOrderBy, direction: DESC}'; var cursorChunk = cursor == null ? '' : ', after: "$cursor"'; - // FIXME: organization scope not work due to permissions + var contentChunk = org ? '''... on Repository { $repoChunk }''' : repoChunk; var data = await Provider.of(context).query(''' { $scope(login: "$login") { - $resource(first: $pageSize$cursorChunk, orderBy: {field: $fieldOrderBy, direction: DESC}) { + $resource(first: $pageSize$cursorChunk$filterChunk) { pageInfo { hasNextPage endCursor } nodes { - $repoChunk + $contentChunk } } } diff --git a/lib/screens/user.dart b/lib/screens/user.dart index 794cc32..e35e659 100644 --- a/lib/screens/user.dart +++ b/lib/screens/user.dart @@ -68,16 +68,17 @@ class UserScreen extends StatelessWidget { Iterable _buildRepos(payload) { String title; - List items; + List items = []; - if ((payload['pinnedItems']['nodes'] as List).isNotEmpty) { + var pinnedItems = payload['pinnedItems']['nodes'] as List; + var repositories = payload['repositories']['nodes'] as List; + + if (pinnedItems.isNotEmpty) { title = 'pinned repositories'; - items = payload['pinnedItems']['nodes'] as List; - } else if ((payload['repositories']['nodes'] as List).isNotEmpty) { + items = pinnedItems; + } else if (repositories.isNotEmpty) { title = 'popular repositories'; - items = payload['repositories']['nodes'] as List; - } else { - items = []; + items = repositories; } items = items