Compare commits

..

No commits in common. "ec7650a9209f10da1506e05e0260712cbffc7c72" and "4146820be53db9c7d9e919123b0cc0099ebac532" have entirely different histories.

8 changed files with 22 additions and 172 deletions

View File

@ -207,7 +207,6 @@
"one": "{} comment",
"other": "{} comments"
},
"postCommentExpand": "Show comments",
"settingsAppearance": "Appearance",
"settingsCustomFonts": "Custom Fonts",
"settingsCustomFontsDescription": "Set custom fonts for the application.",

View File

@ -205,7 +205,6 @@
"one": "{} 条评论",
"other": "{} 条评论"
},
"postCommentExpand": "展开评论",
"settingsAppearance": "外观",
"settingsCustomFonts": "自定义字体",
"settingsCustomFontsDescription": "设置应用程序使用的字体。",

View File

@ -205,7 +205,6 @@
"one": "{} 條評論",
"other": "{} 條評論"
},
"postCommentExpand": "展開評論",
"settingsAppearance": "外觀",
"settingsCustomFonts": "自定義字體",
"settingsCustomFontsDescription": "設置應用程序使用的字體。",

View File

@ -205,7 +205,6 @@
"one": "{} 條評論",
"other": "{} 條評論"
},
"postCommentExpand": "展開評論",
"settingsAppearance": "外觀",
"settingsCustomFonts": "自定義字體",
"settingsCustomFontsDescription": "設置應用程序使用的字體。",

View File

