1
0
mirror of https://github.com/git-touch/git-touch synced 2025-03-05 11:48:02 +01:00

refactor: repositores screen

This commit is contained in:
Rongjian Zhang 2019-12-07 22:25:37 +08:00
parent 6259faf935
commit bcaa49a3c8
7 changed files with 1727 additions and 65 deletions

View File

@ -39,6 +39,11 @@ targets:
queries_glob: lib/graphql/github_object.graphql
resolve_type_field: __typename
add_query_prefix: true
- schema: lib/github.schema.json
output: lib/graphql/github_repositories.dart
queries_glob: lib/graphql/github_repositories.graphql
resolve_type_field: __typename
add_query_prefix: true
scalar_mapping:
- graphql_type: URI
dart_type: String

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,432 @@
// GENERATED CODE - DO NOT MODIFY BY HAND
part of 'github_repositories.dart';
// **************************************************************************
// JsonSerializableGenerator
// **************************************************************************
GithubRepositories _$GithubRepositoriesFromJson(Map<String, dynamic> json) {
return GithubRepositories()
..repositoryOwner = json['repositoryOwner'] == null
? null
: GithubRepositoriesRepositoryOwner.fromJson(
json['repositoryOwner'] as Map<String, dynamic>);
}
Map<String, dynamic> _$GithubRepositoriesToJson(GithubRepositories instance) =>
<String, dynamic>{
'repositoryOwner': instance.repositoryOwner?.toJson(),
};
GithubRepositoriesRepositoryOwner _$GithubRepositoriesRepositoryOwnerFromJson(
Map<String, dynamic> json) {
return GithubRepositoriesRepositoryOwner()
..login = json['login'] as String
..avatarUrl = json['avatarUrl'] as String
..resolveType = json['__typename'] as String;
}
Map<String, dynamic> _$GithubRepositoriesRepositoryOwnerToJson(
GithubRepositoriesRepositoryOwner instance) =>
<String, dynamic>{
'login': instance.login,
'avatarUrl': instance.avatarUrl,
'__typename': instance.resolveType,
};
GithubRepositoriesUser _$GithubRepositoriesUserFromJson(
Map<String, dynamic> json) {
return GithubRepositoriesUser()
..repositories = json['repositories'] == null
? null
: GithubRepositoriesRepositoryConnection.fromJson(
json['repositories'] as Map<String, dynamic>)
..starredRepositories = json['starredRepositories'] == null
? null
: GithubRepositoriesStarredRepositoryConnection.fromJson(
json['starredRepositories'] as Map<String, dynamic>)
..resolveType = json['__typename'] as String
..login = json['login'] as String
..avatarUrl = json['avatarUrl'] as String;
}
Map<String, dynamic> _$GithubRepositoriesUserToJson(
GithubRepositoriesUser instance) =>
<String, dynamic>{
'repositories': instance.repositories?.toJson(),
'starredRepositories': instance.starredRepositories?.toJson(),
'__typename': instance.resolveType,
'login': instance.login,
'avatarUrl': instance.avatarUrl,
};
GithubRepositoriesRepositoryConnection
_$GithubRepositoriesRepositoryConnectionFromJson(
Map<String, dynamic> json) {
return GithubRepositoriesRepositoryConnection()
..totalCount = json['totalCount'] as int
..pageInfo = json['pageInfo'] == null
? null
: GithubRepositoriesPageInfo.fromJson(
json['pageInfo'] as Map<String, dynamic>)
..nodes = (json['nodes'] as List)
?.map((e) => e == null
? null
: GithubRepositoriesRepository.fromJson(e as Map<String, dynamic>))
?.toList();
}
Map<String, dynamic> _$GithubRepositoriesRepositoryConnectionToJson(
GithubRepositoriesRepositoryConnection instance) =>
<String, dynamic>{
'totalCount': instance.totalCount,
'pageInfo': instance.pageInfo?.toJson(),
'nodes': instance.nodes?.map((e) => e?.toJson())?.toList(),
};
GithubRepositoriesPageInfo _$GithubRepositoriesPageInfoFromJson(
Map<String, dynamic> json) {
return GithubRepositoriesPageInfo()
..hasNextPage = json['hasNextPage'] as bool
..endCursor = json['endCursor'] as String;
}
Map<String, dynamic> _$GithubRepositoriesPageInfoToJson(
GithubRepositoriesPageInfo instance) =>
<String, dynamic>{
'hasNextPage': instance.hasNextPage,
'endCursor': instance.endCursor,
};
GithubRepositoriesRepository _$GithubRepositoriesRepositoryFromJson(
Map<String, dynamic> json) {
return GithubRepositoriesRepository()
..owner = json['owner'] == null
? null
: GithubRepositoriesRepositoryOwner.fromJson(
json['owner'] as Map<String, dynamic>)
..name = json['name'] as String
..description = json['description'] as String
..isPrivate = json['isPrivate'] as bool
..isFork = json['isFork'] as bool
..stargazers = json['stargazers'] == null
? null
: GithubRepositoriesStargazerConnection.fromJson(
json['stargazers'] as Map<String, dynamic>)
..forks = json['forks'] == null
? null
: GithubRepositoriesRepositoryConnection.fromJson(
json['forks'] as Map<String, dynamic>)
..primaryLanguage = json['primaryLanguage'] == null
? null
: GithubRepositoriesLanguage.fromJson(
json['primaryLanguage'] as Map<String, dynamic>)
..resolveType = json['__typename'] as String;
}
Map<String, dynamic> _$GithubRepositoriesRepositoryToJson(
GithubRepositoriesRepository instance) =>
<String, dynamic>{
'owner': instance.owner?.toJson(),
'name': instance.name,
'description': instance.description,
'isPrivate': instance.isPrivate,
'isFork': instance.isFork,
'stargazers': instance.stargazers?.toJson(),
'forks': instance.forks?.toJson(),
'primaryLanguage': instance.primaryLanguage?.toJson(),
'__typename': instance.resolveType,
};
GithubRepositoriesStargazerConnection
_$GithubRepositoriesStargazerConnectionFromJson(Map<String, dynamic> json) {
return GithubRepositoriesStargazerConnection()
..totalCount = json['totalCount'] as int;
}
Map<String, dynamic> _$GithubRepositoriesStargazerConnectionToJson(
GithubRepositoriesStargazerConnection instance) =>
<String, dynamic>{
'totalCount': instance.totalCount,
};
GithubRepositoriesLanguage _$GithubRepositoriesLanguageFromJson(
Map<String, dynamic> json) {
return GithubRepositoriesLanguage()
..color = json['color'] as String
..name = json['name'] as String
..resolveType = json['__typename'] as String;
}
Map<String, dynamic> _$GithubRepositoriesLanguageToJson(
GithubRepositoriesLanguage instance) =>
<String, dynamic>{
'color': instance.color,
'name': instance.name,
'__typename': instance.resolveType,
};
GithubRepositoriesNode _$GithubRepositoriesNodeFromJson(
Map<String, dynamic> json) {
return GithubRepositoriesNode()..resolveType = json['__typename'] as String;
}
Map<String, dynamic> _$GithubRepositoriesNodeToJson(
GithubRepositoriesNode instance) =>
<String, dynamic>{
'__typename': instance.resolveType,
};
GithubRepositoriesPinnableItem _$GithubRepositoriesPinnableItemFromJson(
Map<String, dynamic> json) {
return GithubRepositoriesPinnableItem();
}
Map<String, dynamic> _$GithubRepositoriesPinnableItemToJson(
GithubRepositoriesPinnableItem instance) =>
<String, dynamic>{};
GithubRepositoriesProjectOwner _$GithubRepositoriesProjectOwnerFromJson(
Map<String, dynamic> json) {
return GithubRepositoriesProjectOwner()
..resolveType = json['__typename'] as String;
}
Map<String, dynamic> _$GithubRepositoriesProjectOwnerToJson(
GithubRepositoriesProjectOwner instance) =>
<String, dynamic>{
'__typename': instance.resolveType,
};
GithubRepositoriesRegistryPackageOwner
_$GithubRepositoriesRegistryPackageOwnerFromJson(
Map<String, dynamic> json) {
return GithubRepositoriesRegistryPackageOwner()
..resolveType = json['__typename'] as String;
}
Map<String, dynamic> _$GithubRepositoriesRegistryPackageOwnerToJson(
GithubRepositoriesRegistryPackageOwner instance) =>
<String, dynamic>{
'__typename': instance.resolveType,
};
GithubRepositoriesRegistryPackageSearch
_$GithubRepositoriesRegistryPackageSearchFromJson(
Map<String, dynamic> json) {
return GithubRepositoriesRegistryPackageSearch()
..resolveType = json['__typename'] as String;
}
Map<String, dynamic> _$GithubRepositoriesRegistryPackageSearchToJson(
GithubRepositoriesRegistryPackageSearch instance) =>
<String, dynamic>{
'__typename': instance.resolveType,
};
GithubRepositoriesSubscribable _$GithubRepositoriesSubscribableFromJson(
Map<String, dynamic> json) {
return GithubRepositoriesSubscribable()
..resolveType = json['__typename'] as String;
}
Map<String, dynamic> _$GithubRepositoriesSubscribableToJson(
GithubRepositoriesSubscribable instance) =>
<String, dynamic>{
'__typename': instance.resolveType,
};
GithubRepositoriesStarrable _$GithubRepositoriesStarrableFromJson(
Map<String, dynamic> json) {
return GithubRepositoriesStarrable()
..stargazers = json['stargazers'] == null
? null
: GithubRepositoriesStargazerConnection.fromJson(
json['stargazers'] as Map<String, dynamic>)
..resolveType = json['__typename'] as String;
}
Map<String, dynamic> _$GithubRepositoriesStarrableToJson(
GithubRepositoriesStarrable instance) =>
<String, dynamic>{
'stargazers': instance.stargazers?.toJson(),
'__typename': instance.resolveType,
};
GithubRepositoriesUniformResourceLocatable
_$GithubRepositoriesUniformResourceLocatableFromJson(
Map<String, dynamic> json) {
return GithubRepositoriesUniformResourceLocatable()
..resolveType = json['__typename'] as String;
}
Map<String, dynamic> _$GithubRepositoriesUniformResourceLocatableToJson(
GithubRepositoriesUniformResourceLocatable instance) =>
<String, dynamic>{
'__typename': instance.resolveType,
};
GithubRepositoriesRepositoryInfo _$GithubRepositoriesRepositoryInfoFromJson(
Map<String, dynamic> json) {
return GithubRepositoriesRepositoryInfo()
..owner = json['owner'] == null
? null
: GithubRepositoriesRepositoryOwner.fromJson(
json['owner'] as Map<String, dynamic>)
..name = json['name'] as String
..description = json['description'] as String
..isPrivate = json['isPrivate'] as bool
..isFork = json['isFork'] as bool
..resolveType = json['__typename'] as String;
}
Map<String, dynamic> _$GithubRepositoriesRepositoryInfoToJson(
GithubRepositoriesRepositoryInfo instance) =>
<String, dynamic>{
'owner': instance.owner?.toJson(),
'name': instance.name,
'description': instance.description,
'isPrivate': instance.isPrivate,
'isFork': instance.isFork,
'__typename': instance.resolveType,
};
GithubRepositoriesStarredRepositoryConnection
_$GithubRepositoriesStarredRepositoryConnectionFromJson(
Map<String, dynamic> json) {
return GithubRepositoriesStarredRepositoryConnection()
..pageInfo = json['pageInfo'] == null
? null
: GithubRepositoriesPageInfo.fromJson(
json['pageInfo'] as Map<String, dynamic>)
..nodes = (json['nodes'] as List)
?.map((e) => e == null
? null
: GithubRepositoriesRepository.fromJson(e as Map<String, dynamic>))
?.toList();
}
Map<String, dynamic> _$GithubRepositoriesStarredRepositoryConnectionToJson(
GithubRepositoriesStarredRepositoryConnection instance) =>
<String, dynamic>{
'pageInfo': instance.pageInfo?.toJson(),
'nodes': instance.nodes?.map((e) => e?.toJson())?.toList(),
};
GithubRepositoriesAuditEntryActor _$GithubRepositoriesAuditEntryActorFromJson(
Map<String, dynamic> json) {
return GithubRepositoriesAuditEntryActor();
}
Map<String, dynamic> _$GithubRepositoriesAuditEntryActorToJson(
GithubRepositoriesAuditEntryActor instance) =>
<String, dynamic>{};
GithubRepositoriesActor _$GithubRepositoriesActorFromJson(
Map<String, dynamic> json) {
return GithubRepositoriesActor()..resolveType = json['__typename'] as String;
}
Map<String, dynamic> _$GithubRepositoriesActorToJson(
GithubRepositoriesActor instance) =>
<String, dynamic>{
'__typename': instance.resolveType,
};
GithubRepositoriesProfileOwner _$GithubRepositoriesProfileOwnerFromJson(
Map<String, dynamic> json) {
return GithubRepositoriesProfileOwner()
..resolveType = json['__typename'] as String;
}
Map<String, dynamic> _$GithubRepositoriesProfileOwnerToJson(
GithubRepositoriesProfileOwner instance) =>
<String, dynamic>{
'__typename': instance.resolveType,
};
GithubRepositoriesSponsorable _$GithubRepositoriesSponsorableFromJson(
Map<String, dynamic> json) {
return GithubRepositoriesSponsorable()
..resolveType = json['__typename'] as String;
}
Map<String, dynamic> _$GithubRepositoriesSponsorableToJson(
GithubRepositoriesSponsorable instance) =>
<String, dynamic>{
'__typename': instance.resolveType,
};
GithubRepositoriesOrganization _$GithubRepositoriesOrganizationFromJson(
Map<String, dynamic> json) {
return GithubRepositoriesOrganization()
..pinnableItems = json['pinnableItems'] == null
? null
: GithubRepositoriesPinnableItemConnection.fromJson(
json['pinnableItems'] as Map<String, dynamic>)
..resolveType = json['__typename'] as String
..login = json['login'] as String
..avatarUrl = json['avatarUrl'] as String;
}
Map<String, dynamic> _$GithubRepositoriesOrganizationToJson(
GithubRepositoriesOrganization instance) =>
<String, dynamic>{
'pinnableItems': instance.pinnableItems?.toJson(),
'__typename': instance.resolveType,
'login': instance.login,
'avatarUrl': instance.avatarUrl,
};
GithubRepositoriesPinnableItemConnection
_$GithubRepositoriesPinnableItemConnectionFromJson(
Map<String, dynamic> json) {
return GithubRepositoriesPinnableItemConnection()
..pageInfo = json['pageInfo'] == null
? null
: GithubRepositoriesPageInfo.fromJson(
json['pageInfo'] as Map<String, dynamic>)
..nodes = (json['nodes'] as List)
?.map((e) => e == null
? null
: GithubRepositoriesPinnableItem.fromJson(
e as Map<String, dynamic>))
?.toList();
}
Map<String, dynamic> _$GithubRepositoriesPinnableItemConnectionToJson(
GithubRepositoriesPinnableItemConnection instance) =>
<String, dynamic>{
'pageInfo': instance.pageInfo?.toJson(),
'nodes': instance.nodes?.map((e) => e?.toJson())?.toList(),
};
GithubRepositoriesMemberStatusable _$GithubRepositoriesMemberStatusableFromJson(
Map<String, dynamic> json) {
return GithubRepositoriesMemberStatusable()
..resolveType = json['__typename'] as String;
}
Map<String, dynamic> _$GithubRepositoriesMemberStatusableToJson(
GithubRepositoriesMemberStatusable instance) =>
<String, dynamic>{
'__typename': instance.resolveType,
};
GithubRepositoriesArguments _$GithubRepositoriesArgumentsFromJson(
Map<String, dynamic> json) {
return GithubRepositoriesArguments(
owner: json['owner'] as String,
after: json['after'] as String,
isStar: json['isStar'] as bool,
);
}
Map<String, dynamic> _$GithubRepositoriesArgumentsToJson(
GithubRepositoriesArguments instance) =>
<String, dynamic>{
'owner': instance.owner,
'after': instance.after,
'isStar': instance.isStar,
};

