import 'package:flutter/material.dart'; import 'package:flutter_markdown/flutter_markdown.dart'; import 'package:flutter_svg/svg.dart'; import 'package:get/get.dart'; import 'package:solian/providers/link_expander.dart'; import 'package:solian/widgets/auto_cache_image.dart'; import 'package:url_launcher/url_launcher_string.dart'; class LinkExpansion extends StatelessWidget { final String content; const LinkExpansion({super.key, required this.content}); Widget _buildImage(String url, {double? width, double? height}) { if (url.endsWith('svg')) { return SvgPicture.network(url, width: width, height: height); } return AutoCacheImage( url, width: width, height: height, ); } @override Widget build(BuildContext context) { final linkRegex = RegExp( r'(? x)) Row( children: [ if (snapshot.data!.icon?.isNotEmpty ?? false) ClipRRect( borderRadius: const BorderRadius.all( Radius.circular(8), ), child: _buildImage( snapshot.data!.icon!, width: 32, height: 32, ), ).paddingOnly(right: 8), if (snapshot.data!.siteName != null) Text( snapshot.data!.siteName!, style: Theme.of(context).textTheme.labelLarge, ), ], ).paddingOnly( bottom: (snapshot.data!.icon?.isNotEmpty ?? false) ? 8 : 4, ), if (snapshot.data!.image != null && (snapshot.data!.image?.startsWith('http') ?? false)) ClipRRect( borderRadius: const BorderRadius.all( Radius.circular(8), ), child: _buildImage( snapshot.data!.image!, ), ).paddingOnly(bottom: 8), Text( snapshot.data!.title ?? 'No Title', maxLines: 1, overflow: TextOverflow.fade, style: Theme.of(context).textTheme.bodyLarge, ), if (snapshot.data!.description != null && isRichDescription) MarkdownBody(data: snapshot.data!.description!) else if (snapshot.data!.description != null) Text( snapshot.data!.description!, maxLines: 3, overflow: TextOverflow.ellipsis, ), ], ).paddingAll(12), ), onTap: () { launchUrlString(x.group(0)!); }, ); }, ), ); }).toList(), ); } }