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:
parent
ec99de2b6d
commit
137af2df75
@ -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
|
||||
|
@ -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':
|
||||
|
@ -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) {
|
||||
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);
|
||||
},
|
||||
);
|
||||
}
|
||||
|
@ -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,
|
||||
|
Loading…
x
Reference in New Issue
Block a user