mirror of
https://github.com/git-touch/git-touch
synced 2025-02-15 11:00:45 +01:00
refactor: use gql for orgs
This commit is contained in:
parent
ec99de2b6d
commit
137af2df75
@ -27,7 +27,13 @@ fragment UserParts on User {
|
|||||||
login
|
login
|
||||||
name
|
name
|
||||||
avatarUrl
|
avatarUrl
|
||||||
company
|
location
|
||||||
|
createdAt
|
||||||
|
}
|
||||||
|
fragment OrgParts on Organization {
|
||||||
|
login
|
||||||
|
name
|
||||||
|
avatarUrl
|
||||||
location
|
location
|
||||||
createdAt
|
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) {
|
query Members($login: String!, $after: String) {
|
||||||
organization(login: $login) {
|
organization(login: $login) {
|
||||||
membersWithRole(first: 30, after: $after) {
|
membersWithRole(first: 30, after: $after) {
|
||||||
@ -183,6 +201,7 @@ query Stars($login: String!, $after: String) {
|
|||||||
# user
|
# user
|
||||||
fragment UserPartsFull on User {
|
fragment UserPartsFull on User {
|
||||||
...UserParts
|
...UserParts
|
||||||
|
company
|
||||||
bio
|
bio
|
||||||
email
|
email
|
||||||
websiteUrl
|
websiteUrl
|
||||||
|
@ -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_issue_form.dart';
|
||||||
import 'package:git_touch/screens/gh_issues.dart';
|
import 'package:git_touch/screens/gh_issues.dart';
|
||||||
import 'package:git_touch/screens/gh_object.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_pulls.dart';
|
||||||
import 'package:git_touch/screens/gh_releases.dart';
|
import 'package:git_touch/screens/gh_releases.dart';
|
||||||
import 'package:git_touch/screens/gh_repo.dart';
|
import 'package:git_touch/screens/gh_repo.dart';
|
||||||
@ -124,7 +123,7 @@ final router = GoRouter(
|
|||||||
case 'orgrepo':
|
case 'orgrepo':
|
||||||
return GhRepos(login);
|
return GhRepos(login);
|
||||||
case 'organizations':
|
case 'organizations':
|
||||||
return GhUserOrganizationScreen(login);
|
return GhOrgs(login);
|
||||||
case 'gists':
|
case 'gists':
|
||||||
return GhGistsScreen(login);
|
return GhGistsScreen(login);
|
||||||
case 'events':
|
case 'events':
|
||||||
|
@ -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!),
|
|
||||||
);
|
|
||||||
},
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
@ -33,7 +33,7 @@ class GhFollowers extends StatelessWidget {
|
|||||||
);
|
);
|
||||||
},
|
},
|
||||||
itemBuilder: (p) {
|
itemBuilder: (p) {
|
||||||
return UserItem.gql(p);
|
return UserItem.fromGqlUser(p);
|
||||||
},
|
},
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
@ -63,7 +63,36 @@ class GhFollowing extends StatelessWidget {
|
|||||||
);
|
);
|
||||||
},
|
},
|
||||||
itemBuilder: (p) {
|
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) {
|
itemBuilder: (p) {
|
||||||
return UserItem.gql(p);
|
return UserItem.fromGqlUser(p);
|
||||||
},
|
},
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
@ -125,7 +154,7 @@ class GhWachers extends StatelessWidget {
|
|||||||
);
|
);
|
||||||
},
|
},
|
||||||
itemBuilder: (p) {
|
itemBuilder: (p) {
|
||||||
return UserItem.gql(p);
|
return UserItem.fromGqlUser(p);
|
||||||
},
|
},
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
@ -157,7 +186,7 @@ class GhStargazers extends StatelessWidget {
|
|||||||
);
|
);
|
||||||
},
|
},
|
||||||
itemBuilder: (p) {
|
itemBuilder: (p) {
|
||||||
return UserItem.gql(p);
|
return UserItem.fromGqlUser(p);
|
||||||
},
|
},
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
@ -14,27 +14,15 @@ const userGqlChunk = '''
|
|||||||
''';
|
''';
|
||||||
|
|
||||||
class GhBioWidget extends StatelessWidget {
|
class GhBioWidget extends StatelessWidget {
|
||||||
final GUserParts p;
|
final String? location;
|
||||||
const GhBioWidget(this.p);
|
final DateTime createdAt;
|
||||||
|
const GhBioWidget({this.location, required this.createdAt});
|
||||||
|
|
||||||
@override
|
@override
|
||||||
Widget build(BuildContext context) {
|
Widget build(BuildContext context) {
|
||||||
final theme = Provider.of<ThemeModel>(context);
|
final theme = Provider.of<ThemeModel>(context);
|
||||||
|
|
||||||
if (isNotNullOrEmpty(p.company)) {
|
if (isNotNullOrEmpty(location)) {
|
||||||
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)) {
|
|
||||||
return Row(
|
return Row(
|
||||||
children: <Widget>[
|
children: <Widget>[
|
||||||
Icon(
|
Icon(
|
||||||
@ -43,7 +31,7 @@ class GhBioWidget extends StatelessWidget {
|
|||||||
color: theme.palette.secondaryText,
|
color: theme.palette.secondaryText,
|
||||||
),
|
),
|
||||||
const SizedBox(width: 4),
|
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),
|
const SizedBox(width: 4),
|
||||||
Expanded(
|
Expanded(
|
||||||
child: Text('Joined on ${dateFormat.format(p.createdAt)}',
|
child: Text('Joined on ${dateFormat.format(createdAt)}',
|
||||||
overflow: TextOverflow.ellipsis)),
|
overflow: TextOverflow.ellipsis)),
|
||||||
],
|
],
|
||||||
);
|
);
|
||||||
@ -77,12 +65,19 @@ class UserItem extends StatelessWidget {
|
|||||||
required this.bio,
|
required this.bio,
|
||||||
}) : url = '/github/$login';
|
}) : url = '/github/$login';
|
||||||
|
|
||||||
UserItem.gql(GUserParts p)
|
UserItem.fromGqlUser(GUserParts p)
|
||||||
: login = p.login,
|
: login = p.login,
|
||||||
name = p.name,
|
name = p.name,
|
||||||
avatarUrl = p.avatarUrl,
|
avatarUrl = p.avatarUrl,
|
||||||
url = '/github/${p.login}',
|
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({
|
const UserItem.gitlab({
|
||||||
required this.login,
|
required this.login,
|
||||||
|
Loading…
x
Reference in New Issue
Block a user