211 lines
6.3 KiB
Dart
211 lines
6.3 KiB
Dart
import 'package:flutter/material.dart';
|
|
import 'package:flutter/cupertino.dart';
|
|
import '../screens/issue.dart';
|
|
import '../screens/pull_request.dart';
|
|
import '../screens/user.dart';
|
|
import '../utils/utils.dart';
|
|
import 'avatar.dart';
|
|
|
|
/// Events types:
|
|
///
|
|
/// https://developer.github.com/v3/activity/events/types/#event-types--payloads
|
|
class EventItem extends StatelessWidget {
|
|
final Event event;
|
|
EventItem(this.event);
|
|
|
|
TextSpan _buildRepo(BuildContext context) {
|
|
String name = event.repo.name;
|
|
var arr = name.split('/');
|
|
return createRepoLinkSpan(context, arr[0], arr[1]);
|
|
}
|
|
|
|
TextSpan _buildIssue(BuildContext context) {
|
|
int id = event.payload['issue']['number'];
|
|
String name = event.repo.name;
|
|
var arr = name.split('/');
|
|
return createLinkSpan(
|
|
context, '#' + id.toString(), () => IssueScreen(id, arr[0], arr[1]));
|
|
}
|
|
|
|
TextSpan _buildPullRequest(BuildContext context, int id) {
|
|
String name = event.repo.name;
|
|
var arr = name.split('/');
|
|
return createLinkSpan(context, '#' + id.toString(),
|
|
() => PullRequestScreen(id, arr[0], arr[1]));
|
|
}
|
|
|
|
Widget _buildItem({
|
|
@required BuildContext context,
|
|
@required List<TextSpan> spans,
|
|
String detail,
|
|
IconData iconData = Octicons.octoface,
|
|
}) {
|
|
var _spans = [
|
|
createLinkSpan(
|
|
context,
|
|
event.actor.login,
|
|
() => UserScreen(event.actor.login),
|
|
)
|
|
];
|
|
_spans.addAll(spans);
|
|
|
|
return Container(
|
|
padding: EdgeInsets.all(8),
|
|
child: Column(
|
|
crossAxisAlignment: CrossAxisAlignment.start,
|
|
children: <Widget>[
|
|
Row(
|
|
children: <Widget>[
|
|
Avatar(login: event.actor.login, url: event.actor.avatarUrl),
|
|
Padding(padding: EdgeInsets.only(left: 10)),
|
|
Expanded(
|
|
child: RichText(
|
|
text: TextSpan(
|
|
style: TextStyle(
|
|
color: Colors.black,
|
|
height: 1.3,
|
|
fontSize: 15,
|
|
),
|
|
children: _spans,
|
|
),
|
|
),
|
|
),
|
|
Padding(padding: EdgeInsets.only(left: 8)),
|
|
Icon(
|
|
iconData,
|
|
color: CupertinoColors.inactiveGray,
|
|
size: 22,
|
|
),
|
|
],
|
|
),
|
|
detail == null
|
|
? Container()
|
|
: Container(
|
|
padding: EdgeInsets.only(left: 46, top: 6),
|
|
child: Text(
|
|
detail,
|
|
overflow: TextOverflow.ellipsis,
|
|
maxLines: 3,
|
|
style: TextStyle(
|
|
color: Colors.black87,
|
|
fontSize: 14,
|
|
height: 1.2,
|
|
fontWeight: FontWeight.w300,
|
|
),
|
|
),
|
|
)
|
|
],
|
|
),
|
|
);
|
|
}
|
|
|
|
@override
|
|
build(BuildContext context) {
|
|
switch (event.type) {
|
|
case 'IssuesEvent':
|
|
return _buildItem(
|
|
context: context,
|
|
spans: [
|
|
TextSpan(text: ' ${event.payload['action']} issue '),
|
|
_buildIssue(context),
|
|
TextSpan(text: ' at '),
|
|
_buildRepo(context),
|
|
],
|
|
iconData: Octicons.issue_opened,
|
|
detail: event.payload['issue']['title'],
|
|
);
|
|
case 'PushEvent':
|
|
return _buildItem(
|
|
context: context,
|
|
spans: [
|
|
TextSpan(text: ' pushed to '),
|
|
TextSpan(
|
|
text: event.payload['ref'],
|
|
style: TextStyle(color: CupertinoColors.activeBlue),
|
|
),
|
|
TextSpan(text: ' at '),
|
|
_buildRepo(context),
|
|
TextSpan(text: '')
|
|
],
|
|
iconData: Octicons.repo_push,
|
|
);
|
|
case 'PullRequestEvent':
|
|
return _buildItem(
|
|
context: context,
|
|
spans: [
|
|
TextSpan(text: ' ${event.payload['action']} pull request '),
|
|
_buildPullRequest(context, event.payload['pull_request']['number']),
|
|
TextSpan(text: ' at '),
|
|
_buildRepo(context),
|
|
],
|
|
iconData: Octicons.git_pull_request,
|
|
detail: event.payload['pull_request']['title'],
|
|
);
|
|
case 'PullRequestReviewCommentEvent':
|
|
return _buildItem(
|
|
context: context,
|
|
spans: [
|
|
TextSpan(text: ' reviewed pull request '),
|
|
_buildPullRequest(context, event.payload['pull_request']['number']),
|
|
TextSpan(text: ' at '),
|
|
_buildRepo(context),
|
|
],
|
|
detail: event.payload['comment']['body'],
|
|
);
|
|
case 'WatchEvent':
|
|
return _buildItem(
|
|
context: context,
|
|
spans: [
|
|
TextSpan(text: ' ${event.payload['action']} '),
|
|
_buildRepo(context)
|
|
],
|
|
iconData: Octicons.star,
|
|
);
|
|
case 'IssueCommentEvent':
|
|
bool isIssue = event.payload['issue']['pull_request'] == null;
|
|
String resource = isIssue ? 'issue' : 'pull request';
|
|
TextSpan link = isIssue
|
|
? _buildIssue(context)
|
|
: _buildPullRequest(context, event.payload['issue']['number']);
|
|
|
|
return _buildItem(
|
|
context: context,
|
|
spans: [
|
|
TextSpan(text: ' commented on $resource '),
|
|
link,
|
|
TextSpan(text: ' at '),
|
|
_buildRepo(context),
|
|
// TextSpan(text: event.payload['comment']['body'])
|
|
],
|
|
detail: event.payload['comment']['body'],
|
|
iconData: Octicons.comment_discussion,
|
|
);
|
|
case 'ForkEvent':
|
|
return _buildItem(
|
|
context: context,
|
|
spans: [
|
|
TextSpan(text: ' forked '),
|
|
createRepoLinkSpan(
|
|
context,
|
|
event.payload['forkee']['owner']['login'],
|
|
event.payload['forkee']['name']),
|
|
TextSpan(text: ' from '),
|
|
_buildRepo(context),
|
|
],
|
|
iconData: Octicons.repo_forked,
|
|
);
|
|
default:
|
|
return _buildItem(
|
|
context: context,
|
|
spans: [
|
|
TextSpan(
|
|
text: ' Type ${event.type} Not implement yet',
|
|
style: TextStyle(color: CupertinoColors.destructiveRed),
|
|
),
|
|
],
|
|
iconData: Octicons.octoface,
|
|
);
|
|
}
|
|
}
|
|
}
|