Compare commits

..

No commits in common. "9f8c8923d97b15b50ef9a198184d831a6b8b8488" and "d6013078bd123204fb1cf7e5c9a416f2dfd05394" have entirely different histories.

5 changed files with 248 additions and 308 deletions

View File

@ -449,7 +449,7 @@ class _PostListWidgetState extends State<_PostListWidget> {
data: ele.toJson(), data: ele.toJson(),
createdAt: ele.createdAt)), createdAt: ele.createdAt)),
); );
_hasLoadedAll = _feed.length >= postCount; _hasLoadedAll = postCount >= _feed.length;
if (mounted) setState(() => _isBusy = false); if (mounted) setState(() => _isBusy = false);
} }

View File

@ -151,7 +151,6 @@ class PostCommentSliverListState extends State<PostCommentSliverList> {
}, },
), ),
onTap: () { onTap: () {
Navigator.pop(context);
GoRouter.of(context).pushNamed( GoRouter.of(context).pushNamed(
'postDetail', 'postDetail',
pathParameters: {'slug': _posts[idx].id.toString()}, pathParameters: {'slug': _posts[idx].id.toString()},
@ -226,9 +225,6 @@ class _PostCommentListPopupState extends State<PostCommentListPopup> {
onPost: () { onPost: () {
_childListKey.currentState!.refresh(); _childListKey.currentState!.refresh();
}, },
onExpand: () {
Navigator.pop(context);
},
), ),
), ),
), ),

View File

