import 'package:flutter/material.dart'; import 'package:flutter_carousel_widget/flutter_carousel_widget.dart'; import 'package:flutter_markdown/flutter_markdown.dart'; import 'package:solaragent/models/feed.dart'; import 'package:solaragent/widgets/image.dart'; class FeedItem extends StatelessWidget { final Feed item; const FeedItem({super.key, required this.item}); bool hasAttachments() => item.attachments != null && item.attachments!.isNotEmpty; String getDescription(String desc) => desc.isEmpty ? "No description yet." : desc; String getFileUrl(String fileId) => 'https://co.solsynth.dev/api/attachments/o/$fileId'; @override Widget build(BuildContext context) { return Column( children: [ Container( color: Colors.grey[50], child: ListTile( title: Text(item.author.name), leading: CircleAvatar( backgroundImage: NetworkImage(item.author.avatar), ), subtitle: Text( getDescription(item.author.description), overflow: TextOverflow.ellipsis, maxLines: 1, softWrap: false, ), ), ), Markdown( data: item.content, shrinkWrap: true, physics: const NeverScrollableScrollPhysics(), ), hasAttachments() ? Container( decoration: const BoxDecoration( border: Border( top: BorderSide(width: 0.3, color: Color(0xffdedede))), ), child: FlutterCarousel( options: CarouselOptions( height: 240.0, viewportFraction: 1.0, showIndicator: true, slideIndicator: const CircularSlideIndicator(), ), items: item.attachments?.map((x) { return Builder( builder: (BuildContext context) { return SizedBox( width: MediaQuery.of(context).size.width, child: InkWell( child: Image.network( getFileUrl(x.fileId), fit: BoxFit.cover, ), onTap: () { Navigator.push(context, MaterialPageRoute(builder: (_) { return ImageLightbox( url: getFileUrl(x.fileId), ); })); }, ), ); }, ); }).toList(), ), ) : Container(), ], ); } }