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

504 lines
18 KiB
Dart
Raw Normal View History

2019-01-29 06:34:52 +01:00
import 'dart:core';
2022-09-12 05:46:42 +02:00
2022-09-24 09:36:22 +02:00
import 'package:antd_mobile/antd_mobile.dart';
2022-09-17 14:35:45 +02:00
import 'package:flutter/widgets.dart';
2022-09-12 05:46:42 +02:00
import 'package:flutter_gen/gen_l10n/S.dart';
import 'package:git_touch/utils/utils.dart';
2022-09-21 18:56:02 +02:00
import 'package:git_touch/widgets/branch_name.dart';
import 'package:git_touch/widgets/comment_item.dart';
2022-09-21 18:56:02 +02:00
import 'package:git_touch/widgets/hex_color_tag.dart';
import 'package:gql_github/issue.data.gql.dart';
import 'package:gql_github/schema.schema.gql.dart';
2021-05-16 09:16:35 +02:00
TextSpan createUserSpan(BuildContext context, String? login) {
2020-11-08 12:54:18 +01:00
return createLinkSpan(context, login, '/github/$login');
}
2019-09-07 11:48:59 +02:00
class TimelineEventItem extends StatelessWidget {
2022-09-06 18:28:12 +02:00
const TimelineEventItem({
2019-09-07 11:48:59 +02:00
this.actor,
2022-09-17 16:35:45 +02:00
this.iconData = Octicons.diamond,
this.iconColor,
2019-09-07 11:48:59 +02:00
this.textSpan,
});
2022-09-21 18:28:21 +02:00
final String? actor;
final IconData iconData;
final Color? iconColor;
2022-09-21 18:28:21 +02:00
final TextSpan? textSpan;
2019-09-07 11:48:59 +02:00
@override
Widget build(BuildContext context) {
return Row(
children: <Widget>[
2022-09-06 18:28:12 +02:00
const SizedBox(width: 6),
Icon(iconData, color: iconColor, size: 20),
2022-09-06 18:28:12 +02:00
const SizedBox(width: 12),
Expanded(
2020-01-26 16:44:45 +01:00
child: Text.rich(
TextSpan(
2022-09-24 20:46:37 +02:00
style: TextStyle(
color: AntTheme.of(context).colorText, fontSize: 16),
2019-11-08 11:29:08 +01:00
children: [
// TODO: actor is null
createUserSpan(context, actor),
2021-05-16 09:16:35 +02:00
textSpan!,
2019-11-08 11:29:08 +01:00
// TextSpan(text: ' ' + TimeAgo.formatFromString(item['createdAt']))
],
),
),
),
],
);
}
2019-09-07 11:48:59 +02:00
}
class TimelineItem extends StatelessWidget {
2022-09-06 18:28:12 +02:00
const TimelineItem(this.node);
2022-09-21 18:28:21 +02:00
final dynamic node;
2019-09-07 11:48:59 +02:00
Widget _buildFallback(String? type, BuildContext context) {
2021-01-17 15:08:32 +01:00
return TimelineEventItem(
2019-02-08 07:30:22 +01:00
actor: '',
2022-09-17 16:35:45 +02:00
iconData: Octicons.diamond,
2019-02-08 07:30:22 +01:00
textSpan: TextSpan(children: [
TextSpan(
text:
'$type ${AppLocalizations.of(context)!.timelineTypeNotImplemented}'),
2019-02-08 07:30:22 +01:00
]),
);
2021-01-17 15:08:32 +01:00
}
2021-05-16 09:16:35 +02:00
Widget _buildByType(BuildContext context, String? type) {
2019-02-08 07:30:22 +01:00
switch (type) {
// common types
2020-01-12 09:03:11 +01:00
case 'PullRequestCommit':
2021-01-17 15:08:32 +01:00
final p = node as GPullRequestCommitParts;
2019-09-07 11:48:59 +02:00
return TimelineEventItem(
2021-05-16 09:16:35 +02:00
actor: p.commit.author!.user?.login,
2019-02-08 07:30:22 +01:00
iconData: Octicons.git_commit,
textSpan: TextSpan(children: [
TextSpan(
text:
' ${AppLocalizations.of(context)!.pullRequestCommitMessage(p.commit.oid.substring(0, 8))} '),
]),
);
2019-02-08 07:30:22 +01:00
case 'IssueComment':
2021-01-31 12:27:45 +01:00
return CommentItem.gql(
node as GCommentParts, node as GReactableParts, (item) {});
2019-02-08 07:30:22 +01:00
case 'CrossReferencedEvent':
2021-01-17 15:08:32 +01: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 11:48:59 +02:00
return TimelineEventItem(
2021-05-16 09:16:35 +02:00
actor: p.actor!.login,
2022-09-17 16:35:45 +02:00
iconData: Octicons.dot_fill,
2019-11-08 13:23:09 +01:00
iconColor: GithubPalette.open,
2020-10-08 08:30:13 +02:00
textSpan: TextSpan(children: [
TextSpan(
text:
' ${AppLocalizations.of(context)!.crossReferencedEventMessage} '),
2020-10-08 08:30:13 +02:00
createLinkSpan(context, '$owner/$name#$number',
'/github/$owner/$name/$prefix/$number'),
]),
);
case 'ClosedEvent':
2021-01-17 15:08:32 +01:00
final p = node as GClosedEventParts;
2019-09-07 11:48:59 +02:00
return TimelineEventItem(
2021-05-16 09:16:35 +02:00
actor: p.actor!.login,
iconData: Octicons.circle_slash,
2019-11-08 13:23:09 +01:00
iconColor: GithubPalette.closed,
textSpan: TextSpan(
text: ' ${AppLocalizations.of(context)!.closedEventMessage} '),
);
2019-02-08 07:30:22 +01:00
case 'ReopenedEvent':
2021-01-17 15:08:32 +01:00
final p = node as GReopenedEventParts;
2019-09-07 11:48:59 +02:00
return TimelineEventItem(
2021-05-16 09:16:35 +02:00
actor: p.actor!.login,
2022-09-17 16:35:45 +02:00
iconData: Octicons.dot_fill,
2019-11-08 13:23:09 +01:00
iconColor: GithubPalette.open,
textSpan: TextSpan(
text: ' ${AppLocalizations.of(context)!.reopenedEventMessage} '),
);
2019-02-08 07:30:22 +01:00
case 'SubscribedEvent':
2021-01-17 15:08:32 +01:00
final p = node as GSubscribedEventParts;
2020-02-09 14:16:26 +01:00
return TimelineEventItem(
2021-05-16 09:16:35 +02:00
actor: p.actor!.login,
textSpan: TextSpan(
text:
' ${AppLocalizations.of(context)!.subscribedEventMessage} '),
2020-02-09 14:16:26 +01:00
);
2019-02-08 07:30:22 +01:00
case 'UnsubscribedEvent':
2021-01-17 15:08:32 +01:00
final p = node as GUnsubscribedEventParts;
2020-04-16 05:36:48 +02:00
return TimelineEventItem(
2021-05-16 09:16:35 +02:00
actor: p.actor!.login,
textSpan: TextSpan(
text:
' ${AppLocalizations.of(context)!.unsubscribedEventMessage} '),
2020-04-08 14:39:29 +02:00
);
2019-02-08 07:30:22 +01:00
case 'ReferencedEvent':
2021-01-17 15:08:32 +01:00
final p = node as GReferencedEventParts;
2019-02-08 07:30:22 +01:00
// TODO: isCrossRepository
2021-01-17 15:08:32 +01:00
if (p.commit == null) {
2019-02-08 07:30:22 +01:00
return Container();
}
2021-01-17 15:08:32 +01:00
if (p.isCrossRepository) {
2020-04-08 14:39:29 +02:00
return TimelineEventItem(
2021-05-16 09:16:35 +02:00
actor: p.actor!.login,
2020-04-08 14:39:29 +02:00
iconData: Octicons.bookmark,
textSpan: TextSpan(children: [
TextSpan(
text:
' ${AppLocalizations.of(context)!.referencedEventMessage(p.commit!.oid.substring(0, 8), p.commitRepository.name)} '),
2020-04-08 14:39:29 +02:00
]),
);
}
2019-09-07 11:48:59 +02:00
return TimelineEventItem(
2021-05-16 09:16:35 +02:00
actor: p.actor!.login,
2019-02-08 07:30:22 +01:00
iconData: Octicons.bookmark,
textSpan: TextSpan(children: [
TextSpan(
text:
' ${AppLocalizations.of(context)!.referencedEventMessage(p.commit!.oid.substring(0, 8), '')} '),
2019-02-08 07:30:22 +01:00
]),
);
case 'AssignedEvent':
2021-01-17 15:08:32 +01:00
final p = node as GAssignedEventParts;
final assignee = (p.assignee as dynamic).login;
2019-09-07 11:48:59 +02:00
return TimelineEventItem(
2021-05-16 09:16:35 +02:00
actor: p.actor!.login,
2019-02-08 07:30:22 +01:00
iconData: Octicons.key,
textSpan: TextSpan(children: [
TextSpan(
text:
' ${AppLocalizations.of(context)!.assignedEventMessage} '),
2021-01-17 15:08:32 +01:00
createLinkSpan(context, assignee, '/github/$assignee'),
2019-02-08 07:30:22 +01:00
]),
);
2019-02-08 07:30:22 +01:00
case 'UnassignedEvent':
2021-01-17 15:08:32 +01:00
final p = node as GUnassignedEventParts;
final assignee = (p.assignee as dynamic).login;
2020-04-08 14:39:29 +02:00
return TimelineEventItem(
2021-05-16 09:16:35 +02:00
actor: p.actor!.login,
2020-04-08 14:39:29 +02:00
iconData: Octicons.key,
textSpan: TextSpan(children: [
TextSpan(
text:
' ${AppLocalizations.of(context)!.unassignedEventMessage} '),
2021-01-17 15:08:32 +01:00
createLinkSpan(context, assignee, '/github/$assignee')
2020-04-08 14:39:29 +02:00
]),
);
2019-01-29 06:34:52 +01:00
case 'LabeledEvent':
2021-01-17 15:08:32 +01:00
final p = node as GLabeledEventParts;
2019-09-07 11:48:59 +02:00
return TimelineEventItem(
2021-05-16 09:16:35 +02:00
actor: p.actor!.login,
2019-01-29 06:34:52 +01:00
iconData: Octicons.tag,
textSpan: TextSpan(children: [
TextSpan(text: ' ${AppLocalizations.of(context)!.added} '),
2021-01-17 15:08:32 +01:00
WidgetSpan(
2022-09-30 20:54:09 +02:00
child: HexColorTag(name: p.label.name, color: p.label.color)),
TextSpan(text: ' ${AppLocalizations.of(context)!.label}'),
2019-01-29 06:34:52 +01:00
]),
);
case 'UnlabeledEvent':
2021-01-17 15:08:32 +01:00
final p = node as GUnlabeledEventParts;
2019-09-07 11:48:59 +02:00
return TimelineEventItem(
2021-05-16 09:16:35 +02:00
actor: p.actor!.login,
2019-01-29 06:34:52 +01:00
iconData: Octicons.tag,
textSpan: TextSpan(children: [
TextSpan(text: ' ${AppLocalizations.of(context)!.removed} '),
2021-01-17 15:08:32 +01:00
WidgetSpan(
2022-09-30 20:54:09 +02:00
child: HexColorTag(name: p.label.name, color: p.label.color)),
TextSpan(text: ' ${AppLocalizations.of(context)!.label}'),
2019-01-29 06:34:52 +01:00
]),
);
case 'MilestonedEvent':
2021-01-17 15:08:32 +01:00
final p = node as GMilestonedEventParts;
2019-09-07 11:48:59 +02:00
return TimelineEventItem(
2021-05-16 09:16:35 +02:00
actor: p.actor!.login,
2019-01-29 06:34:52 +01:00
iconData: Octicons.milestone,
textSpan: TextSpan(children: [
TextSpan(
text:
' ${AppLocalizations.of(context)!.milestonedEventMessage(p.milestoneTitle)} '),
2019-01-29 06:34:52 +01:00
]),
);
2019-02-08 07:30:22 +01:00
case 'DemilestonedEvent':
2021-01-17 15:08:32 +01:00
final p = node as GDemilestonedEventParts;
2020-04-08 14:39:29 +02:00
return TimelineEventItem(
2021-05-16 09:16:35 +02:00
actor: p.actor!.login,
2020-04-08 14:39:29 +02:00
iconData: Octicons.milestone,
textSpan: TextSpan(children: [
TextSpan(
text:
' ${AppLocalizations.of(context)!.demilestonedEventMessage(p.milestoneTitle)} '),
2020-04-08 14:39:29 +02:00
]),
);
2019-02-08 07:30:22 +01:00
case 'RenamedTitleEvent':
2021-01-17 15:08:32 +01:00
final p = node as GRenamedTitleEventParts;
2019-09-07 11:48:59 +02:00
return TimelineEventItem(
2021-05-16 09:16:35 +02:00
actor: p.actor!.login,
2019-02-08 07:30:22 +01:00
iconData: Octicons.pencil,
2019-01-29 06:34:52 +01:00
textSpan: TextSpan(children: [
TextSpan(
text:
' ${AppLocalizations.of(context)!.renamedTitleEventMessage(p.currentTitle)} '),
2019-02-08 07:30:22 +01:00
TextSpan(
2021-01-17 15:08:32 +01:00
text: p.previousTitle,
2022-09-06 18:28:12 +02:00
style: const TextStyle(decoration: TextDecoration.lineThrough),
2019-02-08 07:30:22 +01:00
),
2019-01-29 06:34:52 +01:00
]),
);
2019-02-08 07:30:22 +01:00
case 'LockedEvent':
2021-01-17 15:08:32 +01:00
final p = node as GLockedEventParts;
2019-09-07 11:48:59 +02:00
return TimelineEventItem(
2021-05-16 09:16:35 +02:00
actor: p.actor!.login,
2019-02-08 07:30:22 +01:00
iconData: Octicons.lock,
2019-01-29 06:34:52 +01:00
textSpan: TextSpan(children: [
TextSpan(
text:
' ${AppLocalizations.of(context)!.lockedConversationEventMessage} '),
2019-01-29 06:34:52 +01:00
]),
);
2019-02-08 07:30:22 +01:00
case 'UnlockedEvent':
2021-01-17 15:08:32 +01:00
final p = node as GUnlockedEventParts;
2019-09-07 11:48:59 +02:00
return TimelineEventItem(
2021-05-16 09:16:35 +02:00
actor: p.actor!.login,
2019-01-29 06:34:52 +01:00
iconData: Octicons.key,
textSpan: TextSpan(children: [
TextSpan(
text:
' ${AppLocalizations.of(context)!.unlockedConversationEventMessage} '),
2019-01-29 06:34:52 +01:00
]),
);
2019-02-08 07:30:22 +01:00
case 'TransferredEvent':
2021-01-17 15:08:32 +01:00
final p = node as GTransferredEventParts;
2020-04-16 05:36:48 +02:00
return TimelineEventItem(
2021-05-16 09:16:35 +02:00
actor: p.actor!.login,
2020-04-16 05:36:48 +02:00
textSpan: TextSpan(
2020-04-08 14:39:29 +02:00
children: [
2020-04-16 05:36:48 +02:00
TextSpan(
2021-05-30 19:07:31 +02:00
text:
' ${AppLocalizations.of(context)!.transferredEventMessage(p.fromRepository!.name)} ')
2020-04-08 14:39:29 +02:00
],
),
);
2019-02-08 07:30:22 +01:00
// pull request only types
case 'CommitCommentThread':
return _buildFallback(type, context); // TODO:
case 'PullRequestReview':
2021-01-17 15:08:32 +01:00
final p = node as GPullRequestReviewParts;
return Column(
children: <Widget>[
TimelineEventItem(
2022-09-24 09:36:22 +02:00
actor: p.author!.login,
iconColor: GithubPalette.open,
iconData: Octicons.check,
textSpan: p.state == GPullRequestReviewState.APPROVED
? TextSpan(
text: ' ${AppLocalizations.of(context)!.approvedChanges}',
)
: p.state == GPullRequestReviewState.COMMENTED
? TextSpan(
text: ' ${AppLocalizations.of(context)!.reviewed} ',
)
: TextSpan(
text: 'xxx', // TODO:
style: TextStyle(
color: AntTheme.of(context).colorDanger,
),
),
),
2021-01-17 15:08:32 +01:00
Container(
padding: CommonStyle.padding.copyWith(left: 50),
child: Column(
children: <Widget>[
2021-05-16 09:16:35 +02:00
for (var v in p.comments.nodes!)
2021-01-31 12:27:45 +01:00
CommentItem.gql(v, v, (key) {}),
2021-01-17 15:08:32 +01:00
],
),
),
],
);
2019-02-08 07:30:22 +01:00
case 'PullRequestReviewThread':
case 'PullRequestReviewComment':
return _buildFallback(type, context); // TODO:
case 'MergedEvent':
2021-01-17 15:08:32 +01:00
final p = node as GMergedEventParts;
2019-09-07 11:48:59 +02:00
return TimelineEventItem(
2021-05-16 09:16:35 +02:00
actor: p.actor!.login,
iconData: Octicons.git_merge,
2019-11-08 13:23:09 +01:00
iconColor: GithubPalette.merged,
textSpan: TextSpan(children: [
TextSpan(
text:
' ${AppLocalizations.of(context)!.mergedEventMessage(p.commit!.oid.substring(0, 8), p.mergeRefName)} '),
]),
);
2020-02-09 14:16:26 +01:00
case 'MentionedEvent':
2021-01-17 15:08:32 +01:00
final p = node as GMentionedEventParts;
2020-02-09 14:16:26 +01:00
return TimelineEventItem(
2021-05-16 09:16:35 +02:00
actor: p.actor!.login,
2020-02-09 14:16:26 +01:00
iconData: Octicons.bookmark,
textSpan: TextSpan(
text: ' ${AppLocalizations.of(context)!.mentionedEventMessage} '),
2020-02-09 14:16:26 +01:00
);
case 'PinnedEvent':
2021-01-17 15:08:32 +01:00
final p = node as GPinnedEventParts;
2020-02-09 14:16:26 +01:00
return TimelineEventItem(
2021-05-16 09:16:35 +02:00
actor: p.actor!.login,
2020-02-09 14:16:26 +01:00
iconData: Octicons.pin,
textSpan: TextSpan(
text: ' ${AppLocalizations.of(context)!.pinnedEventMessage} '),
2020-02-09 14:16:26 +01:00
);
2019-02-08 07:30:22 +01:00
case 'DeployedEvent':
2021-01-17 15:08:32 +01:00
final p = node as GDeployedEventParts;
2020-04-16 05:36:48 +02:00
return TimelineEventItem(
2021-05-16 09:16:35 +02:00
actor: p.actor!.login,
2020-04-16 05:36:48 +02:00
textSpan: TextSpan(
2021-05-30 19:07:31 +02:00
text:
' ${AppLocalizations.of(context)!.deployedPR(p.pullRequest.headRef!.name)} '),
2020-04-08 14:39:29 +02:00
);
2019-02-08 07:30:22 +01:00
case 'DeploymentEnvironmentChangedEvent':
2021-01-17 15:08:32 +01:00
final p = node as GDeploymentEnvironmentChangedEventParts;
2020-04-16 05:36:48 +02:00
return TimelineEventItem(
2021-05-16 09:16:35 +02:00
actor: p.actor!.login,
2020-04-16 05:36:48 +02:00
textSpan: TextSpan(
text:
' ${AppLocalizations.of(context)!.deploymentEnvironmentChangedEventMessage(p.deploymentStatus.deployment.environment!)} '),
2020-04-08 14:39:29 +02:00
);
case 'HeadRefDeletedEvent':
2021-01-17 15:08:32 +01:00
final p = node as GHeadRefDeletedEventParts;
2019-09-07 11:48:59 +02:00
return TimelineEventItem(
2021-05-16 09:16:35 +02:00
actor: p.actor!.login,
iconData: Octicons.git_branch,
textSpan: TextSpan(children: [
TextSpan(
text:
' ${AppLocalizations.of(context)!.headRefDeletedEventMessage(p.headRefName)} '),
]),
);
2019-02-08 07:30:22 +01:00
case 'HeadRefRestoredEvent':
2021-01-17 15:08:32 +01:00
final p = node as GHeadRefRestoredEventParts;
2020-04-16 05:36:48 +02:00
return TimelineEventItem(
2021-05-16 09:16:35 +02:00
actor: p.actor!.login,
2020-04-16 05:36:48 +02:00
textSpan: TextSpan(children: [
TextSpan(
text:
' ${AppLocalizations.of(context)!.headRefRestoredEventMessage(p.pullRequest.headRefName)} '),
2020-04-16 05:36:48 +02:00
]),
2020-04-08 14:39:29 +02:00
);
2019-02-08 07:30:22 +01:00
case 'HeadRefForcePushedEvent':
2021-01-17 15:08:32 +01:00
final p = node as GHeadRefForcePushedEventParts;
2019-11-30 16:49:05 +01:00
return TimelineEventItem(
2022-09-17 16:35:45 +02:00
iconData: Octicons.repo_push,
2021-05-16 09:16:35 +02:00
actor: p.actor!.login,
2019-11-30 16:49:05 +01:00
textSpan: TextSpan(
children: [
TextSpan(
text:
' ${AppLocalizations.of(context)!.headRefForcedPushedEventFirstMessage} '),
2022-09-21 18:56:02 +02:00
WidgetSpan(child: BranchName(p.pullRequest.headRefName)),
TextSpan(
text:
' ${AppLocalizations.of(context)!.headRefForcedPushedEventSecondMessage} '),
2019-11-30 16:49:05 +01:00
TextSpan(
2021-05-16 09:16:35 +02:00
text: p.beforeCommit!.oid.substring(0, 7),
2022-09-24 20:46:37 +02:00
style: TextStyle(color: AntTheme.of(context).colorPrimary),
2019-11-30 16:49:05 +01:00
),
TextSpan(text: ' ${AppLocalizations.of(context)!.to} '),
2019-11-30 16:49:05 +01:00
TextSpan(
2021-05-16 09:16:35 +02:00
text: p.afterCommit!.oid.substring(0, 7),
2022-09-24 20:46:37 +02:00
style: TextStyle(color: AntTheme.of(context).colorPrimary),
2019-11-30 16:49:05 +01:00
),
],
),
);
2019-02-08 07:30:22 +01:00
case 'BaseRefForcePushedEvent':
2021-01-17 15:08:32 +01:00
final p = node as GBaseRefForcePushedEventParts;
2020-04-08 14:39:29 +02:00
return TimelineEventItem(
2022-09-17 16:35:45 +02:00
iconData: Octicons.repo_push,
2021-05-16 09:16:35 +02:00
actor: p.actor!.login,
2020-04-08 14:39:29 +02:00
textSpan: TextSpan(
children: [
TextSpan(
text:
' ${AppLocalizations.of(context)!.headRefForcedPushedEventFirstMessage} '),
2022-09-21 18:56:02 +02:00
WidgetSpan(child: BranchName(p.pullRequest.baseRef!.name)),
TextSpan(
text:
' ${AppLocalizations.of(context)!.headRefForcedPushedEventSecondMessage} '),
2020-04-08 14:39:29 +02:00
TextSpan(
2021-05-16 09:16:35 +02:00
text: p.beforeCommit!.oid.substring(0, 7),
2022-09-24 20:46:37 +02:00
style: TextStyle(color: AntTheme.of(context).colorPrimary),
2020-04-08 14:39:29 +02:00
),
TextSpan(text: ' ${AppLocalizations.of(context)!.to} '),
2020-04-08 14:39:29 +02:00
TextSpan(
2021-05-16 09:16:35 +02:00
text: p.afterCommit!.oid.substring(0, 7),
2022-09-24 20:46:37 +02:00
style: TextStyle(color: AntTheme.of(context).colorPrimary),
2020-04-08 14:39:29 +02:00
),
],
),
);
2019-02-08 07:30:22 +01:00
case 'ReviewRequestedEvent':
2021-01-17 15:08:32 +01:00
final p = node as GReviewRequestedEventParts;
2019-09-07 11:48:59 +02:00
return TimelineEventItem(
2019-02-08 07:30:22 +01:00
iconData: Octicons.eye,
2021-05-16 09:16:35 +02:00
actor: p.actor!.login,
textSpan: TextSpan(children: [
TextSpan(
text:
' ${AppLocalizations.of(context)!.reviewRequestEventMessage} '),
2021-01-17 15:08:32 +01:00
createUserSpan(
context,
(p.requestedReviewer
as GIssueData_repository_issueOrPullRequest__asPullRequest_timelineItems_nodes__asReviewRequestedEvent_requestedReviewer__asUser)
2021-01-17 15:08:32 +01:00
.login),
]),
);
2019-02-08 07:30:22 +01:00
case 'ReviewRequestRemovedEvent':
2021-01-17 15:08:32 +01:00
final p = node as GReviewRequestRemovedEventParts;
2020-04-08 14:39:29 +02:00
return TimelineEventItem(
iconData: Octicons.eye,
2021-05-16 09:16:35 +02:00
actor: p.actor!.login,
2020-04-08 14:39:29 +02:00
textSpan: TextSpan(children: [
2022-09-06 18:28:12 +02:00
const TextSpan(text: ' removed '),
2021-01-17 15:08:32 +01:00
createUserSpan(
context,
(p.requestedReviewer
as GReviewRequestRemovedEventParts_requestedReviewer__asUser)
.login),
TextSpan(
text: ' ${AppLocalizations.of(context)!.fromReviewRequest} '),
2020-04-08 14:39:29 +02:00
]),
);
2019-02-08 07:30:22 +01:00
case 'ReviewDismissedEvent':
2021-01-17 15:08:32 +01:00
final p = node as GReviewDismissedEventParts;
2020-04-16 05:36:48 +02:00
return TimelineEventItem(
2020-04-08 14:39:29 +02:00
iconData: Octicons.eye,
2021-05-16 09:16:35 +02:00
actor: p.actor!.login,
2020-04-08 14:39:29 +02:00
textSpan: TextSpan(children: [
TextSpan(
text:
' ${AppLocalizations.of(context)!.reviewDismissedEventMessage} '),
2021-05-16 09:16:35 +02:00
createUserSpan(context, p.pullRequest.author!.login),
2020-04-08 14:39:29 +02:00
]),
);
default:
return _buildFallback(type, context);
}
}
@override
Widget build(BuildContext context) {
2021-01-17 15:08:32 +01:00
return Container(
2019-10-02 10:09:54 +02:00
padding: CommonStyle.padding,
2021-01-17 15:08:32 +01:00
child: _buildByType(context, node.G__typename),
);
}
}