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

135 lines
4.3 KiB
Dart
Raw Normal View History

import 'package:flutter/material.dart';
import 'package:flutter_markdown/flutter_markdown.dart';
2019-08-31 14:44:59 +02:00
import 'package:timeago/timeago.dart' as timeago;
2019-05-12 09:14:28 +02:00
import 'package:primer/primer.dart';
2019-01-31 07:37:25 +01:00
import '../utils/utils.dart';
2019-02-07 07:35:19 +01:00
import 'avatar.dart';
2019-04-05 15:19:00 +02:00
import 'link.dart';
2019-02-07 07:35:19 +01:00
import 'user_name.dart';
final emojiMap = {
'THUMBS_UP': '👍',
'THUMBS_DOWN': '👎',
'LAUGH': '😄',
'HOORAY': '🎉',
'CONFUSED': '😕',
'HEART': '❤️',
'ROCKET': '🚀',
'EYES': '👀'
};
class CommentItem extends StatelessWidget {
final Map<String, dynamic> payload;
2019-04-05 15:19:00 +02:00
final Function(String emojiKey, bool isRemove) onReaction;
2019-04-05 15:19:00 +02:00
CommentItem(this.payload, {@required this.onReaction});
bool _hasReacted(String emojiKey) {
if (payload[emojiKey] == null) return false;
return payload[emojiKey]['viewerHasReacted'] as bool;
}
Decoration _getDecorationByKey(String emojiKey) {
return BoxDecoration(
2019-05-12 09:14:28 +02:00
color:
_hasReacted(emojiKey) ? PrimerColors.blue000 : Colors.transparent);
2019-04-05 15:19:00 +02:00
}
@override
Widget build(BuildContext context) {
return Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: <Widget>[
Row(children: <Widget>[
Avatar(
url: payload['author']['avatarUrl'],
size: 16,
login: payload['author']['login'],
),
Padding(padding: EdgeInsets.only(left: 6)),
Expanded(
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: <Widget>[
UserName(payload['author']['login']),
Padding(padding: EdgeInsets.only(bottom: 2)),
Text(
2019-08-31 14:44:59 +02:00
timeago.format(DateTime.parse(payload['createdAt'])),
style: TextStyle(color: Colors.black54, fontSize: 13),
),
],
),
),
]),
Padding(
padding: const EdgeInsets.only(top: 12),
child: MarkdownBody(
data: payload['body'],
// styleSheet: MarkdownStyleSheet(code: TextStyle(fontSize: 14)),
),
),
Wrap(
children: emojiMap.entries
2019-04-05 15:19:00 +02:00
.where((entry) => payload[entry.key]['totalCount'] as int != 0)
.map<Widget>((entry) {
var emojiKey = entry.key;
var emoji = entry.value;
2019-04-05 15:19:00 +02:00
var count = payload[entry.key]['totalCount'] as int;
2019-04-05 15:19:00 +02:00
return Link(
onTap: () {
onReaction(emojiKey, _hasReacted(emojiKey));
},
child: Container(
padding: EdgeInsets.all(6),
decoration: _getDecorationByKey(emojiKey),
child: RichText(
text: TextSpan(
style: TextStyle(fontSize: 16),
children: [
TextSpan(text: emoji),
TextSpan(text: ' '),
TextSpan(
text: count.toString(),
2019-05-12 09:14:28 +02:00
style: TextStyle(color: PrimerColors.blue500),
2019-04-05 15:19:00 +02:00
),
],
),
),
),
);
2019-04-05 15:19:00 +02:00
}).toList()
..add(
Link(
onTap: () async {
var result = await showDialogOptions(
context,
emojiMap.entries.map((entry) {
var emojiKey = entry.key;
return DialogOption(
value: emojiKey,
widget: Container(
decoration: _getDecorationByKey(emojiKey),
child: Text(emojiKey + ' ' + entry.value),
),
);
}).toList(),
);
onReaction(result, _hasReacted(result));
},
child: Container(
padding: EdgeInsets.all(12),
child: Icon(
Octicons.smiley,
2019-05-12 09:14:28 +02:00
color: PrimerColors.blue500,
2019-04-05 15:19:00 +02:00
size: 16,
),
),
),
),
2019-02-02 17:28:51 +01:00
),
],
);
}
}