diff --git a/lib/widgets/post.dart b/lib/widgets/post.dart index acceac6..98547b6 100644 --- a/lib/widgets/post.dart +++ b/lib/widgets/post.dart @@ -1,3 +1,5 @@ +import 'dart:ui' as ui; + import 'package:cached_network_image/cached_network_image.dart'; import 'package:esys_flutter_share/esys_flutter_share.dart'; import 'package:flutter/cupertino.dart'; @@ -97,11 +99,35 @@ class PostWidget extends HookWidget { ); } + List postNeedsToTruncate( + String body, + Size size, + ui.TextDirection textDirection, + ) { + final span = TextSpan( + text: body, + ); + final tp = TextPainter( + text: span, + maxLines: 20, + textDirection: textDirection, + )..layout(maxWidth: size.width - 20); + + return tp.computeLineMetrics(); + } + // == UI == @override Widget build(BuildContext context) { final theme = Theme.of(context); + final textPostData = post.post.body == null + ? [] + : postNeedsToTruncate( + post.post.body, + MediaQuery.of(context).size, + Directionality.of(context), + ); void _openLink() => linkLauncher( context: context, url: post.post.url, instanceHost: instanceHost); @@ -419,12 +445,54 @@ class PostWidget extends HookWidget { postImage() else if (post.post.url != null && post.post.url.isNotEmpty) linkPreview(), - if (post.post.body != null) + if (post.post.body != null && fullPost) // TODO: trim content Padding( padding: const EdgeInsets.all(10), child: MarkdownText(post.post.body, instanceHost: instanceHost)), + if (post.post.body != null && !fullPost && textPostData.length < 20) + // TODO: trim content + Padding( + padding: const EdgeInsets.all(10), + child: + MarkdownText(post.post.body, instanceHost: instanceHost)), + if (post.post.body != null && + !fullPost && + textPostData.length >= 20) + Container( + constraints: BoxConstraints( + maxHeight: + (textPostData.first as ui.LineMetrics).height * 20), + child: Stack( + alignment: Alignment.bottomCenter, + children: [ + ClipRect( + child: Align( + alignment: Alignment.topCenter, + heightFactor: 0.8, + child: Padding( + padding: const EdgeInsets.all(10), + child: MarkdownText(post.post.body, + instanceHost: instanceHost)), + ), + ), + Container( + height: (textPostData.first as ui.LineMetrics).height * 4, + decoration: BoxDecoration( + gradient: LinearGradient( + begin: Alignment.topCenter, + end: Alignment.bottomCenter, + colors: [ + Colors.transparent, + theme.cardColor, + ], + ), + ), + ), + ], + ), + ), actions(), ], ),