import 'package:fluffychat/config/app_config.dart'; import 'package:fluffychat/utils/file_description.dart'; import 'package:fluffychat/utils/matrix_sdk_extensions/event_extension.dart'; import 'package:fluffychat/utils/url_launcher.dart'; import 'package:flutter/material.dart'; import 'package:flutter_linkify/flutter_linkify.dart'; import 'package:matrix/matrix.dart'; class MessageDownloadContent extends StatelessWidget { final Event event; final Color textColor; final Color linkColor; const MessageDownloadContent( this.event, { required this.textColor, required this.linkColor, super.key, }); @override Widget build(BuildContext context) { final filename = event.content.tryGet('filename') ?? event.body; final filetype = (filename.contains('.') ? filename.split('.').last.toUpperCase() : event.content .tryGetMap('info') ?.tryGet('mimetype') ?.toUpperCase() ?? 'UNKNOWN'); final sizeString = event.sizeString ?? '?MB'; final fileDescription = event.fileDescription; return Column( mainAxisSize: MainAxisSize.min, crossAxisAlignment: CrossAxisAlignment.start, spacing: 8, children: [ Material( color: Colors.transparent, child: InkWell( borderRadius: BorderRadius.circular(AppConfig.borderRadius / 2), onTap: () => event.saveFile(context), child: Container( width: 400, padding: const EdgeInsets.all(16.0), child: Row( mainAxisSize: MainAxisSize.min, spacing: 16, children: [ CircleAvatar( backgroundColor: textColor.withAlpha(32), child: Icon(Icons.file_download_outlined, color: textColor), ), Column( crossAxisAlignment: CrossAxisAlignment.start, mainAxisSize: MainAxisSize.min, children: [ Text( filename, maxLines: 1, overflow: TextOverflow.ellipsis, style: TextStyle( color: textColor, fontWeight: FontWeight.w500, ), ), Text( '$sizeString | $filetype', maxLines: 1, overflow: TextOverflow.ellipsis, style: TextStyle(color: textColor, fontSize: 10), ), ], ), ], ), ), ), ), if (fileDescription != null) ...[ Padding( padding: const EdgeInsets.symmetric( horizontal: 16.0, vertical: 8.0, ), child: Linkify( text: fileDescription, textScaleFactor: MediaQuery.textScalerOf(context).scale(1), style: TextStyle( color: textColor, fontSize: AppConfig.fontSizeFactor * AppConfig.messageFontSize, ), options: const LinkifyOptions(humanize: false), linkStyle: TextStyle( color: linkColor, fontSize: AppConfig.fontSizeFactor * AppConfig.messageFontSize, decoration: TextDecoration.underline, decorationColor: linkColor, ), onOpen: (url) => UrlLauncher(context, url.url).launchUrl(), ), ), ], ], ); } }