View File

@ -0,0 +1,102 @@
query($owner: String!, $after: String, $isStar: Boolean!) {
repositoryOwner(login: $owner) {
__typename
login
avatarUrl
... on User {
repositories(
first: 30
after: $after
orderBy: { field: UPDATED_AT, direction: DESC }
) @skip(if: $isStar) {
totalCount # TODO:
pageInfo {
hasNextPage
endCursor
}
nodes {
owner {
login
avatarUrl
}
name
description
isPrivate
isFork
stargazers {
totalCount
}
forks {
totalCount
}
primaryLanguage {
color
name
}
}
}
starredRepositories(
first: 30
after: $after
orderBy: { field: STARRED_AT, direction: DESC }
) @include(if: $isStar) {
pageInfo {
hasNextPage
endCursor
}
nodes {
owner {
login
avatarUrl
}
name
description
isPrivate
isFork
stargazers {
totalCount
}
forks {
totalCount
}
primaryLanguage {
color
name
}
}
}
}
... on Organization {
pinnableItems(first: 30, after: $after, types: [REPOSITORY])
@skip(if: $isStar) {
__typename
pageInfo {
hasNextPage
endCursor
}
nodes {
... on Repository {
owner {
login
avatarUrl
}
name
description
isPrivate
isFork
stargazers {
totalCount
}
forks {
totalCount
}
primaryLanguage {
color
name
}
}
}
}
}
}
}

