git-touch-android-ios-app/lib/widgets/repository_item.dart

281 lines
9.4 KiB
Dart
Raw Normal View History

import 'package:flutter/material.dart';
2019-02-04 14:38:29 +01:00
import 'package:flutter/cupertino.dart';
2020-01-07 08:07:57 +01:00
import 'package:git_touch/graphql/gh.dart'; // FIXME:
2019-12-04 15:02:22 +01:00
import 'package:git_touch/models/gitea.dart';
2019-12-04 15:00:39 +01:00
import 'package:git_touch/models/gitlab.dart';
2019-11-03 16:33:24 +01:00
import 'package:git_touch/models/theme.dart';
2019-09-08 15:20:12 +02:00
import 'package:git_touch/widgets/avatar.dart';
2019-08-31 16:17:35 +02:00
import 'package:primer/primer.dart';
2019-11-03 16:33:24 +01:00
import 'package:provider/provider.dart';
import '../utils/utils.dart';
import 'link.dart';
2019-09-21 19:23:38 +02:00
const repoChunk = '''
owner {
2019-10-03 04:12:22 +02:00
__typename
2019-09-21 19:23:38 +02:00
login
avatarUrl
}
name
description
isPrivate
isFork
stargazers {
totalCount
}
forks {
totalCount
}
primaryLanguage {
color
name
}
''';
2019-09-23 12:28:33 +02:00
class RepositoryItem extends StatelessWidget {
2019-11-02 10:50:04 +01:00
final String owner;
final String avatarUrl;
final String name;
final String description;
final IconData iconData;
final int starCount;
final int forkCount;
final String primaryLanguageName;
final String primaryLanguageColor;
2019-09-09 16:50:22 +02:00
final bool inRepoScreen;
2020-01-07 08:07:57 +01:00
final Iterable<GhRepoRepositoryTopic> topics;
2019-12-07 07:42:33 +01:00
RepositoryItem.raw(
this.owner,
this.avatarUrl,
this.name,
this.description,
this.iconData,
this.starCount,
this.forkCount,
this.primaryLanguageName,
this.primaryLanguageColor,
this.topics,
{this.inRepoScreen = false});
2019-11-02 10:50:04 +01:00
RepositoryItem(payload, {this.inRepoScreen = false})
: this.owner = payload['owner']['login'],
this.avatarUrl = payload['owner']['avatarUrl'],
this.name = payload['name'],
this.description = payload['description'],
this.iconData = _buildIconData(payload),
this.starCount = payload['stargazers']['totalCount'],
this.forkCount = payload['forks']['totalCount'],
this.primaryLanguageName = payload['primaryLanguage'] == null
? null
: payload['primaryLanguage']['name'],
this.primaryLanguageColor = payload['primaryLanguage'] == null
? null
: payload['primaryLanguage']['color'],
2019-12-07 09:12:18 +01:00
this.topics = [];
2020-01-07 08:07:57 +01:00
RepositoryItem.github(GhUserRepository payload, {this.inRepoScreen = false})
2019-12-07 14:12:48 +01:00
: this.owner = payload.owner.login,
this.avatarUrl = payload.owner.avatarUrl,
this.name = payload.name,
this.description = payload.description,
this.iconData = Octicons.repo, // TODO:
this.starCount = payload.stargazers.totalCount,
this.forkCount = payload.forks.totalCount,
this.primaryLanguageName = payload.primaryLanguage?.name,
this.primaryLanguageColor = payload.primaryLanguage?.color,
this.topics = []; // TODO:
// this.topics = payload['repositoryTopics'] == null
// ? []
// : payload['repositoryTopics']['nodes'];
2019-12-08 13:08:50 +01:00
static _getGitlabIcon(String visibility) {
switch (visibility) {
case 'internal':
return FontAwesome.shield;
case 'public':
return FontAwesome.globe;
case 'private':
return FontAwesome.lock;
default:
return Octicons.repo;
}
}
2019-12-11 16:09:39 +01:00
RepositoryItem.gitlab(GitlabUserProject payload, {this.inRepoScreen = false})
2019-12-04 15:00:39 +01:00
: this.owner = payload.owner.name,
this.avatarUrl = payload.owner.avatarUrl,
this.name = payload.name,
this.description = payload.description,
2019-12-08 13:08:50 +01:00
this.iconData = _getGitlabIcon(payload.visibility),
2019-12-04 15:00:39 +01:00
this.starCount = payload.starCount,
this.forkCount = payload.forksCount,
2019-11-02 10:50:04 +01:00
this.primaryLanguageName = null,
this.primaryLanguageColor = null,
this.topics = [];
2019-12-04 15:02:22 +01:00
RepositoryItem.gitea(GiteaRepository payload, {this.inRepoScreen = false})
: this.owner = payload.owner.login,
this.avatarUrl = payload.owner.avatarUrl,
this.name = payload.name,
this.description = payload.description,
this.iconData = Octicons.repo,
this.starCount = payload.starsCount,
this.forkCount = payload.forksCount,
this.primaryLanguageName = null,
this.primaryLanguageColor = null,
this.topics = [];
2019-11-02 10:50:04 +01:00
static IconData _buildIconData(payload) {
2019-03-02 11:17:46 +01:00
if (payload['isPrivate']) {
2019-02-04 11:32:39 +01:00
return Octicons.lock;
}
2019-03-02 11:17:46 +01:00
if (payload['isFork']) {
2019-02-04 11:32:39 +01:00
return Octicons.repo_forked;
}
return Octicons.repo;
}
@override
Widget build(BuildContext context) {
2019-11-05 14:22:41 +01:00
final theme = Provider.of<ThemeModel>(context);
2019-12-12 13:29:56 +01:00
// TODO: text style inRepoScreen
2019-12-21 09:16:17 +01:00
final widget = Container(
padding: CommonStyle.padding,
child: Row(
crossAxisAlignment: CrossAxisAlignment.start,
children: <Widget>[
2019-12-27 08:06:45 +01:00
Avatar(url: avatarUrl, size: AvatarSize.small, linkUrl: '/$owner'),
2019-12-21 09:16:17 +01:00
SizedBox(width: 8),
Expanded(
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: join(SizedBox(height: 8), <Widget>[
Row(
crossAxisAlignment: CrossAxisAlignment.start,
children: <Widget>[
2019-12-21 15:01:08 +01:00
Expanded(
child: Row(
children: <Widget>[
Text(
owner + ' / ',
style: TextStyle(
fontSize: 17,
color: theme.palette.primary,
),
),
Expanded(
child: Text(
name,
style: TextStyle(
fontSize: 17,
color: theme.palette.primary,
fontWeight: FontWeight.w600,
),
overflow: TextOverflow.ellipsis,
),
),
],
2019-11-05 14:22:41 +01:00
),
2019-12-21 09:16:17 +01:00
),
Icon(iconData, size: 17, color: theme.palette.tertiaryText),
],
),
if (description != null && description.isNotEmpty)
Text(
description,
overflow: TextOverflow.ellipsis,
style: TextStyle(
color: theme.palette.secondaryText,
fontSize: 15,
),
),
if (topics != null && topics.isNotEmpty)
// TODO: link
Wrap(
spacing: 4,
runSpacing: 4,
children: topics.map((node) {
return Container(
padding:
EdgeInsets.symmetric(vertical: 4, horizontal: 8),
decoration: BoxDecoration(
color: PrimerColors.blue000,
borderRadius: BorderRadius.all(Radius.circular(4)),
),
child: Text(
node.topic.name,
style: TextStyle(
fontSize: 14,
color: theme.palette.primary,
2019-11-05 14:22:41 +01:00
),
2019-12-21 09:16:17 +01:00
),
);
}).toList(),
),
if (!inRepoScreen)
DefaultTextStyle(
style: TextStyle(color: theme.palette.text, fontSize: 13),
child: Row(
children: <Widget>[
Expanded(
child: Row(children: <Widget>[
Container(
width: 10,
height: 10,
decoration: BoxDecoration(
color: convertColor(primaryLanguageColor),
shape: BoxShape.circle,
),
2019-11-05 14:22:41 +01:00
),
2019-12-21 09:16:17 +01:00
SizedBox(width: 4),
2019-12-21 15:01:08 +01:00
Expanded(
child: Text(
primaryLanguageName ?? 'Unknown',
overflow: TextOverflow.ellipsis,
),
),
2019-12-21 09:16:17 +01:00
]),
),
Expanded(
child: Row(
crossAxisAlignment: CrossAxisAlignment.start,
children: <Widget>[
Icon(Octicons.star,
size: 14, color: theme.palette.text),
Text(numberFormat.format(starCount)),
],
2019-11-05 14:22:41 +01:00
),
2019-12-21 09:16:17 +01:00
),
Expanded(
child: Row(
crossAxisAlignment: CrossAxisAlignment.start,
children: <Widget>[
Icon(Octicons.repo_forked,
size: 14, color: theme.palette.text),
Text(numberFormat.format(forkCount)),
],
2019-11-05 14:22:41 +01:00
),
2019-12-21 09:16:17 +01:00
),
],
2019-11-05 14:22:41 +01:00
),
2019-12-21 09:16:17 +01:00
),
]),
2019-02-04 11:32:39 +01:00
),
2019-12-21 09:16:17 +01:00
),
],
),
);
2019-12-21 09:16:17 +01:00
if (inRepoScreen) {
// return Material(child: InkWell(child: widget));
return widget;
} else {
return Link(
url: '/$owner/$name',
child: widget,
);
}
}
}