💄 Optimize post comments
This commit is contained in:
parent
d6013078bd
commit
e68ada2d04
@ -103,7 +103,7 @@ class OpenablePostItem extends StatelessWidget {
|
||||
transitionType: ContainerTransitionType.fade,
|
||||
closedElevation: 0,
|
||||
closedColor: Theme.of(context).colorScheme.surface.withOpacity(
|
||||
cfg.prefs.getBool(kAppBackgroundStoreKey) == true ? 0.75 : 1,
|
||||
cfg.prefs.getBool(kAppBackgroundStoreKey) == true ? 0 : 1,
|
||||
),
|
||||
closedShape: const RoundedRectangleBorder(
|
||||
borderRadius: BorderRadius.all(Radius.circular(16)),
|
||||
@ -122,6 +122,7 @@ class PostItem extends StatefulWidget {
|
||||
final bool showMenu;
|
||||
final bool showFullPost;
|
||||
final bool showAvatar;
|
||||
final bool showCompactAvatar;
|
||||
final bool showExpandableComments;
|
||||
final double? maxWidth;
|
||||
final Function(SnPost data)? onChanged;
|
||||
@ -137,6 +138,7 @@ class PostItem extends StatefulWidget {
|
||||
this.showMenu = true,
|
||||
this.showFullPost = false,
|
||||
this.showAvatar = true,
|
||||
this.showCompactAvatar = false,
|
||||
this.showExpandableComments = false,
|
||||
this.maxWidth,
|
||||
this.onChanged,
|
||||
@ -297,12 +299,9 @@ class _PostItemState extends State<PostItem> {
|
||||
crossAxisAlignment: CrossAxisAlignment.center,
|
||||
children: [
|
||||
Container(
|
||||
constraints:
|
||||
BoxConstraints(maxWidth: widget.maxWidth ?? double.infinity),
|
||||
child: Column(
|
||||
crossAxisAlignment: CrossAxisAlignment.start,
|
||||
children: [
|
||||
Expanded(
|
||||
constraints: BoxConstraints(
|
||||
maxWidth: widget.maxWidth ?? double.infinity,
|
||||
),
|
||||
child: Column(
|
||||
crossAxisAlignment: CrossAxisAlignment.start,
|
||||
children: [
|
||||
@ -315,11 +314,21 @@ class _PostItemState extends State<PostItem> {
|
||||
),
|
||||
if (widget.showAvatar) const Gap(12),
|
||||
Expanded(
|
||||
child: _PostContentHeader(
|
||||
child: Row(
|
||||
children: [
|
||||
if (widget.showCompactAvatar)
|
||||
_PostAvatar(
|
||||
data: widget.data,
|
||||
isCompact: true,
|
||||
),
|
||||
if (widget.showAvatar) const Gap(8),
|
||||
_PostContentHeader(
|
||||
isRelativeDate: !widget.showFullPost,
|
||||
isCompact: false,
|
||||
data: widget.data,
|
||||
),
|
||||
],
|
||||
),
|
||||
),
|
||||
_PostActionPopup(
|
||||
data: widget.data,
|
||||
@ -368,14 +377,13 @@ class _PostItemState extends State<PostItem> {
|
||||
_PostVideoPlayer(data: widget.data).padding(bottom: 8),
|
||||
if (widget.data.type == 'question')
|
||||
_PostQuestionHint(data: widget.data).padding(bottom: 8),
|
||||
if (_displayDescription.isNotEmpty ||
|
||||
_displayTitle.isNotEmpty)
|
||||
if (_displayDescription.isNotEmpty || _displayTitle.isNotEmpty)
|
||||
_PostHeadline(
|
||||
title: _displayTitle,
|
||||
description: _displayDescription,
|
||||
data: widget.data,
|
||||
isEnlarge: widget.data.type == 'article' &&
|
||||
widget.showFullPost,
|
||||
isEnlarge:
|
||||
widget.data.type == 'article' && widget.showFullPost,
|
||||
).padding(bottom: 8),
|
||||
if (widget.data.type == 'article' && !widget.showFullPost)
|
||||
Text('postArticle')
|
||||
@ -384,14 +392,13 @@ class _PostItemState extends State<PostItem> {
|
||||
.opacity(0.75)
|
||||
.padding(bottom: 8),
|
||||
if ((_displayText.isNotEmpty) &&
|
||||
(widget.showFullPost ||
|
||||
widget.data.type != 'article'))
|
||||
(widget.showFullPost || widget.data.type != 'article'))
|
||||
_PostContentBody(
|
||||
text: _displayText,
|
||||
data: widget.data,
|
||||
isSelectable: widget.showFullPost,
|
||||
isEnlarge: widget.data.type == 'article' &&
|
||||
widget.showFullPost,
|
||||
isEnlarge:
|
||||
widget.data.type == 'article' && widget.showFullPost,
|
||||
).padding(bottom: 6),
|
||||
if (widget.data.visibility > 0)
|
||||
_PostVisibilityHint(data: widget.data).padding(
|
||||
@ -402,8 +409,7 @@ class _PostItemState extends State<PostItem> {
|
||||
vertical: 4,
|
||||
),
|
||||
if (widget.data.tags.isNotEmpty)
|
||||
_PostTagsList(data: widget.data)
|
||||
.padding(top: 4, bottom: 6),
|
||||
_PostTagsList(data: widget.data).padding(top: 4, bottom: 6),
|
||||
Column(
|
||||
crossAxisAlignment: CrossAxisAlignment.start,
|
||||
spacing: 4,
|
||||
@ -413,8 +419,7 @@ class _PostItemState extends State<PostItem> {
|
||||
children: [
|
||||
Icon(Symbols.play_circle, size: 20),
|
||||
const Gap(4),
|
||||
Text('postViews')
|
||||
.plural(widget.data.totalViews),
|
||||
Text('postViews').plural(widget.data.totalViews),
|
||||
],
|
||||
).opacity(0.75),
|
||||
if (_isTranslating)
|
||||
@ -444,10 +449,8 @@ class _PostItemState extends State<PostItem> {
|
||||
).opacity(0.75),
|
||||
onTap: () {
|
||||
setState(() {
|
||||
_displayText =
|
||||
widget.data.body['content'] ?? '';
|
||||
_displayTitle =
|
||||
widget.data.body['title'] ?? '';
|
||||
_displayText = widget.data.body['content'] ?? '';
|
||||
_displayTitle = widget.data.body['title'] ?? '';
|
||||
_displayDescription =
|
||||
widget.data.body['description'] ?? '';
|
||||
_isTranslated = false;
|
||||
@ -455,27 +458,21 @@ class _PostItemState extends State<PostItem> {
|
||||
},
|
||||
),
|
||||
if (widget.data.repostTo != null)
|
||||
_PostQuoteContent(child: widget.data.repostTo!)
|
||||
.padding(
|
||||
_PostQuoteContent(child: widget.data.repostTo!).padding(
|
||||
top: 4,
|
||||
bottom: widget.data.preload?.attachments
|
||||
?.isNotEmpty ??
|
||||
bottom: widget.data.preload?.attachments?.isNotEmpty ??
|
||||
false
|
||||
? 12
|
||||
: 0,
|
||||
),
|
||||
],
|
||||
).padding(
|
||||
bottom:
|
||||
widget.showViews || _isTranslated || _isTranslating
|
||||
bottom: widget.showViews || _isTranslated || _isTranslating
|
||||
? 8
|
||||
: 0,
|
||||
),
|
||||
],
|
||||
),
|
||||
).padding(horizontal: 12, top: 8),
|
||||
],
|
||||
),
|
||||
),
|
||||
if (displayableAttachments?.isNotEmpty ?? false)
|
||||
AttachmentList(
|
||||
@ -509,6 +506,7 @@ class _PostItemState extends State<PostItem> {
|
||||
_PostCommentIntent(
|
||||
data: widget.data,
|
||||
showAvatar: widget.showAvatar,
|
||||
maxWidth: widget.maxWidth ?? double.infinity,
|
||||
).padding(left: 12, right: 12)
|
||||
else
|
||||
_PostFeaturedComment(data: widget.data, maxWidth: widget.maxWidth)
|
||||
@ -557,6 +555,15 @@ class _PostItemState extends State<PostItem> {
|
||||
children: [
|
||||
Row(
|
||||
children: [
|
||||
Expanded(
|
||||
child: Row(
|
||||
children: [
|
||||
if (widget.showCompactAvatar)
|
||||
_PostAvatar(
|
||||
data: widget.data,
|
||||
isCompact: true,
|
||||
),
|
||||
if (widget.showCompactAvatar) const Gap(8),
|
||||
Expanded(
|
||||
child: _PostContentHeader(
|
||||
isRelativeDate: !widget.showFullPost,
|
||||
@ -564,6 +571,9 @@ class _PostItemState extends State<PostItem> {
|
||||
data: widget.data,
|
||||
),
|
||||
),
|
||||
],
|
||||
),
|
||||
),
|
||||
_PostActionPopup(
|
||||
data: widget.data,
|
||||
isAuthor: isAuthor,
|
||||
@ -578,7 +588,7 @@ class _PostItemState extends State<PostItem> {
|
||||
},
|
||||
),
|
||||
],
|
||||
),
|
||||
).padding(bottom: widget.showCompactAvatar ? 4 : 0),
|
||||
if (widget.data.preload?.thumbnail != null)
|
||||
Container(
|
||||
margin: const EdgeInsets.only(bottom: 8),
|
||||
@ -755,21 +765,30 @@ class _PostItemState extends State<PostItem> {
|
||||
if (widget.showExpandableComments)
|
||||
_PostCommentIntent(
|
||||
data: widget.data,
|
||||
maxWidth: (widget.maxWidth ?? double.infinity) -
|
||||
(widget.showAvatar ? 72 : 24),
|
||||
showAvatar: widget.showAvatar,
|
||||
).padding(left: widget.showAvatar ? 60 : 12, right: 12)
|
||||
else if (widget.showComments)
|
||||
_PostFeaturedComment(data: widget.data, maxWidth: widget.maxWidth)
|
||||
.padding(left: widget.showAvatar ? 60 : 12, right: 12),
|
||||
if (widget.showReactions)
|
||||
Padding(
|
||||
Container(
|
||||
constraints: BoxConstraints(
|
||||
maxWidth: widget.maxWidth ?? double.infinity,
|
||||
),
|
||||
child: Padding(
|
||||
padding: const EdgeInsets.only(top: 4),
|
||||
child: _PostReactionList(
|
||||
data: widget.data,
|
||||
padding:
|
||||
EdgeInsets.only(left: widget.showAvatar ? 60 : 12, right: 12),
|
||||
padding: EdgeInsets.only(
|
||||
left: widget.showAvatar ? 60 : 12,
|
||||
right: 12,
|
||||
),
|
||||
onChanged: _onChanged,
|
||||
),
|
||||
),
|
||||
),
|
||||
],
|
||||
);
|
||||
}
|
||||
@ -1552,19 +1571,24 @@ class _PostContentHeader extends StatelessWidget {
|
||||
if (isCompact) {
|
||||
return Row(
|
||||
children: [
|
||||
Text(data.publisher.nick).bold(),
|
||||
Flexible(
|
||||
child: Text(
|
||||
data.publisher.nick,
|
||||
maxLines: 1,
|
||||
).bold(),
|
||||
),
|
||||
const Gap(4),
|
||||
Row(
|
||||
children: [
|
||||
Text(
|
||||
Flexible(
|
||||
child: Text(
|
||||
isRelativeDate
|
||||
? RelativeTime(context)
|
||||
.format((data.publishedAt ?? data.createdAt).toLocal())
|
||||
: DateFormat('y/M/d HH:mm')
|
||||
.format((data.publishedAt ?? data.createdAt).toLocal()),
|
||||
).fontSize(13),
|
||||
],
|
||||
).opacity(0.8),
|
||||
maxLines: 1,
|
||||
overflow: TextOverflow.fade,
|
||||
).fontSize(13).opacity(0.8),
|
||||
),
|
||||
],
|
||||
);
|
||||
} else {
|
||||
@ -1573,25 +1597,39 @@ class _PostContentHeader extends StatelessWidget {
|
||||
children: [
|
||||
Row(
|
||||
children: [
|
||||
Text(data.publisher.nick).bold(),
|
||||
Flexible(
|
||||
child: Text(data.publisher.nick).bold(),
|
||||
),
|
||||
if (data.preload?.realm != null)
|
||||
const Icon(Symbols.arrow_right, size: 16)
|
||||
.padding(horizontal: 2)
|
||||
.opacity(0.5),
|
||||
if (data.preload?.realm != null) Text(data.preload!.realm!.name),
|
||||
if (data.preload?.realm != null)
|
||||
Flexible(
|
||||
child: Text(data.preload!.realm!.name),
|
||||
),
|
||||
],
|
||||
),
|
||||
Row(
|
||||
children: [
|
||||
Text('@${data.publisher.name}').fontSize(13),
|
||||
const Gap(4),
|
||||
Text(
|
||||
isRelativeDate
|
||||
? RelativeTime(context)
|
||||
.format((data.publishedAt ?? data.createdAt).toLocal())
|
||||
: DateFormat('y/M/d HH:mm')
|
||||
.format((data.publishedAt ?? data.createdAt).toLocal()),
|
||||
Flexible(
|
||||
child: Text(
|
||||
'@${data.publisher.name}',
|
||||
maxLines: 1,
|
||||
).fontSize(13),
|
||||
),
|
||||
const Gap(4),
|
||||
Flexible(
|
||||
child: Text(
|
||||
isRelativeDate
|
||||
? RelativeTime(context).format(
|
||||
(data.publishedAt ?? data.createdAt).toLocal())
|
||||
: DateFormat('y/M/d HH:mm').format(
|
||||
(data.publishedAt ?? data.createdAt).toLocal()),
|
||||
maxLines: 1,
|
||||
overflow: TextOverflow.fade,
|
||||
).fontSize(13),
|
||||
),
|
||||
],
|
||||
).opacity(0.8),
|
||||
],
|
||||
@ -1856,7 +1894,12 @@ class _PostTruncatedHint extends StatelessWidget {
|
||||
class _PostCommentIntent extends StatefulWidget {
|
||||
final SnPost data;
|
||||
final bool showAvatar;
|
||||
const _PostCommentIntent({required this.data, this.showAvatar = false});
|
||||
final double maxWidth;
|
||||
const _PostCommentIntent({
|
||||
required this.data,
|
||||
this.showAvatar = false,
|
||||
required this.maxWidth,
|
||||
});
|
||||
|
||||
@override
|
||||
State<_PostCommentIntent> createState() => _PostCommentIntentState();
|
||||
@ -1895,7 +1938,9 @@ class _PostCommentIntentState extends State<_PostCommentIntent> {
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return Column(
|
||||
return Container(
|
||||
constraints: BoxConstraints(maxWidth: widget.maxWidth),
|
||||
child: Column(
|
||||
children: [
|
||||
if (_comments.isNotEmpty)
|
||||
Card(
|
||||
@ -1905,14 +1950,25 @@ class _PostCommentIntentState extends State<_PostCommentIntent> {
|
||||
spacing: 8,
|
||||
children: [
|
||||
for (final ele in _comments)
|
||||
PostItem(
|
||||
InkWell(
|
||||
borderRadius: const BorderRadius.all(Radius.circular(8)),
|
||||
child: PostItem(
|
||||
data: ele,
|
||||
showAvatar: false,
|
||||
showCompactAvatar: true,
|
||||
showExpandableComments: true,
|
||||
showReactions: false,
|
||||
showViews: false,
|
||||
maxWidth: double.infinity,
|
||||
).padding(vertical: 8, left: 6),
|
||||
onTap: () {
|
||||
GoRouter.of(context).pushNamed(
|
||||
'postDetail',
|
||||
pathParameters: {'slug': ele.id.toString()},
|
||||
extra: ele,
|
||||
);
|
||||
},
|
||||
),
|
||||
],
|
||||
),
|
||||
).padding(vertical: 8),
|
||||
@ -1923,7 +1979,8 @@ class _PostCommentIntentState extends State<_PostCommentIntent> {
|
||||
child: const Icon(Symbols.comment, size: 20),
|
||||
),
|
||||
const Gap(4),
|
||||
Text('postCommentsDetailed'.plural(widget.data.metric.replyCount)),
|
||||
Text(
|
||||
'postCommentsDetailed'.plural(widget.data.metric.replyCount)),
|
||||
if (widget.data.metric.replyCount > 0 && !_isAllLoaded)
|
||||
SizedBox(
|
||||
width: 20,
|
||||
@ -1943,6 +2000,7 @@ class _PostCommentIntentState extends State<_PostCommentIntent> {
|
||||
],
|
||||
).opacity(0.75).padding(horizontal: widget.showAvatar ? 4 : 0),
|
||||
],
|
||||
),
|
||||
);
|
||||
}
|
||||
}
|
||||
|
@ -16,7 +16,7 @@ publish_to: "none" # Remove this line if you wish to publish to pub.dev
|
||||
# https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html
|
||||
# In Windows, build-name is used as the major, minor, and patch parts
|
||||
# of the product and file versions while build-number is used as the build suffix.
|
||||
version: 2.4.2+81
|
||||
version: 2.4.2+82
|
||||
|
||||
environment:
|
||||
sdk: ^3.5.4
|
||||
|
Loading…
x
Reference in New Issue
Block a user