@ -14,7 +14,6 @@ class AccountImage extends StatelessWidget {
final Widget? fallbackWidget;
final Widget? badge;
final Offset? badgeOffset;
final FilterQuality? filterQuality;
const AccountImage({
super.key,
@ -26,7 +25,6 @@ class AccountImage extends StatelessWidget {
this.fallbackWidget,
this.badge,
this.badgeOffset,
this.filterQuality,
});
@override
@ -56,7 +54,6 @@ class AccountImage extends StatelessWidget {
)
: AutoResizeUniversalImage(
sn.getAttachmentUrl(url),
filterQuality: filterQuality,
key: Key('attachment-${content.hashCode}'),
fit: BoxFit.cover,
),

View File

@ -45,25 +45,11 @@ class AttachmentItem extends StatelessWidget {
case 'image':
return Hero(
tag: 'attachment-${data!.rid}-$tag',
child: Stack(
fit: StackFit.expand,
children: [
ImageFiltered(
imageFilter: ImageFilter.blur(sigmaX: 20, sigmaY: 20),
child: AutoResizeUniversalImage(
sn.getAttachmentUrl(data!.rid),
key: Key('attachment-${data!.rid}-$tag-blur-background'),
fit: BoxFit.cover,
filterQuality: filterQuality,
),
),
AutoResizeUniversalImage(
sn.getAttachmentUrl(data!.rid),
key: Key('attachment-${data!.rid}-$tag'),
fit: fit,
filterQuality: filterQuality,
),
],
child: AutoResizeUniversalImage(
sn.getAttachmentUrl(data!.rid),
key: Key('attachment-${data!.rid}-$tag'),
fit: fit,
filterQuality: filterQuality,
),
);
case 'video':

View File

@ -138,7 +138,6 @@ class PostCommentSliverListState extends State<PostCommentSliverList> {
child: PostItem(
data: _posts[idx],
maxWidth: widget.maxWidth,
showExpandableComments: true,
onSelectAnswer: widget.parentPost.type == 'question'
? () => _selectAnswer(_posts[idx])
: null,
@ -210,7 +209,6 @@ class _PostCommentListPopupState extends State<PostCommentListPopup> {
if (ua.isAuthorized)
SliverToBoxAdapter(
child: Container(
margin: const EdgeInsets.only(bottom: 8),
height: 240,
decoration: BoxDecoration(
border: Border.symmetric(

View File

@ -50,7 +50,6 @@ class OpenablePostItem extends StatelessWidget {
final bool showComments;
final bool showMenu;
final bool showFullPost;
final bool showExpandableComments;
final double? maxWidth;
final Function(SnPost data)? onChanged;
final Function()? onDeleted;
@ -63,7 +62,6 @@ class OpenablePostItem extends StatelessWidget {
this.showComments = true,
this.showMenu = true,
this.showFullPost = false,
this.showExpandableComments = false,
this.maxWidth,
this.onChanged,
this.onDeleted,
@ -85,7 +83,6 @@ class OpenablePostItem extends StatelessWidget {
maxWidth: maxWidth,
showComments: showComments,
showFullPost: showFullPost,
showExpandableComments: showExpandableComments,
onChanged: onChanged,
onDeleted: onDeleted,
onSelectAnswer: onSelectAnswer,
@ -118,8 +115,6 @@ class PostItem extends StatelessWidget {
final bool showComments;
final bool showMenu;
final bool showFullPost;
final bool showAvatar;
final bool showExpandableComments;
final double? maxWidth;
final Function(SnPost data)? onChanged;
final Function()? onDeleted;
@ -132,8 +127,6 @@ class PostItem extends StatelessWidget {
this.showComments = true,
this.showMenu = true,
this.showFullPost = false,
this.showAvatar = true,
this.showExpandableComments = false,
this.maxWidth,
this.onChanged,
this.onDeleted,
@ -236,12 +229,11 @@ class PostItem extends StatelessWidget {
Row(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
if (showAvatar)
_PostAvatar(
data: data,
isCompact: false,
),
if (showAvatar) const Gap(12),
_PostAvatar(
data: data,
isCompact: false,
),
const Gap(12),
Expanded(
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
@ -358,33 +350,23 @@ class PostItem extends StatelessWidget {
minWidth: attachmentSize,
maxWidth: attachmentSize,
fit: showFullPost ? BoxFit.cover : BoxFit.contain,
padding: EdgeInsets.only(left: showAvatar ? 60 : 12, right: 12),
padding: const EdgeInsets.only(left: 60, right: 12),
),
if (data.preload?.poll != null)
PostPoll(poll: data.preload!.poll!).padding(
left: showAvatar ? 60 : 12,
right: 12,
top: 12,
bottom: 4,
),
PostPoll(poll: data.preload!.poll!)
.padding(horizontal: 12, vertical: 4),
if (data.body['content'] != null &&
(cfg.prefs.getBool(kAppExpandPostLink) ?? true))
LinkPreviewWidget(
text: data.body['content'],
).padding(left: showAvatar ? 60 : 12, right: 4),
if (showExpandableComments)
_PostCommentIntent(
data: data,
showAvatar: showAvatar,
).padding(left: showAvatar ? 60 : 12, right: 12)
else
_PostFeaturedComment(data: data, maxWidth: maxWidth)
.padding(left: showAvatar ? 60 : 12, right: 12),
).padding(left: 60, right: 4),
_PostFeaturedComment(data: data, maxWidth: maxWidth)
.padding(left: 60, right: 12),
Padding(
padding: const EdgeInsets.only(top: 4),
child: _PostReactionList(
data: data,
padding: EdgeInsets.only(left: showAvatar ? 60 : 12, right: 12),
padding: const EdgeInsets.only(left: 60, right: 12),
onChanged: _onChanged,
),
),
@ -422,24 +404,13 @@ class PostShareImageWidget extends StatelessWidget {
child: AutoResizeUniversalImage(
sn.getAttachmentUrl(data.preload!.thumbnail!.rid),
fit: BoxFit.cover,
filterQuality: FilterQuality.high,
),
),
).padding(bottom: 8),
Row(
children: [
_PostAvatar(
data: data,
isCompact: false,
filterQuality: FilterQuality.high,
),
const Gap(12),
_PostContentHeader(
data: data,
isRelativeDate: false,
).padding(horizontal: 16, bottom: 8),
],
),
_PostContentHeader(
data: data,
isRelativeDate: false,
).padding(horizontal: 16, bottom: 8),
if (data.type == 'question')
_PostQuestionHint(data: data).padding(horizontal: 16, bottom: 8),
_PostHeadline(
@ -832,12 +803,7 @@ class _PostHeadline extends StatelessWidget {
class _PostAvatar extends StatelessWidget {
final SnPost data;
final bool isCompact;
final FilterQuality? filterQuality;
const _PostAvatar({
required this.data,
required this.isCompact,
this.filterQuality,
});
const _PostAvatar({required this.data, required this.isCompact});
@override
Widget build(BuildContext context) {
@ -849,7 +815,6 @@ class _PostAvatar extends StatelessWidget {
return GestureDetector(
child: data.preload?.realm == null
? AccountImage(
filterQuality: filterQuality,
content: data.publisher.avatar,
radius: isCompact ? 12 : 20,
borderRadius: data.publisher.type == 1 ? (isCompact ? 4 : 8) : 20,
@ -862,7 +827,6 @@ class _PostAvatar extends StatelessWidget {
: null,
)
: AccountImage(
filterQuality: filterQuality,
content: data.preload!.realm!.avatar,
radius: isCompact ? 12 : 20,
borderRadius: isCompact ? 4 : 8,
@ -1431,97 +1395,6 @@ class _PostTruncatedHint extends StatelessWidget {
}
}
class _PostCommentIntent extends StatefulWidget {
final SnPost data;
final bool showAvatar;
const _PostCommentIntent({required this.data, this.showAvatar = false});
@override
State<_PostCommentIntent> createState() => _PostCommentIntentState();
}
class _PostCommentIntentState extends State<_PostCommentIntent> {
bool _isBusy = false;
int? _totalCount;
final List<SnPost> _comments = List.empty(growable: true);
bool get _isAllLoaded =>
_totalCount != null && _comments.length >= _totalCount!;
Future<void> _fetchComments() async {
setState(() => _isBusy = true);
try {
final sn = context.read<SnNetworkProvider>();
final resp = await sn.client.get(
'/cgi/co/posts/${widget.data.id}/replies',
queryParameters: {
'take': 10,
'offset': _comments.length,
},
);
_totalCount = resp.data['count'];
_comments.addAll(
resp.data['data'].map((ele) => SnPost.fromJson(ele)).cast<SnPost>(),
);
} catch (err) {
if (!mounted) return;
context.showErrorDialog(err);
} finally {
setState(() => _isBusy = false);
}
}
@override
Widget build(BuildContext context) {
return Column(
children: [
if (_comments.isNotEmpty)
Card(
margin: EdgeInsets.zero,
child: Column(
spacing: 8,
children: [
for (final ele in _comments)
PostItem(
data: ele,
showAvatar: false,
showExpandableComments: true,
maxWidth: double.infinity,
).padding(vertical: 8, left: 6),
],
),
).padding(bottom: 8),
Row(
children: [
Transform.flip(
flipX: true,
child: const Icon(Symbols.comment, size: 20),
),
const Gap(4),
Text('postCommentsDetailed'.plural(widget.data.metric.replyCount)),
if (widget.data.metric.replyCount > 0 && !_isAllLoaded)
SizedBox(
width: 20,
height: 20,
child: IconButton(
visualDensity: VisualDensity(horizontal: -4, vertical: -4),
constraints: const BoxConstraints(),
padding: EdgeInsets.zero,
icon: const Icon(Symbols.expand_more, size: 18),
onPressed: _isBusy
? null
: () {
_fetchComments();
},
),
).padding(left: 8),
],
).opacity(0.75).padding(horizontal: widget.showAvatar ? 4 : 0),
],
);
}
}
class _PostFeaturedComment extends StatefulWidget {
final SnPost data;
final double? maxWidth;