1
0
mirror of https://github.com/git-touch/git-touch synced 2025-02-12 17:40:48 +01:00

refactor: use gql for orgs

This commit is contained in:
Rongjian Zhang 2022-09-18 16:51:59 +08:00
parent ec99de2b6d
commit 137af2df75
5 changed files with 70 additions and 73 deletions

View File

@ -27,7 +27,13 @@ fragment UserParts on User {
login
name
avatarUrl
company
location
createdAt
}
fragment OrgParts on Organization {
login
name
avatarUrl
location
createdAt
}
@ -101,6 +107,18 @@ query Following($login: String!, $after: String) {
}
}
}
query Orgs($login: String!, $after: String) {
user(login: $login) {
organizations(first: 30, after: $after) {
pageInfo {
...PageInfoParts
}
nodes {
...OrgParts
}
}
}
}
query Members($login: String!, $after: String) {
organization(login: $login) {
membersWithRole(first: 30, after: $after) {
@ -183,6 +201,7 @@ query Stars($login: String!, $after: String) {
# user
fragment UserPartsFull on User {
...UserParts
company
bio
email
websiteUrl

View File

@ -37,7 +37,6 @@ import 'package:git_touch/screens/gh_issue.dart';
import 'package:git_touch/screens/gh_issue_form.dart';
import 'package:git_touch/screens/gh_issues.dart';
import 'package:git_touch/screens/gh_object.dart';
import 'package:git_touch/screens/gh_orgs.dart';
import 'package:git_touch/screens/gh_pulls.dart';
import 'package:git_touch/screens/gh_releases.dart';
import 'package:git_touch/screens/gh_repo.dart';
@ -124,7 +123,7 @@ final router = GoRouter(
case 'orgrepo':
return GhRepos(login);
case 'organizations':
return GhUserOrganizationScreen(login);
return GhOrgs(login);
case 'gists':
return GhGistsScreen(login);
case 'events':

View File

@ -1,45 +0,0 @@
import 'package:flutter/cupertino.dart';
import 'package:flutter/widgets.dart';
import 'package:flutter_gen/gen_l10n/S.dart';
import 'package:git_touch/models/auth.dart';
import 'package:git_touch/models/github.dart';
import 'package:git_touch/scaffolds/list_stateful.dart';
import 'package:git_touch/widgets/app_bar_title.dart';
import 'package:git_touch/widgets/user_item.dart';
import 'package:provider/provider.dart';
class GhUserOrganizationScreen extends StatelessWidget {
final String login;
const GhUserOrganizationScreen(this.login);
@override
Widget build(BuildContext context) {
return ListStatefulScaffold<GithubUserOrganizationItem, int>(
title: AppBarTitle(AppLocalizations.of(context)!.organizations),
fetch: (page) async {
page = page ?? 1;
final res = await context
.read<AuthModel>()
.ghClient
.getJSON<List, List<GithubUserOrganizationItem>>(
'/users/$login/orgs?page=$page',
convert: (vs) =>
[for (var v in vs) GithubUserOrganizationItem.fromJson(v)],
);
return ListPayload(
cursor: page + 1,
items: res,
hasMore: res.isNotEmpty,
);
},
itemBuilder: (v) {
return UserItem.github(
avatarUrl: v.avatarUrl,
login: v.login,
name: null, // TODO: organization name
bio: v.description == null ? null : Text(v.description!),
);
},
);
}
}

View File

@ -33,7 +33,7 @@ class GhFollowers extends StatelessWidget {
);
},
itemBuilder: (p) {
return UserItem.gql(p);
return UserItem.fromGqlUser(p);
},
);
}
@ -63,7 +63,36 @@ class GhFollowing extends StatelessWidget {
);
},
itemBuilder: (p) {
return UserItem.gql(p);
return UserItem.fromGqlUser(p);
},
);
}
}
class GhOrgs extends StatelessWidget {
final String login;
const GhOrgs(this.login, {super.key});
@override
Widget build(BuildContext context) {
return ListStatefulScaffold<GOrgParts, String?>(
title: const AppBarTitle('Members'),
fetch: (cursor) async {
final auth = context.read<AuthModel>();
final req = GOrgsReq((b) {
b.vars.login = login;
b.vars.after = cursor;
});
final res = await auth.gqlClient.request(req).first;
final p = res.data!.user!.organizations;
return ListPayload(
cursor: p.pageInfo.endCursor,
hasMore: p.pageInfo.hasNextPage,
items: p.nodes!,
);
},
itemBuilder: (p) {
return UserItem.fromGqlOrg(p);
},
);
}
@ -93,7 +122,7 @@ class GhMembers extends StatelessWidget {
);
},
itemBuilder: (p) {
return UserItem.gql(p);
return UserItem.fromGqlUser(p);
},
);
}
@ -125,7 +154,7 @@ class GhWachers extends StatelessWidget {
);
},
itemBuilder: (p) {
return UserItem.gql(p);
return UserItem.fromGqlUser(p);
},
);
}
@ -157,7 +186,7 @@ class GhStargazers extends StatelessWidget {
);
},
itemBuilder: (p) {
return UserItem.gql(p);
return UserItem.fromGqlUser(p);
},
);
}

View File

@ -14,27 +14,15 @@ const userGqlChunk = '''
''';
class GhBioWidget extends StatelessWidget {
final GUserParts p;
const GhBioWidget(this.p);
final String? location;
final DateTime createdAt;
const GhBioWidget({this.location, required this.createdAt});
@override
Widget build(BuildContext context) {
final theme = Provider.of<ThemeModel>(context);
if (isNotNullOrEmpty(p.company)) {
return Row(
children: <Widget>[
Icon(
Octicons.organization,
size: 15,
color: theme.palette.secondaryText,
),
const SizedBox(width: 4),
Expanded(child: Text(p.company!, overflow: TextOverflow.ellipsis)),
],
);
}
if (isNotNullOrEmpty(p.location)) {
if (isNotNullOrEmpty(location)) {
return Row(
children: <Widget>[
Icon(
@ -43,7 +31,7 @@ class GhBioWidget extends StatelessWidget {
color: theme.palette.secondaryText,
),
const SizedBox(width: 4),
Expanded(child: Text(p.location!, overflow: TextOverflow.ellipsis)),
Expanded(child: Text(location!, overflow: TextOverflow.ellipsis)),
],
);
}
@ -56,7 +44,7 @@ class GhBioWidget extends StatelessWidget {
),
const SizedBox(width: 4),
Expanded(
child: Text('Joined on ${dateFormat.format(p.createdAt)}',
child: Text('Joined on ${dateFormat.format(createdAt)}',
overflow: TextOverflow.ellipsis)),
],
);
@ -77,12 +65,19 @@ class UserItem extends StatelessWidget {
required this.bio,
}) : url = '/github/$login';
UserItem.gql(GUserParts p)
UserItem.fromGqlUser(GUserParts p)
: login = p.login,
name = p.name,
avatarUrl = p.avatarUrl,
url = '/github/${p.login}',
bio = GhBioWidget(p);
bio = GhBioWidget(location: p.location, createdAt: p.createdAt);
UserItem.fromGqlOrg(GOrgParts p)
: login = p.login,
name = p.name,
avatarUrl = p.avatarUrl,
url = '/github/${p.login}',
bio = GhBioWidget(location: p.location, createdAt: p.createdAt);
const UserItem.gitlab({
required this.login,