import 'package:flutter/material.dart'; import 'package:localization/localization.dart'; import 'package:loris/business_logic/timeline/media.dart'; import 'package:url_launcher/url_launcher_string.dart'; class MediaAttachments extends StatelessWidget { const MediaAttachments({required this.models, Key? key}) : super(key: key); final List models; @override Widget build(BuildContext context) { List children = []; for (int i = 0; i < models.length; i++) { if (models[i].type == "image" || models[i].type == "gif") { children.add(ImageAttachmentDisplay(model: models[i])); } else { children.add(TextButton.icon( onPressed: () { launchUrlString(models[i].url); }, icon: const Icon(Icons.open_in_browser), label: Text("open-media-in-browser".i18n()))); } } return Column( children: children, ); } } class ImageAttachmentDisplay extends StatelessWidget { const ImageAttachmentDisplay({required this.model, Key? key}) : super(key: key); final MediaAttachmentModel model; @override Widget build(BuildContext context) { return Column(crossAxisAlignment: CrossAxisAlignment.start, children: [ Image.network( model.url, errorBuilder: ((context, error, stackTrace) => const Icon(Icons.error)), width: double.infinity, fit: BoxFit.fitWidth, ), const SizedBox( height: 4, ), model.description == null ? const SizedBox() : AltText(text: model.description!), ]); } } class AltText extends StatelessWidget { const AltText({ required this.text, Key? key, }) : super(key: key); final String text; @override Widget build(BuildContext context) { return SelectableText( text, style: Theme.of(context).textTheme.bodySmall, ); } }