feat(github): sponsors and sponsoring

This commit is contained in:
Rongjian Zhang 2022-10-04 21:53:04 +08:00
parent d86229e367
commit 830441ba05
3 changed files with 103 additions and 35 deletions

View File

@ -75,11 +75,6 @@ class _User extends StatelessWidget {
CommonStyle.border,
Row(
children: [
EntryItem(
count: p.sponsors.totalCount,
text: 'Sponsors',
url: 'https://github.com/sponsors/${p.login}',
),
EntryItem(
count: p.followers.totalCount,
text: AppLocalizations.of(context)!.followers,
@ -156,33 +151,86 @@ class _User extends StatelessWidget {
],
),
CommonStyle.verticalGap,
if (p.organizations.totalCount > 0)
AntList(
header: Text(
'${AppLocalizations.of(context)!.organizations} (${p.organizations.totalCount})',
),
children: [
AntListItem(
child: SingleChildScrollView(
scrollDirection: Axis.horizontal,
child: Wrap(
spacing: 8,
children: [
for (final org in p.organizations.nodes!)
Avatar(
isOrg: true,
url: org.avatarUrl,
linkUrl: '/github/${org.login}',
),
],
),
),
AntList(children: [
if (p.sponsors.totalCount > 0)
AntListItem(
prefix: const Icon(Octicons.heart_fill),
extra: Text(p.sponsors.totalCount.toString()),
child: Row(
children: [
const Text('Sponsors'),
const Spacer(),
for (final sponsor in p.sponsors.nodes!) ...[
const SizedBox(width: 6),
Avatar(
isOrg: sponsor.G__typename != 'User',
url: sponsor.G__typename == 'User'
? (sponsor as GUserData_user_sponsors_nodes__asUser)
.avatarUrl
: (sponsor
as GUserParts_sponsors_nodes__asOrganization)
.avatarUrl,
size: AvatarSize.small,
),
],
],
),
],
),
onClick: () {
context.goNamed('/github/${p.login}?tab=sponsors');
},
),
if (p.sponsoring.totalCount > 0)
AntListItem(
prefix: const Icon(Octicons.heart),
extra: Text(p.sponsoring.totalCount.toString()),
child: Row(
children: [
const Text('Sponsoring'),
const Spacer(),
for (final sponsor in p.sponsoring.nodes!) ...[
const SizedBox(width: 6),
Avatar(
isOrg: sponsor.G__typename != 'User',
url: sponsor.G__typename == 'User'
? (sponsor as GUserData_user_sponsoring_nodes__asUser)
.avatarUrl
: (sponsor
as GUserParts_sponsoring_nodes__asOrganization)
.avatarUrl,
size: AvatarSize.small,
),
],
],
),
onClick: () {
context.goNamed('/github/${p.login}?tab=sponsoring');
},
),
if (p.organizations.totalCount > 0)
AntListItem(
prefix: const Icon(Octicons.organization),
extra: Text(p.organizations.totalCount.toString()),
child: Row(
children: [
Text(AppLocalizations.of(context)!.organizations),
const Spacer(),
for (final org in p.organizations.nodes!) ...[
const SizedBox(width: 6),
Avatar(
isOrg: true,
url: org.avatarUrl,
size: AvatarSize.small,
),
],
],
),
onClick: () {
context.pushUrl('/github/${p.login}?tab=organizations');
},
),
]),
CommonStyle.verticalGap,
AntList(
header: const Text('Overview'),
children: [
AntListItem(
prefix: const Icon(Octicons.repo),

View File

@ -35,7 +35,7 @@ class Avatar extends StatelessWidget {
final fallbackWidget = Image.asset(fallback, width: size, height: size);
final widget = ClipRRect(
borderRadius: BorderRadius.circular(isOrg ? 6 : size),
borderRadius: BorderRadius.circular(isOrg ? 4 : size),
child: url == null
? fallbackWidget
: FadeInImage.assetNetwork(

View File

@ -33,9 +33,6 @@ fragment UserParts on User {
twitterUsername
viewerCanFollow # TODO: remove in viewer query
viewerIsFollowing
sponsors {
totalCount
}
followers {
totalCount
}
@ -51,10 +48,33 @@ fragment UserParts on User {
}
}
}
organizations(first: 10) {
sponsors(first: 3) {
totalCount
nodes {
__typename
... on User {
avatarUrl
}
... on Organization {
avatarUrl
}
}
}
sponsoring(first: 3) {
totalCount
nodes {
__typename
... on User {
avatarUrl
}
... on Organization {
avatarUrl
}
}
}
organizations(first: 3) {
totalCount
nodes {
login
avatarUrl
}
}