2019-01-29 13:34:52 +08:00
|
|
|
import 'dart:core';
|
2019-01-28 21:32:01 +08:00
|
|
|
import 'package:flutter/material.dart';
|
|
|
|
import 'package:flutter/cupertino.dart';
|
2021-01-17 22:08:32 +08:00
|
|
|
import 'package:git_touch/graphql/github.data.gql.dart';
|
|
|
|
import 'package:git_touch/graphql/schema.schema.gql.dart';
|
2019-11-08 18:29:08 +08:00
|
|
|
import 'package:git_touch/models/theme.dart';
|
2020-01-12 15:44:07 +08:00
|
|
|
import 'package:git_touch/widgets/label.dart';
|
2019-11-08 18:29:08 +08:00
|
|
|
import 'package:provider/provider.dart';
|
2019-01-31 14:37:25 +08:00
|
|
|
import '../utils/utils.dart';
|
2019-02-07 14:35:19 +08:00
|
|
|
import 'comment_item.dart';
|
2019-01-28 21:32:01 +08:00
|
|
|
|
2021-05-16 15:16:35 +08:00
|
|
|
TextSpan createUserSpan(BuildContext context, String? login) {
|
2020-11-08 19:54:18 +08:00
|
|
|
return createLinkSpan(context, login, '/github/$login');
|
|
|
|
}
|
|
|
|
|
2019-09-07 17:48:59 +08:00
|
|
|
class TimelineEventItem extends StatelessWidget {
|
2021-05-16 15:16:35 +08:00
|
|
|
final String? actor;
|
2019-09-07 17:48:59 +08:00
|
|
|
final IconData iconData;
|
|
|
|
final Color iconColor;
|
2021-05-16 15:16:35 +08:00
|
|
|
final TextSpan? textSpan;
|
2019-01-28 21:32:01 +08:00
|
|
|
|
2019-09-07 17:48:59 +08:00
|
|
|
TimelineEventItem({
|
|
|
|
this.actor,
|
|
|
|
this.iconData = Octicons.octoface,
|
2020-01-12 15:44:07 +08:00
|
|
|
this.iconColor = Colors.grey,
|
2019-09-07 17:48:59 +08:00
|
|
|
this.textSpan,
|
|
|
|
});
|
2019-01-28 21:32:01 +08:00
|
|
|
|
2019-09-07 17:48:59 +08:00
|
|
|
@override
|
|
|
|
Widget build(BuildContext context) {
|
2019-11-08 18:29:08 +08:00
|
|
|
final theme = Provider.of<ThemeModel>(context);
|
|
|
|
|
2019-01-28 21:32:01 +08:00
|
|
|
return Row(
|
|
|
|
children: <Widget>[
|
2019-09-07 17:48:59 +08:00
|
|
|
SizedBox(width: 6),
|
2019-02-09 15:33:06 +08:00
|
|
|
Icon(iconData, color: iconColor, size: 20),
|
2019-09-07 17:48:59 +08:00
|
|
|
SizedBox(width: 12),
|
2019-01-28 21:32:01 +08:00
|
|
|
Expanded(
|
2020-01-26 23:44:45 +08:00
|
|
|
child: Text.rich(
|
|
|
|
TextSpan(
|
2020-01-27 15:11:51 +08:00
|
|
|
style: TextStyle(color: theme.palette.text, fontSize: 16),
|
2019-11-08 18:29:08 +08:00
|
|
|
children: [
|
|
|
|
// TODO: actor is null
|
|
|
|
createUserSpan(context, actor),
|
2021-05-16 15:16:35 +08:00
|
|
|
textSpan!,
|
2019-11-08 18:29:08 +08:00
|
|
|
// TextSpan(text: ' ' + TimeAgo.formatFromString(item['createdAt']))
|
|
|
|
],
|
|
|
|
),
|
2019-01-28 21:32:01 +08:00
|
|
|
),
|
|
|
|
),
|
|
|
|
],
|
|
|
|
);
|
|
|
|
}
|
2019-09-07 17:48:59 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
class TimelineItem extends StatelessWidget {
|
2021-01-17 22:08:32 +08:00
|
|
|
final dynamic node;
|
|
|
|
TimelineItem(this.node);
|
2019-09-07 17:48:59 +08:00
|
|
|
|
2021-05-16 15:16:35 +08:00
|
|
|
Widget _buildFallback(String? type) {
|
2021-01-17 22:08:32 +08:00
|
|
|
return TimelineEventItem(
|
2019-02-08 14:30:22 +08:00
|
|
|
actor: '',
|
|
|
|
iconData: Octicons.octoface,
|
|
|
|
textSpan: TextSpan(children: [
|
|
|
|
TextSpan(text: 'Woops, $type type not implemented yet'),
|
|
|
|
]),
|
|
|
|
);
|
2021-01-17 22:08:32 +08:00
|
|
|
}
|
|
|
|
|
2021-05-16 15:16:35 +08:00
|
|
|
Widget _buildByType(BuildContext context, String? type) {
|
2021-01-17 22:08:32 +08:00
|
|
|
final theme = Provider.of<ThemeModel>(context);
|
2019-02-08 14:30:22 +08:00
|
|
|
|
|
|
|
switch (type) {
|
|
|
|
// common types
|
2020-01-12 16:03:11 +08:00
|
|
|
case 'PullRequestCommit':
|
2021-01-17 22:08:32 +08:00
|
|
|
final p = node as GPullRequestCommitParts;
|
2019-09-07 17:48:59 +08:00
|
|
|
return TimelineEventItem(
|
2021-05-16 15:16:35 +08:00
|
|
|
actor: p.commit.author!.user?.login,
|
2019-02-08 14:30:22 +08:00
|
|
|
iconData: Octicons.git_commit,
|
2019-01-28 21:32:01 +08:00
|
|
|
textSpan: TextSpan(children: [
|
2019-02-08 14:30:22 +08:00
|
|
|
TextSpan(text: ' added commit '),
|
2021-01-17 22:08:32 +08:00
|
|
|
TextSpan(text: p.commit.oid.substring(0, 8))
|
2019-01-28 21:32:01 +08:00
|
|
|
]),
|
|
|
|
);
|
2019-02-08 14:30:22 +08:00
|
|
|
case 'IssueComment':
|
2021-01-31 19:27:45 +08:00
|
|
|
return CommentItem.gql(
|
|
|
|
node as GCommentParts, node as GReactableParts, (item) {});
|
2019-02-08 14:30:22 +08:00
|
|
|
case 'CrossReferencedEvent':
|
2021-01-17 22:08:32 +08:00
|
|
|
final p = node as GCrossReferencedEventParts;
|
|
|
|
final source = p.source as dynamic;
|
|
|
|
final number = source.number;
|
|
|
|
final owner = source.repository.owner.login;
|
|
|
|
final name = source.repository.name;
|
|
|
|
final prefix = p.source.G__typename == 'Issue' ? 'issues' : 'pull';
|
2019-09-07 17:48:59 +08:00
|
|
|
return TimelineEventItem(
|
2021-05-16 15:16:35 +08:00
|
|
|
actor: p.actor!.login,
|
2019-02-08 14:30:22 +08:00
|
|
|
iconData: Octicons.primitive_dot,
|
2019-11-08 20:23:09 +08:00
|
|
|
iconColor: GithubPalette.open,
|
2020-10-08 14:30:13 +08:00
|
|
|
textSpan: TextSpan(children: [
|
|
|
|
TextSpan(text: ' referenced this on '),
|
|
|
|
createLinkSpan(context, '$owner/$name#$number',
|
|
|
|
'/github/$owner/$name/$prefix/$number'),
|
|
|
|
]),
|
2019-01-28 21:32:01 +08:00
|
|
|
);
|
|
|
|
case 'ClosedEvent':
|
2021-01-17 22:08:32 +08:00
|
|
|
final p = node as GClosedEventParts;
|
2019-09-07 17:48:59 +08:00
|
|
|
return TimelineEventItem(
|
2021-05-16 15:16:35 +08:00
|
|
|
actor: p.actor!.login,
|
2019-01-28 21:32:01 +08:00
|
|
|
iconData: Octicons.circle_slash,
|
2019-11-08 20:23:09 +08:00
|
|
|
iconColor: GithubPalette.closed,
|
2019-01-28 21:32:01 +08:00
|
|
|
textSpan: TextSpan(text: ' closed this '),
|
|
|
|
);
|
2019-02-08 14:30:22 +08:00
|
|
|
|
2019-01-28 21:32:01 +08:00
|
|
|
case 'ReopenedEvent':
|
2021-01-17 22:08:32 +08:00
|
|
|
final p = node as GReopenedEventParts;
|
2019-09-07 17:48:59 +08:00
|
|
|
return TimelineEventItem(
|
2021-05-16 15:16:35 +08:00
|
|
|
actor: p.actor!.login,
|
2019-01-28 21:32:01 +08:00
|
|
|
iconData: Octicons.primitive_dot,
|
2019-11-08 20:23:09 +08:00
|
|
|
iconColor: GithubPalette.open,
|
2019-01-28 21:32:01 +08:00
|
|
|
textSpan: TextSpan(text: ' reopened this '),
|
|
|
|
);
|
2019-02-08 14:30:22 +08:00
|
|
|
case 'SubscribedEvent':
|
2021-01-17 22:08:32 +08:00
|
|
|
final p = node as GSubscribedEventParts;
|
2020-02-09 18:46:26 +05:30
|
|
|
return TimelineEventItem(
|
2021-05-16 15:16:35 +08:00
|
|
|
actor: p.actor!.login,
|
2020-02-09 18:46:26 +05:30
|
|
|
textSpan: TextSpan(text: ' subscribed to this issue '),
|
|
|
|
);
|
2019-02-08 14:30:22 +08:00
|
|
|
case 'UnsubscribedEvent':
|
2021-01-17 22:08:32 +08:00
|
|
|
final p = node as GUnsubscribedEventParts;
|
2020-04-16 11:36:48 +08:00
|
|
|
return TimelineEventItem(
|
2021-05-16 15:16:35 +08:00
|
|
|
actor: p.actor!.login,
|
2020-04-08 18:09:29 +05:30
|
|
|
textSpan: TextSpan(text: ' unsubscribed from this issue '),
|
|
|
|
);
|
2019-02-08 14:30:22 +08:00
|
|
|
case 'ReferencedEvent':
|
2021-01-17 22:08:32 +08:00
|
|
|
final p = node as GReferencedEventParts;
|
2019-02-08 14:30:22 +08:00
|
|
|
// TODO: isCrossRepository
|
2021-01-17 22:08:32 +08:00
|
|
|
if (p.commit == null) {
|
2019-02-08 14:30:22 +08:00
|
|
|
return Container();
|
|
|
|
}
|
2021-01-17 22:08:32 +08:00
|
|
|
if (p.isCrossRepository) {
|
2020-04-08 18:09:29 +05:30
|
|
|
return TimelineEventItem(
|
2021-05-16 15:16:35 +08:00
|
|
|
actor: p.actor!.login,
|
2020-04-08 18:09:29 +05:30
|
|
|
iconData: Octicons.bookmark,
|
|
|
|
textSpan: TextSpan(children: [
|
|
|
|
TextSpan(text: ' referenced this pull request from commit '),
|
2021-05-16 15:16:35 +08:00
|
|
|
TextSpan(text: p.commit!.oid.substring(0, 8)),
|
2021-01-17 22:08:32 +08:00
|
|
|
TextSpan(text: ' from ' + p.commitRepository.name),
|
2020-04-08 18:09:29 +05:30
|
|
|
]),
|
|
|
|
);
|
|
|
|
}
|
2019-09-07 17:48:59 +08:00
|
|
|
return TimelineEventItem(
|
2021-05-16 15:16:35 +08:00
|
|
|
actor: p.actor!.login,
|
2019-02-08 14:30:22 +08:00
|
|
|
iconData: Octicons.bookmark,
|
|
|
|
textSpan: TextSpan(children: [
|
|
|
|
TextSpan(text: ' referenced this pull request from commit '),
|
2021-05-16 15:16:35 +08:00
|
|
|
TextSpan(text: p.commit!.oid.substring(0, 8)),
|
2019-02-08 14:30:22 +08:00
|
|
|
]),
|
|
|
|
);
|
|
|
|
case 'AssignedEvent':
|
2021-01-17 22:08:32 +08:00
|
|
|
final p = node as GAssignedEventParts;
|
|
|
|
final assignee = (p.assignee as dynamic).login;
|
2019-09-07 17:48:59 +08:00
|
|
|
return TimelineEventItem(
|
2021-05-16 15:16:35 +08:00
|
|
|
actor: p.actor!.login,
|
2019-02-08 14:30:22 +08:00
|
|
|
iconData: Octicons.key,
|
|
|
|
textSpan: TextSpan(children: [
|
|
|
|
TextSpan(text: ' assigned this to '),
|
2021-01-17 22:08:32 +08:00
|
|
|
createLinkSpan(context, assignee, '/github/$assignee'),
|
2019-02-08 14:30:22 +08:00
|
|
|
]),
|
2019-01-28 21:32:01 +08:00
|
|
|
);
|
2019-02-08 14:30:22 +08:00
|
|
|
case 'UnassignedEvent':
|
2021-01-17 22:08:32 +08:00
|
|
|
final p = node as GUnassignedEventParts;
|
|
|
|
final assignee = (p.assignee as dynamic).login;
|
2020-04-08 18:09:29 +05:30
|
|
|
return TimelineEventItem(
|
2021-05-16 15:16:35 +08:00
|
|
|
actor: p.actor!.login,
|
2020-04-08 18:09:29 +05:30
|
|
|
iconData: Octicons.key,
|
|
|
|
textSpan: TextSpan(children: [
|
|
|
|
TextSpan(text: ' unassigned this from '),
|
2021-01-17 22:08:32 +08:00
|
|
|
createLinkSpan(context, assignee, '/github/$assignee')
|
2020-04-08 18:09:29 +05:30
|
|
|
]),
|
|
|
|
);
|
2019-01-29 13:34:52 +08:00
|
|
|
case 'LabeledEvent':
|
2021-01-17 22:08:32 +08:00
|
|
|
final p = node as GLabeledEventParts;
|
2019-09-07 17:48:59 +08:00
|
|
|
return TimelineEventItem(
|
2021-05-16 15:16:35 +08:00
|
|
|
actor: p.actor!.login,
|
2019-01-29 13:34:52 +08:00
|
|
|
iconData: Octicons.tag,
|
|
|
|
textSpan: TextSpan(children: [
|
|
|
|
TextSpan(text: ' added '),
|
2021-01-17 22:08:32 +08:00
|
|
|
WidgetSpan(
|
|
|
|
child: MyLabel(name: p.label.name, cssColor: p.label.color)),
|
2019-01-29 13:34:52 +08:00
|
|
|
TextSpan(text: ' label'),
|
|
|
|
]),
|
|
|
|
);
|
|
|
|
case 'UnlabeledEvent':
|
2021-01-17 22:08:32 +08:00
|
|
|
final p = node as GUnlabeledEventParts;
|
2019-09-07 17:48:59 +08:00
|
|
|
return TimelineEventItem(
|
2021-05-16 15:16:35 +08:00
|
|
|
actor: p.actor!.login,
|
2019-01-29 13:34:52 +08:00
|
|
|
iconData: Octicons.tag,
|
|
|
|
textSpan: TextSpan(children: [
|
|
|
|
TextSpan(text: ' removed '),
|
2021-01-17 22:08:32 +08:00
|
|
|
WidgetSpan(
|
|
|
|
child: MyLabel(name: p.label.name, cssColor: p.label.color)),
|
2019-01-29 13:34:52 +08:00
|
|
|
TextSpan(text: ' label'),
|
|
|
|
]),
|
|
|
|
);
|
|
|
|
case 'MilestonedEvent':
|
2021-01-17 22:08:32 +08:00
|
|
|
final p = node as GMilestonedEventParts;
|
2019-09-07 17:48:59 +08:00
|
|
|
return TimelineEventItem(
|
2021-05-16 15:16:35 +08:00
|
|
|
actor: p.actor!.login,
|
2019-01-29 13:34:52 +08:00
|
|
|
iconData: Octicons.milestone,
|
|
|
|
textSpan: TextSpan(children: [
|
|
|
|
TextSpan(text: ' added this to '),
|
2021-01-17 22:08:32 +08:00
|
|
|
TextSpan(text: p.milestoneTitle),
|
2019-01-29 13:34:52 +08:00
|
|
|
TextSpan(text: ' milestone'),
|
|
|
|
]),
|
|
|
|
);
|
2019-02-08 14:30:22 +08:00
|
|
|
case 'DemilestonedEvent':
|
2021-01-17 22:08:32 +08:00
|
|
|
final p = node as GDemilestonedEventParts;
|
2020-04-08 18:09:29 +05:30
|
|
|
return TimelineEventItem(
|
2021-05-16 15:16:35 +08:00
|
|
|
actor: p.actor!.login,
|
2020-04-08 18:09:29 +05:30
|
|
|
iconData: Octicons.milestone,
|
|
|
|
textSpan: TextSpan(children: [
|
|
|
|
TextSpan(text: ' removed this from '),
|
2021-01-17 22:08:32 +08:00
|
|
|
TextSpan(text: p.milestoneTitle),
|
2020-04-08 18:09:29 +05:30
|
|
|
TextSpan(text: ' milestone'),
|
|
|
|
]),
|
|
|
|
);
|
2019-02-08 14:30:22 +08:00
|
|
|
case 'RenamedTitleEvent':
|
2021-01-17 22:08:32 +08:00
|
|
|
final p = node as GRenamedTitleEventParts;
|
2019-09-07 17:48:59 +08:00
|
|
|
return TimelineEventItem(
|
2021-05-16 15:16:35 +08:00
|
|
|
actor: p.actor!.login,
|
2019-02-08 14:30:22 +08:00
|
|
|
iconData: Octicons.pencil,
|
2019-01-29 13:34:52 +08:00
|
|
|
textSpan: TextSpan(children: [
|
2019-02-08 14:30:22 +08:00
|
|
|
TextSpan(text: ' changed the title '),
|
|
|
|
TextSpan(
|
2021-01-17 22:08:32 +08:00
|
|
|
text: p.previousTitle,
|
2019-02-08 14:30:22 +08:00
|
|
|
style: TextStyle(decoration: TextDecoration.lineThrough),
|
|
|
|
),
|
|
|
|
TextSpan(text: ' to '),
|
2021-01-17 22:08:32 +08:00
|
|
|
TextSpan(text: p.currentTitle)
|
2019-01-29 13:34:52 +08:00
|
|
|
]),
|
|
|
|
);
|
2019-02-08 14:30:22 +08:00
|
|
|
case 'LockedEvent':
|
2021-01-17 22:08:32 +08:00
|
|
|
final p = node as GLockedEventParts;
|
2019-09-07 17:48:59 +08:00
|
|
|
return TimelineEventItem(
|
2021-05-16 15:16:35 +08:00
|
|
|
actor: p.actor!.login,
|
2019-02-08 14:30:22 +08:00
|
|
|
iconData: Octicons.lock,
|
2019-01-29 13:34:52 +08:00
|
|
|
textSpan: TextSpan(children: [
|
2019-02-08 14:30:22 +08:00
|
|
|
TextSpan(text: ' locked this conversation '),
|
2019-01-29 13:34:52 +08:00
|
|
|
]),
|
|
|
|
);
|
2019-02-08 14:30:22 +08:00
|
|
|
case 'UnlockedEvent':
|
2021-01-17 22:08:32 +08:00
|
|
|
final p = node as GUnlockedEventParts;
|
2019-09-07 17:48:59 +08:00
|
|
|
return TimelineEventItem(
|
2021-05-16 15:16:35 +08:00
|
|
|
actor: p.actor!.login,
|
2019-01-29 13:34:52 +08:00
|
|
|
iconData: Octicons.key,
|
|
|
|
textSpan: TextSpan(children: [
|
2019-02-08 14:30:22 +08:00
|
|
|
TextSpan(text: ' unlocked this conversation '),
|
2019-01-29 13:34:52 +08:00
|
|
|
]),
|
|
|
|
);
|
2019-02-08 14:30:22 +08:00
|
|
|
case 'TransferredEvent':
|
2021-01-17 22:08:32 +08:00
|
|
|
final p = node as GTransferredEventParts;
|
2020-04-16 11:36:48 +08:00
|
|
|
return TimelineEventItem(
|
2021-05-16 15:16:35 +08:00
|
|
|
actor: p.actor!.login,
|
2020-04-16 11:36:48 +08:00
|
|
|
textSpan: TextSpan(
|
2020-04-08 18:09:29 +05:30
|
|
|
children: [
|
2020-04-16 11:36:48 +08:00
|
|
|
TextSpan(
|
2021-05-16 15:16:35 +08:00
|
|
|
text: ' transferred this issue from ' + p.fromRepository!.name)
|
2020-04-08 18:09:29 +05:30
|
|
|
],
|
|
|
|
),
|
|
|
|
);
|
2019-02-08 14:30:22 +08:00
|
|
|
|
|
|
|
// pull request only types
|
|
|
|
case 'CommitCommentThread':
|
2021-01-17 22:08:32 +08:00
|
|
|
return _buildFallback(type); // TODO:
|
2019-01-28 21:32:01 +08:00
|
|
|
case 'PullRequestReview':
|
2021-01-17 22:08:32 +08:00
|
|
|
final p = node as GPullRequestReviewParts;
|
|
|
|
return Column(
|
|
|
|
children: <Widget>[
|
|
|
|
TimelineEventItem(
|
2021-05-16 15:16:35 +08:00
|
|
|
actor: p.author!.login,
|
2021-01-17 22:08:32 +08:00
|
|
|
iconColor: GithubPalette.open,
|
|
|
|
iconData: Octicons.check,
|
|
|
|
textSpan: p.state == GPullRequestReviewState.APPROVED
|
|
|
|
? TextSpan(text: ' approved these changes')
|
|
|
|
: p.state == GPullRequestReviewState.COMMENTED
|
|
|
|
? TextSpan(text: ' reviewed ')
|
|
|
|
: warningSpan),
|
|
|
|
Container(
|
|
|
|
padding: CommonStyle.padding.copyWith(left: 50),
|
|
|
|
child: Column(
|
|
|
|
children: <Widget>[
|
2021-05-16 15:16:35 +08:00
|
|
|
for (var v in p.comments.nodes!)
|
2021-01-31 19:27:45 +08:00
|
|
|
CommentItem.gql(v, v, (key) {}),
|
2021-01-17 22:08:32 +08:00
|
|
|
],
|
|
|
|
),
|
|
|
|
),
|
|
|
|
],
|
2019-01-28 21:32:01 +08:00
|
|
|
);
|
2019-02-08 14:30:22 +08:00
|
|
|
case 'PullRequestReviewThread':
|
|
|
|
case 'PullRequestReviewComment':
|
2021-01-17 22:08:32 +08:00
|
|
|
return _buildFallback(type); // TODO:
|
2019-01-28 21:32:01 +08:00
|
|
|
case 'MergedEvent':
|
2021-01-17 22:08:32 +08:00
|
|
|
final p = node as GMergedEventParts;
|
2019-09-07 17:48:59 +08:00
|
|
|
return TimelineEventItem(
|
2021-05-16 15:16:35 +08:00
|
|
|
actor: p.actor!.login,
|
2019-01-28 21:32:01 +08:00
|
|
|
iconData: Octicons.git_merge,
|
2019-11-08 20:23:09 +08:00
|
|
|
iconColor: GithubPalette.merged,
|
2019-01-28 21:32:01 +08:00
|
|
|
textSpan: TextSpan(children: [
|
|
|
|
TextSpan(text: ' merged commit '),
|
2021-05-16 15:16:35 +08:00
|
|
|
TextSpan(text: p.commit!.oid.substring(0, 8)),
|
2019-01-28 21:32:01 +08:00
|
|
|
TextSpan(text: ' into '),
|
2021-01-17 22:08:32 +08:00
|
|
|
TextSpan(text: p.mergeRefName),
|
2019-01-28 21:32:01 +08:00
|
|
|
]),
|
|
|
|
);
|
2020-02-09 18:46:26 +05:30
|
|
|
case 'MentionedEvent':
|
2021-01-17 22:08:32 +08:00
|
|
|
final p = node as GMentionedEventParts;
|
2020-02-09 18:46:26 +05:30
|
|
|
return TimelineEventItem(
|
2021-05-16 15:16:35 +08:00
|
|
|
actor: p.actor!.login,
|
2020-02-09 18:46:26 +05:30
|
|
|
iconData: Octicons.bookmark,
|
2020-02-09 18:55:51 +05:30
|
|
|
textSpan: TextSpan(text: ' was mentioned '),
|
2020-02-09 18:46:26 +05:30
|
|
|
);
|
|
|
|
case 'PinnedEvent':
|
2021-01-17 22:08:32 +08:00
|
|
|
final p = node as GPinnedEventParts;
|
2020-02-09 18:46:26 +05:30
|
|
|
return TimelineEventItem(
|
2021-05-16 15:16:35 +08:00
|
|
|
actor: p.actor!.login,
|
2020-02-09 18:46:26 +05:30
|
|
|
iconData: Octicons.pin,
|
|
|
|
textSpan: TextSpan(text: ' pinned this issue '),
|
|
|
|
);
|
2019-02-08 14:30:22 +08:00
|
|
|
case 'DeployedEvent':
|
2021-01-17 22:08:32 +08:00
|
|
|
final p = node as GDeployedEventParts;
|
2020-04-16 11:36:48 +08:00
|
|
|
return TimelineEventItem(
|
2021-05-16 15:16:35 +08:00
|
|
|
actor: p.actor!.login,
|
2020-04-16 11:36:48 +08:00
|
|
|
textSpan: TextSpan(
|
2021-05-16 15:16:35 +08:00
|
|
|
text: ' deployed the pull request ' + p.pullRequest.headRef!.name),
|
2020-04-08 18:09:29 +05:30
|
|
|
);
|
2019-02-08 14:30:22 +08:00
|
|
|
case 'DeploymentEnvironmentChangedEvent':
|
2021-01-17 22:08:32 +08:00
|
|
|
final p = node as GDeploymentEnvironmentChangedEventParts;
|
2020-04-16 11:36:48 +08:00
|
|
|
return TimelineEventItem(
|
2021-05-16 15:16:35 +08:00
|
|
|
actor: p.actor!.login,
|
2020-04-16 11:36:48 +08:00
|
|
|
textSpan: TextSpan(
|
|
|
|
text: ' changed the deployment environment to ' +
|
2021-05-16 15:16:35 +08:00
|
|
|
p.deploymentStatus.deployment.environment!),
|
2020-04-08 18:09:29 +05:30
|
|
|
);
|
2019-01-28 21:32:01 +08:00
|
|
|
case 'HeadRefDeletedEvent':
|
2021-01-17 22:08:32 +08:00
|
|
|
final p = node as GHeadRefDeletedEventParts;
|
2019-09-07 17:48:59 +08:00
|
|
|
return TimelineEventItem(
|
2021-05-16 15:16:35 +08:00
|
|
|
actor: p.actor!.login,
|
2019-01-28 21:32:01 +08:00
|
|
|
iconData: Octicons.git_branch,
|
|
|
|
textSpan: TextSpan(children: [
|
|
|
|
TextSpan(text: ' deleted the '),
|
2021-01-17 22:08:32 +08:00
|
|
|
TextSpan(text: p.headRefName),
|
2019-01-28 21:32:01 +08:00
|
|
|
TextSpan(text: ' branch'),
|
|
|
|
]),
|
|
|
|
);
|
2019-02-08 14:30:22 +08:00
|
|
|
case 'HeadRefRestoredEvent':
|
2021-01-17 22:08:32 +08:00
|
|
|
final p = node as GHeadRefRestoredEventParts;
|
2020-04-16 11:36:48 +08:00
|
|
|
return TimelineEventItem(
|
2021-05-16 15:16:35 +08:00
|
|
|
actor: p.actor!.login,
|
2020-04-16 11:36:48 +08:00
|
|
|
textSpan: TextSpan(children: [
|
|
|
|
TextSpan(text: ' restored the '),
|
2021-01-17 22:08:32 +08:00
|
|
|
WidgetSpan(child: PrimerBranchName(p.pullRequest.headRefName)),
|
2020-04-16 11:36:48 +08:00
|
|
|
TextSpan(text: ' branch')
|
|
|
|
]),
|
2020-04-08 18:09:29 +05:30
|
|
|
);
|
2019-02-08 14:30:22 +08:00
|
|
|
case 'HeadRefForcePushedEvent':
|
2021-01-17 22:08:32 +08:00
|
|
|
final p = node as GHeadRefForcePushedEventParts;
|
2019-11-30 23:49:05 +08:00
|
|
|
return TimelineEventItem(
|
|
|
|
iconData: Octicons.repo_force_push,
|
2021-05-16 15:16:35 +08:00
|
|
|
actor: p.actor!.login,
|
2019-11-30 23:49:05 +08:00
|
|
|
textSpan: TextSpan(
|
|
|
|
children: [
|
|
|
|
TextSpan(text: ' force-pushed the '),
|
2021-01-17 22:08:32 +08:00
|
|
|
WidgetSpan(child: PrimerBranchName(p.pullRequest.headRefName)),
|
2019-11-30 23:49:05 +08:00
|
|
|
TextSpan(text: ' branch from '),
|
|
|
|
TextSpan(
|
2021-05-16 15:16:35 +08:00
|
|
|
text: p.beforeCommit!.oid.substring(0, 7),
|
2020-01-27 15:11:51 +08:00
|
|
|
style: TextStyle(color: theme.palette.primary),
|
2019-11-30 23:49:05 +08:00
|
|
|
),
|
|
|
|
TextSpan(text: ' to '),
|
|
|
|
TextSpan(
|
2021-05-16 15:16:35 +08:00
|
|
|
text: p.afterCommit!.oid.substring(0, 7),
|
2020-01-27 15:11:51 +08:00
|
|
|
style: TextStyle(color: theme.palette.primary),
|
2019-11-30 23:49:05 +08:00
|
|
|
),
|
|
|
|
],
|
|
|
|
),
|
|
|
|
);
|
2019-02-08 14:30:22 +08:00
|
|
|
case 'BaseRefForcePushedEvent':
|
2021-01-17 22:08:32 +08:00
|
|
|
final p = node as GBaseRefForcePushedEventParts;
|
2020-04-08 18:09:29 +05:30
|
|
|
return TimelineEventItem(
|
|
|
|
iconData: Octicons.repo_force_push,
|
2021-05-16 15:16:35 +08:00
|
|
|
actor: p.actor!.login,
|
2020-04-08 18:09:29 +05:30
|
|
|
textSpan: TextSpan(
|
|
|
|
children: [
|
|
|
|
TextSpan(text: ' force-pushed the '),
|
2021-05-16 15:16:35 +08:00
|
|
|
WidgetSpan(child: PrimerBranchName(p.pullRequest.baseRef!.name)),
|
2020-04-08 18:09:29 +05:30
|
|
|
TextSpan(text: ' branch from '),
|
|
|
|
TextSpan(
|
2021-05-16 15:16:35 +08:00
|
|
|
text: p.beforeCommit!.oid.substring(0, 7),
|
2020-04-08 18:09:29 +05:30
|
|
|
style: TextStyle(color: theme.palette.primary),
|
|
|
|
),
|
|
|
|
TextSpan(text: ' to '),
|
|
|
|
TextSpan(
|
2021-05-16 15:16:35 +08:00
|
|
|
text: p.afterCommit!.oid.substring(0, 7),
|
2020-04-08 18:09:29 +05:30
|
|
|
style: TextStyle(color: theme.palette.primary),
|
|
|
|
),
|
|
|
|
],
|
|
|
|
),
|
|
|
|
);
|
2019-02-08 14:30:22 +08:00
|
|
|
case 'ReviewRequestedEvent':
|
2021-01-17 22:08:32 +08:00
|
|
|
final p = node as GReviewRequestedEventParts;
|
2019-09-07 17:48:59 +08:00
|
|
|
return TimelineEventItem(
|
2019-02-08 14:30:22 +08:00
|
|
|
iconData: Octicons.eye,
|
2021-05-16 15:16:35 +08:00
|
|
|
actor: p.actor!.login,
|
2019-01-28 21:32:01 +08:00
|
|
|
textSpan: TextSpan(children: [
|
2019-02-08 14:30:22 +08:00
|
|
|
TextSpan(text: ' requested a review from '),
|
2021-01-17 22:08:32 +08:00
|
|
|
createUserSpan(
|
|
|
|
context,
|
|
|
|
(p.requestedReviewer
|
|
|
|
as GReviewRequestedEventParts_requestedReviewer__asUser)
|
|
|
|
.login),
|
2019-01-28 21:32:01 +08:00
|
|
|
]),
|
|
|
|
);
|
2019-02-08 14:30:22 +08:00
|
|
|
case 'ReviewRequestRemovedEvent':
|
2021-01-17 22:08:32 +08:00
|
|
|
final p = node as GReviewRequestRemovedEventParts;
|
2020-04-08 18:09:29 +05:30
|
|
|
return TimelineEventItem(
|
|
|
|
iconData: Octicons.eye,
|
2021-05-16 15:16:35 +08:00
|
|
|
actor: p.actor!.login,
|
2020-04-08 18:09:29 +05:30
|
|
|
textSpan: TextSpan(children: [
|
|
|
|
TextSpan(text: ' removed '),
|
2021-01-17 22:08:32 +08:00
|
|
|
createUserSpan(
|
|
|
|
context,
|
|
|
|
(p.requestedReviewer
|
|
|
|
as GReviewRequestRemovedEventParts_requestedReviewer__asUser)
|
|
|
|
.login),
|
2020-04-08 18:09:29 +05:30
|
|
|
TextSpan(text: ' from the review request '),
|
|
|
|
]),
|
|
|
|
);
|
2019-02-08 14:30:22 +08:00
|
|
|
case 'ReviewDismissedEvent':
|
2021-01-17 22:08:32 +08:00
|
|
|
final p = node as GReviewDismissedEventParts;
|
2020-04-16 11:36:48 +08:00
|
|
|
return TimelineEventItem(
|
2020-04-08 18:09:29 +05:30
|
|
|
iconData: Octicons.eye,
|
2021-05-16 15:16:35 +08:00
|
|
|
actor: p.actor!.login,
|
2020-04-08 18:09:29 +05:30
|
|
|
textSpan: TextSpan(children: [
|
|
|
|
TextSpan(text: ' dismissed the pull request review requested by '),
|
2021-05-16 15:16:35 +08:00
|
|
|
createUserSpan(context, p.pullRequest.author!.login),
|
2020-04-08 18:09:29 +05:30
|
|
|
]),
|
|
|
|
);
|
2019-01-28 21:32:01 +08:00
|
|
|
default:
|
2021-01-17 22:08:32 +08:00
|
|
|
return _buildFallback(type);
|
2019-01-28 21:32:01 +08:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
@override
|
|
|
|
Widget build(BuildContext context) {
|
2021-01-17 22:08:32 +08:00
|
|
|
return Container(
|
2019-10-02 16:09:54 +08:00
|
|
|
padding: CommonStyle.padding,
|
2021-01-17 22:08:32 +08:00
|
|
|
child: _buildByType(context, node.G__typename),
|
2019-01-28 21:32:01 +08:00
|
|
|
);
|
|
|
|
}
|
|
|
|
}
|