137 lines
		
	
	
		
			4.7 KiB
		
	
	
	
		
			Dart
		
	
	
	
			
		
		
	
	
			137 lines
		
	
	
		
			4.7 KiB
		
	
	
	
		
			Dart
		
	
	
	
| import 'package:extera_next/pages/chat/events/html_message.dart';
 | |
| import 'package:flutter/material.dart';
 | |
| 
 | |
| import 'package:flutter_linkify/flutter_linkify.dart';
 | |
| import 'package:matrix/matrix.dart';
 | |
| 
 | |
| import 'package:extera_next/config/app_config.dart';
 | |
| import 'package:extera_next/utils/file_description.dart';
 | |
| import 'package:extera_next/utils/matrix_sdk_extensions/event_extension.dart';
 | |
| import 'package:extera_next/utils/url_launcher.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<String>('filename') ?? event.body;
 | |
|     final filetype = (filename.contains('.')
 | |
|         ? filename.split('.').last.toUpperCase()
 | |
|         : event.content
 | |
|                 .tryGetMap<String, dynamic>('info')
 | |
|                 ?.tryGet<String>('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: () => {
 | |
|               if (event.canDownloadInBackground)
 | |
|                 event.downloadInBackground(context)
 | |
|               else
 | |
|                 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 && !event.isRichFileDescription) ...[
 | |
|           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(),
 | |
|             ),
 | |
|           ),
 | |
|         ],
 | |
|         if (fileDescription != null && event.isRichFileDescription) ...[
 | |
|           Padding(
 | |
|             padding: const EdgeInsets.symmetric(
 | |
|               horizontal: 16.0,
 | |
|               vertical: 8.0,
 | |
|             ),
 | |
|             child: HtmlMessage(
 | |
|               html: fileDescription,
 | |
|               textColor: textColor,
 | |
|               room: event.room,
 | |
|               fontSize: AppConfig.fontSizeFactor * AppConfig.messageFontSize,
 | |
|               linkStyle: TextStyle(
 | |
|                 color: linkColor,
 | |
|                 fontSize: AppConfig.fontSizeFactor * AppConfig.messageFontSize,
 | |
|                 decoration: TextDecoration.underline,
 | |
|                 decorationColor: linkColor,
 | |
|               ),
 | |
|               onOpen: (url) => UrlLauncher(context, url.url).launchUrl(),
 | |
|             ),
 | |
|           ),
 | |
|         ],
 | |
|       ],
 | |
|     );
 | |
|   }
 | |
| }
 |