View File

@ -1,81 +1,82 @@
import 'package:flutter/material.dart';
import 'package:git_touch/graphql/github_repositories.dart';
import 'package:git_touch/scaffolds/list_stateful.dart';
import 'package:git_touch/screens/repository.dart';
import 'package:git_touch/utils/utils.dart';
import 'package:git_touch/widgets/app_bar_title.dart';
import 'package:git_touch/models/auth.dart';
import 'package:provider/provider.dart';
import '../utils/utils.dart';
import 'package:git_touch/widgets/repository_item.dart';
class RepositoriesScreen extends StatelessWidget {
final String owner;
final String title;
final String scope;
final String scopeParams;
final String resource;
final String extraFilter;
final String queryChunk;
final bool isStar;
RepositoriesScreen(String login)
RepositoriesScreen(this.owner)
: title = 'Repositories',
scope = 'user',
scopeParams = 'login: "$login"',
resource = 'repositories',
extraFilter = ', orderBy: {field: UPDATED_AT, direction: DESC}',
queryChunk = repoChunk;
RepositoriesScreen.stars(String login)
isStar = false;
RepositoriesScreen.stars(this.owner)
: title = 'Stars',
scope = 'user',
scopeParams = 'login: "$login"',
resource = 'starredRepositories',
extraFilter = ', orderBy: {field: STARRED_AT, direction: DESC}',
queryChunk = repoChunk;
RepositoriesScreen.ofOrganization(String login)
: title = 'Repositories',
scope = 'organization',
scopeParams = 'login: "$login"',
resource = 'pinnableItems',
extraFilter = ', types: [REPOSITORY]',
queryChunk = '... on Repository { $repoChunk }';
RepositoriesScreen.forks(String owner, String name)
: title = 'Forks',
scope = 'repository',
scopeParams = 'owner: "$owner", name: "$name"',
resource = 'forks',
extraFilter = ', orderBy: {field: CREATED_AT, direction: DESC}',
queryChunk = repoChunk;
isStar = true;
Future<ListPayload> _queryRepos(BuildContext context, [String cursor]) async {
var cursorChunk = cursor == null ? '' : ', after: "$cursor"';
var data = await Provider.of<AuthModel>(context).query('''
{
$scope($scopeParams) {
$resource(first: $pageSize$cursorChunk$extraFilter) {
pageInfo {
hasNextPage
endCursor
}
nodes {
$queryChunk
}
Future<ListPayload<GithubRepositoriesRepository, String>> _query(
BuildContext context,
[String cursor]) async {
final res = await Provider.of<AuthModel>(context).gqlClient.execute(
GithubRepositoriesQuery(
variables: GithubRepositoriesArguments(
owner: owner, isStar: isStar, after: cursor)));
final data = res.data.repositoryOwner;
switch (data.resolveType) {
case 'User':
final user = data as GithubRepositoriesUser;
if (isStar) {
return ListPayload(
cursor: user.starredRepositories.pageInfo.endCursor,
items: user.starredRepositories.nodes,
hasMore: user.starredRepositories.pageInfo.hasNextPage,
);
} else {
return ListPayload(
cursor: user.repositories.pageInfo.endCursor,
items: user.repositories.nodes,
hasMore: user.repositories.pageInfo.hasNextPage,
);
}
break;
case 'Organization':
final org = data as GithubRepositoriesOrganization;
return ListPayload(
cursor: org.pinnableItems.pageInfo.endCursor,
items: org.pinnableItems.nodes,
hasMore: org.pinnableItems.pageInfo.hasNextPage,
);
default:
return null;
}
}
}
''');
var repo = data[scope][resource];
return ListPayload(
cursor: repo["pageInfo"]["endCursor"],
items: repo["nodes"],
hasMore: repo['pageInfo']['hasNextPage'],
);
}
@override
Widget build(BuildContext context) {
return ListStatefulScaffold(
title: AppBarTitle(title),
onRefresh: () => _queryRepos(context),
onLoadMore: (cursor) => _queryRepos(context, cursor),
itemBuilder: (payload) => RepositoryItem(payload),
);
return ListStatefulScaffold<GithubRepositoriesRepository, String>(
title: AppBarTitle(title),
onRefresh: () => _query(context),
onLoadMore: (cursor) => _query(context, cursor),
itemBuilder: (item) {
return RepositoryItem.raw(
item.owner.login,
item.owner.avatarUrl,
item.name,
item.description,
Octicons.repo,
item.stargazers.totalCount,
item.forks.totalCount,
item.primaryLanguage?.name,
item.primaryLanguage?.color,
(_) => RepositoryScreen(item.owner.login, item.name),
[],
);
});
}
}

View File

@ -154,8 +154,8 @@ class RepositoryScreen extends StatelessWidget {
EntryItem(
count: repo.forks.totalCount,
text: 'Forks',
screenBuilder: (context) =>
RepositoriesScreen.forks(owner, name),
// screenBuilder: (context) =>
// RepositoriesScreen.forks(owner, name), TODO:
),
],
),

View File

@ -183,8 +183,7 @@ class UserScreen extends StatelessWidget {
EntryItem(
count: payload.pinnableItems.totalCount,
text: 'Repositories',
screenBuilder: (context) =>
RepositoriesScreen.ofOrganization(payload.login),
screenBuilder: (context) => RepositoriesScreen(payload.login),
),
EntryItem(
count: payload.membersWithRole.totalCount,