@ -103,7 +103,7 @@ class OpenablePostItem extends StatelessWidget {
transitionType: ContainerTransitionType.fade, transitionType: ContainerTransitionType.fade,
closedElevation: 0, closedElevation: 0,
closedColor: Theme.of(context).colorScheme.surface.withOpacity( closedColor: Theme.of(context).colorScheme.surface.withOpacity(
cfg.prefs.getBool(kAppBackgroundStoreKey) == true ? 0 : 1, cfg.prefs.getBool(kAppBackgroundStoreKey) == true ? 0.75 : 1,
), ),
closedShape: const RoundedRectangleBorder( closedShape: const RoundedRectangleBorder(
borderRadius: BorderRadius.all(Radius.circular(16)), borderRadius: BorderRadius.all(Radius.circular(16)),
@ -122,7 +122,6 @@ class PostItem extends StatefulWidget {
final bool showMenu; final bool showMenu;
final bool showFullPost; final bool showFullPost;
final bool showAvatar; final bool showAvatar;
final bool showCompactAvatar;
final bool showExpandableComments; final bool showExpandableComments;
final double? maxWidth; final double? maxWidth;
final Function(SnPost data)? onChanged; final Function(SnPost data)? onChanged;
@ -138,7 +137,6 @@ class PostItem extends StatefulWidget {
this.showMenu = true, this.showMenu = true,
this.showFullPost = false, this.showFullPost = false,
this.showAvatar = true, this.showAvatar = true,
this.showCompactAvatar = false,
this.showExpandableComments = false, this.showExpandableComments = false,
this.maxWidth, this.maxWidth,
this.onChanged, this.onChanged,
@ -299,9 +297,12 @@ class _PostItemState extends State<PostItem> {
crossAxisAlignment: CrossAxisAlignment.center, crossAxisAlignment: CrossAxisAlignment.center,
children: [ children: [
Container( Container(
constraints: BoxConstraints( constraints:
maxWidth: widget.maxWidth ?? double.infinity, BoxConstraints(maxWidth: widget.maxWidth ?? double.infinity),
), child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Expanded(
child: Column( child: Column(
crossAxisAlignment: CrossAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start,
children: [ children: [
@ -314,21 +315,11 @@ class _PostItemState extends State<PostItem> {
), ),
if (widget.showAvatar) const Gap(12), if (widget.showAvatar) const Gap(12),
Expanded( Expanded(
child: Row( child: _PostContentHeader(
children: [
if (widget.showCompactAvatar)
_PostAvatar(
data: widget.data,
isCompact: true,
),
if (widget.showAvatar) const Gap(8),
_PostContentHeader(
isRelativeDate: !widget.showFullPost, isRelativeDate: !widget.showFullPost,
isCompact: false, isCompact: false,
data: widget.data, data: widget.data,
), ),
],
),
), ),
_PostActionPopup( _PostActionPopup(
data: widget.data, data: widget.data,
@ -377,13 +368,14 @@ class _PostItemState extends State<PostItem> {
_PostVideoPlayer(data: widget.data).padding(bottom: 8), _PostVideoPlayer(data: widget.data).padding(bottom: 8),
if (widget.data.type == 'question') if (widget.data.type == 'question')
_PostQuestionHint(data: widget.data).padding(bottom: 8), _PostQuestionHint(data: widget.data).padding(bottom: 8),
if (_displayDescription.isNotEmpty || _displayTitle.isNotEmpty) if (_displayDescription.isNotEmpty ||
_displayTitle.isNotEmpty)
_PostHeadline( _PostHeadline(
title: _displayTitle, title: _displayTitle,
description: _displayDescription, description: _displayDescription,
data: widget.data, data: widget.data,
isEnlarge: isEnlarge: widget.data.type == 'article' &&
widget.data.type == 'article' && widget.showFullPost, widget.showFullPost,
).padding(bottom: 8), ).padding(bottom: 8),
if (widget.data.type == 'article' && !widget.showFullPost) if (widget.data.type == 'article' && !widget.showFullPost)
Text('postArticle') Text('postArticle')
@ -392,13 +384,14 @@ class _PostItemState extends State<PostItem> {
.opacity(0.75) .opacity(0.75)
.padding(bottom: 8), .padding(bottom: 8),
if ((_displayText.isNotEmpty) && if ((_displayText.isNotEmpty) &&
(widget.showFullPost || widget.data.type != 'article')) (widget.showFullPost ||
widget.data.type != 'article'))
_PostContentBody( _PostContentBody(
text: _displayText, text: _displayText,
data: widget.data, data: widget.data,
isSelectable: widget.showFullPost, isSelectable: widget.showFullPost,
isEnlarge: isEnlarge: widget.data.type == 'article' &&
widget.data.type == 'article' && widget.showFullPost, widget.showFullPost,
).padding(bottom: 6), ).padding(bottom: 6),
if (widget.data.visibility > 0) if (widget.data.visibility > 0)
_PostVisibilityHint(data: widget.data).padding( _PostVisibilityHint(data: widget.data).padding(
@ -409,7 +402,8 @@ class _PostItemState extends State<PostItem> {
vertical: 4, vertical: 4,
), ),
if (widget.data.tags.isNotEmpty) if (widget.data.tags.isNotEmpty)
_PostTagsList(data: widget.data).padding(top: 4, bottom: 6), _PostTagsList(data: widget.data)
.padding(top: 4, bottom: 6),
Column( Column(
crossAxisAlignment: CrossAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start,
spacing: 4, spacing: 4,
@ -419,7 +413,8 @@ class _PostItemState extends State<PostItem> {
children: [ children: [
Icon(Symbols.play_circle, size: 20), Icon(Symbols.play_circle, size: 20),
const Gap(4), const Gap(4),
Text('postViews').plural(widget.data.totalViews), Text('postViews')
.plural(widget.data.totalViews),
], ],
).opacity(0.75), ).opacity(0.75),
if (_isTranslating) if (_isTranslating)
@ -449,8 +444,10 @@ class _PostItemState extends State<PostItem> {
).opacity(0.75), ).opacity(0.75),
onTap: () { onTap: () {
setState(() { setState(() {
_displayText = widget.data.body['content'] ?? ''; _displayText =
_displayTitle = widget.data.body['title'] ?? ''; widget.data.body['content'] ?? '';
_displayTitle =
widget.data.body['title'] ?? '';
_displayDescription = _displayDescription =
widget.data.body['description'] ?? ''; widget.data.body['description'] ?? '';
_isTranslated = false; _isTranslated = false;
@ -458,21 +455,27 @@ class _PostItemState extends State<PostItem> {
}, },
), ),
if (widget.data.repostTo != null) if (widget.data.repostTo != null)
_PostQuoteContent(child: widget.data.repostTo!).padding( _PostQuoteContent(child: widget.data.repostTo!)
.padding(
top: 4, top: 4,
bottom: widget.data.preload?.attachments?.isNotEmpty ?? bottom: widget.data.preload?.attachments
?.isNotEmpty ??
false false
? 12 ? 12
: 0, : 0,
), ),
], ],
).padding( ).padding(
bottom: widget.showViews || _isTranslated || _isTranslating bottom:
widget.showViews || _isTranslated || _isTranslating
? 8 ? 8
: 0, : 0,
), ),
], ],
),
).padding(horizontal: 12, top: 8), ).padding(horizontal: 12, top: 8),
],
),
), ),
if (displayableAttachments?.isNotEmpty ?? false) if (displayableAttachments?.isNotEmpty ?? false)
AttachmentList( AttachmentList(
@ -506,7 +509,6 @@ class _PostItemState extends State<PostItem> {
_PostCommentIntent( _PostCommentIntent(
data: widget.data, data: widget.data,
showAvatar: widget.showAvatar, showAvatar: widget.showAvatar,
maxWidth: widget.maxWidth ?? double.infinity,
).padding(left: 12, right: 12) ).padding(left: 12, right: 12)
else else
_PostFeaturedComment(data: widget.data, maxWidth: widget.maxWidth) _PostFeaturedComment(data: widget.data, maxWidth: widget.maxWidth)
@ -555,15 +557,6 @@ class _PostItemState extends State<PostItem> {
children: [ children: [
Row( Row(
children: [ children: [
Expanded(
child: Row(
children: [
if (widget.showCompactAvatar)
_PostAvatar(
data: widget.data,
isCompact: true,
),
if (widget.showCompactAvatar) const Gap(8),
Expanded( Expanded(
child: _PostContentHeader( child: _PostContentHeader(
isRelativeDate: !widget.showFullPost, isRelativeDate: !widget.showFullPost,
@ -571,9 +564,6 @@ class _PostItemState extends State<PostItem> {
data: widget.data, data: widget.data,
), ),
), ),
],
),
),
_PostActionPopup( _PostActionPopup(
data: widget.data, data: widget.data,
isAuthor: isAuthor, isAuthor: isAuthor,
@ -588,7 +578,7 @@ class _PostItemState extends State<PostItem> {
}, },
), ),
], ],
).padding(bottom: widget.showCompactAvatar ? 4 : 0), ),
if (widget.data.preload?.thumbnail != null) if (widget.data.preload?.thumbnail != null)
Container( Container(
margin: const EdgeInsets.only(bottom: 8), margin: const EdgeInsets.only(bottom: 8),
@ -765,30 +755,21 @@ class _PostItemState extends State<PostItem> {
if (widget.showExpandableComments) if (widget.showExpandableComments)
_PostCommentIntent( _PostCommentIntent(
data: widget.data, data: widget.data,
maxWidth: (widget.maxWidth ?? double.infinity) -
(widget.showAvatar ? 72 : 24),
showAvatar: widget.showAvatar, showAvatar: widget.showAvatar,
).padding(left: widget.showAvatar ? 60 : 12, right: 12) ).padding(left: widget.showAvatar ? 60 : 12, right: 12)
else if (widget.showComments) else if (widget.showComments)
_PostFeaturedComment(data: widget.data, maxWidth: widget.maxWidth) _PostFeaturedComment(data: widget.data, maxWidth: widget.maxWidth)
.padding(left: widget.showAvatar ? 60 : 12, right: 12), .padding(left: widget.showAvatar ? 60 : 12, right: 12),
if (widget.showReactions) if (widget.showReactions)
Container( Padding(
constraints: BoxConstraints(
maxWidth: widget.maxWidth ?? double.infinity,
),
child: Padding(
padding: const EdgeInsets.only(top: 4), padding: const EdgeInsets.only(top: 4),
child: _PostReactionList( child: _PostReactionList(
data: widget.data, data: widget.data,
padding: EdgeInsets.only( padding:
left: widget.showAvatar ? 60 : 12, EdgeInsets.only(left: widget.showAvatar ? 60 : 12, right: 12),
right: 12,
),
onChanged: _onChanged, onChanged: _onChanged,
), ),
), ),
),
], ],
); );
} }
@ -1571,24 +1552,19 @@ class _PostContentHeader extends StatelessWidget {
if (isCompact) { if (isCompact) {
return Row( return Row(
children: [ children: [
Flexible( Text(data.publisher.nick).bold(),
child: Text(
data.publisher.nick,
maxLines: 1,
).bold(),
),
const Gap(4), const Gap(4),
Flexible( Row(
child: Text( children: [
Text(
isRelativeDate isRelativeDate
? RelativeTime(context) ? RelativeTime(context)
.format((data.publishedAt ?? data.createdAt).toLocal()) .format((data.publishedAt ?? data.createdAt).toLocal())
: DateFormat('y/M/d HH:mm') : DateFormat('y/M/d HH:mm')
.format((data.publishedAt ?? data.createdAt).toLocal()), .format((data.publishedAt ?? data.createdAt).toLocal()),
maxLines: 1, ).fontSize(13),
overflow: TextOverflow.fade, ],
).fontSize(13).opacity(0.8), ).opacity(0.8),
),
], ],
); );
} else { } else {
@ -1607,10 +1583,7 @@ class _PostContentHeader extends StatelessWidget {
), ),
Row( Row(
children: [ children: [
Text( Text('@${data.publisher.name}').fontSize(13),
'@${data.publisher.name}',
maxLines: 1,
).fontSize(13),
const Gap(4), const Gap(4),
Text( Text(
isRelativeDate isRelativeDate
@ -1618,8 +1591,6 @@ class _PostContentHeader extends StatelessWidget {
.format((data.publishedAt ?? data.createdAt).toLocal()) .format((data.publishedAt ?? data.createdAt).toLocal())
: DateFormat('y/M/d HH:mm') : DateFormat('y/M/d HH:mm')
.format((data.publishedAt ?? data.createdAt).toLocal()), .format((data.publishedAt ?? data.createdAt).toLocal()),
maxLines: 1,
overflow: TextOverflow.fade,
).fontSize(13), ).fontSize(13),
], ],
).opacity(0.8), ).opacity(0.8),
@ -1885,12 +1856,7 @@ class _PostTruncatedHint extends StatelessWidget {
class _PostCommentIntent extends StatefulWidget { class _PostCommentIntent extends StatefulWidget {
final SnPost data; final SnPost data;
final bool showAvatar; final bool showAvatar;
final double maxWidth; const _PostCommentIntent({required this.data, this.showAvatar = false});
const _PostCommentIntent({
required this.data,
this.showAvatar = false,
required this.maxWidth,
});
@override @override
State<_PostCommentIntent> createState() => _PostCommentIntentState(); State<_PostCommentIntent> createState() => _PostCommentIntentState();
@ -1929,9 +1895,7 @@ class _PostCommentIntentState extends State<_PostCommentIntent> {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
return Container( return Column(
constraints: BoxConstraints(maxWidth: widget.maxWidth),
child: Column(
children: [ children: [
if (_comments.isNotEmpty) if (_comments.isNotEmpty)
Card( Card(
@ -1941,25 +1905,14 @@ class _PostCommentIntentState extends State<_PostCommentIntent> {
spacing: 8, spacing: 8,
children: [ children: [
for (final ele in _comments) for (final ele in _comments)
InkWell( PostItem(
borderRadius: const BorderRadius.all(Radius.circular(8)),
child: PostItem(
data: ele, data: ele,
showAvatar: false, showAvatar: false,
showCompactAvatar: true,
showExpandableComments: true, showExpandableComments: true,
showReactions: false, showReactions: false,
showViews: false, showViews: false,
maxWidth: double.infinity, maxWidth: double.infinity,
).padding(vertical: 8, left: 6), ).padding(vertical: 8, left: 6),
onTap: () {
GoRouter.of(context).pushNamed(
'postDetail',
pathParameters: {'slug': ele.id.toString()},
extra: ele,
);
},
),
], ],
), ),
).padding(vertical: 8), ).padding(vertical: 8),
@ -1970,8 +1923,7 @@ class _PostCommentIntentState extends State<_PostCommentIntent> {
child: const Icon(Symbols.comment, size: 20), child: const Icon(Symbols.comment, size: 20),
), ),
const Gap(4), const Gap(4),
Text( Text('postCommentsDetailed'.plural(widget.data.metric.replyCount)),
'postCommentsDetailed'.plural(widget.data.metric.replyCount)),
if (widget.data.metric.replyCount > 0 && !_isAllLoaded) if (widget.data.metric.replyCount > 0 && !_isAllLoaded)
SizedBox( SizedBox(
width: 20, width: 20,
@ -1991,7 +1943,6 @@ class _PostCommentIntentState extends State<_PostCommentIntent> {
], ],
).opacity(0.75).padding(horizontal: widget.showAvatar ? 4 : 0), ).opacity(0.75).padding(horizontal: widget.showAvatar ? 4 : 0),
], ],
),
); );
} }
} }

View File

@ -9,7 +9,6 @@ import 'package:styled_widget/styled_widget.dart';
import 'package:surface/controllers/post_write_controller.dart'; import 'package:surface/controllers/post_write_controller.dart';
import 'package:surface/providers/config.dart'; import 'package:surface/providers/config.dart';
import 'package:surface/providers/sn_network.dart'; import 'package:surface/providers/sn_network.dart';
import 'package:surface/screens/post/post_editor.dart';
import 'package:surface/types/post.dart'; import 'package:surface/types/post.dart';
import 'package:surface/widgets/account/account_image.dart'; import 'package:surface/widgets/account/account_image.dart';
import 'package:surface/widgets/dialog.dart'; import 'package:surface/widgets/dialog.dart';
@ -18,10 +17,8 @@ import 'package:surface/widgets/loading_indicator.dart';
class PostMiniEditor extends StatefulWidget { class PostMiniEditor extends StatefulWidget {
final int? postReplyId; final int? postReplyId;
final Function? onPost; final Function? onPost;
final Function? onExpand;
const PostMiniEditor( const PostMiniEditor({super.key, this.postReplyId, this.onPost});
{super.key, this.postReplyId, this.onPost, this.onExpand});
@override @override
State<PostMiniEditor> createState() => _PostMiniEditorState(); State<PostMiniEditor> createState() => _PostMiniEditorState();
@ -217,16 +214,12 @@ class _PostMiniEditorState extends State<PostMiniEditor> {
onPressed: () { onPressed: () {
GoRouter.of(context).pushNamed( GoRouter.of(context).pushNamed(
'postEditor', 'postEditor',
extra: PostEditorExtra(
text: _writeController.contentController.text,
),
queryParameters: { queryParameters: {
if (widget.postReplyId != null) if (widget.postReplyId != null)
'replying': widget.postReplyId.toString(), 'replying': widget.postReplyId.toString(),
'mode': 'stories', 'mode': 'stories',
}, },
); );
widget.onExpand?.call();
}, },
), ),
TextButton.icon( TextButton.icon(

View File

@ -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 # 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 # 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. # of the product and file versions while build-number is used as the build suffix.
version: 2.4.2+82 version: 2.4.2+81
environment: environment:
sdk: ^3.5.4 sdk: ^3.5.4