diff --git a/assets/images/ic_file_docx.svg b/assets/images/ic_file_docx.svg
new file mode 100644
index 000000000..f809ecc45
--- /dev/null
+++ b/assets/images/ic_file_docx.svg
@@ -0,0 +1,4 @@
+
diff --git a/assets/images/ic_file_epup.svg b/assets/images/ic_file_epup.svg
new file mode 100644
index 000000000..7d561c8e1
--- /dev/null
+++ b/assets/images/ic_file_epup.svg
@@ -0,0 +1,4 @@
+
diff --git a/assets/images/ic_file_pdf.svg b/assets/images/ic_file_pdf.svg
new file mode 100644
index 000000000..f404dee74
--- /dev/null
+++ b/assets/images/ic_file_pdf.svg
@@ -0,0 +1,7 @@
+
diff --git a/assets/images/ic_file_png.svg b/assets/images/ic_file_png.svg
new file mode 100644
index 000000000..d1d36d1e8
--- /dev/null
+++ b/assets/images/ic_file_png.svg
@@ -0,0 +1,4 @@
+
diff --git a/assets/images/ic_file_pptx.svg b/assets/images/ic_file_pptx.svg
new file mode 100644
index 000000000..0c80e9829
--- /dev/null
+++ b/assets/images/ic_file_pptx.svg
@@ -0,0 +1,5 @@
+
diff --git a/assets/images/ic_file_xlsx.svg b/assets/images/ic_file_xlsx.svg
new file mode 100644
index 000000000..25738a203
--- /dev/null
+++ b/assets/images/ic_file_xlsx.svg
@@ -0,0 +1,4 @@
+
diff --git a/assets/images/ic_file_zip.svg b/assets/images/ic_file_zip.svg
new file mode 100644
index 000000000..09f67c425
--- /dev/null
+++ b/assets/images/ic_file_zip.svg
@@ -0,0 +1,8 @@
+
diff --git a/core/lib/domain/extensions/media_type_extension.dart b/core/lib/domain/extensions/media_type_extension.dart
index d09d3ae61..79e719af4 100644
--- a/core/lib/domain/extensions/media_type_extension.dart
+++ b/core/lib/domain/extensions/media_type_extension.dart
@@ -9,5 +9,15 @@ extension MediaTypeExtension on MediaType {
bool isImageFile() => SupportedPreviewFileTypes.imageMimeTypes.contains(mimeType);
+ bool isDocFile() => SupportedPreviewFileTypes.docMimeTypes.contains(mimeType);
+
+ bool isPowerPointFile() => SupportedPreviewFileTypes.pptMimeTypes.contains(mimeType);
+
+ bool isExcelFile() => SupportedPreviewFileTypes.xlsMimeTypes.contains(mimeType);
+
+ bool isZipFile() => SupportedPreviewFileTypes.zipMimeTypes.contains(mimeType);
+
+ bool isPdfFile() => SupportedPreviewFileTypes.pdfMimeTypes.contains(mimeType);
+
DocumentUti getDocumentUti() => DocumentUti(SupportedPreviewFileTypes.iOSSupportedTypes[mimeType]);
}
diff --git a/core/lib/domain/preview/supported_preview_file_types.dart b/core/lib/domain/preview/supported_preview_file_types.dart
index 378e2e58b..2689a1d1e 100644
--- a/core/lib/domain/preview/supported_preview_file_types.dart
+++ b/core/lib/domain/preview/supported_preview_file_types.dart
@@ -5,6 +5,41 @@ class SupportedPreviewFileTypes {
'image/gif',
'image/png',];
+ static const docMimeTypes = [
+ 'application/vnd.openxmlformats-officedocument.wordprocessingml.document',
+ 'application/vnd.oasis.opendocument.text',
+ 'application/vnd.oasis.opendocument.text-template',
+ 'application/vnd.oasis.opendocument.text-web',
+ 'application/vnd.oasis.opendocument.text-master',
+ 'application/msword',
+ 'application/vnd.ms-works'];
+
+ static const pdfMimeTypes = [
+ 'application/pdf',
+ 'application/rtf'];
+
+ static const xlsMimeTypes = [
+ 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',
+ 'application/vnd.oasis.opendocument.spreadsheet',
+ 'application/vnd.oasis.opendocument.spreadsheet-template',
+ 'application/vnd.oasis.opendocument.chart',
+ 'application/vnd.oasis.opendocument.formula',
+ 'application/vnd.ms-excel'];
+
+ static const pptMimeTypes = [
+ 'application/vnd.openxmlformats-officedocument.presentationml.presentation',
+ 'application/vnd.oasis.opendocument.presentation',
+ 'application/vnd.oasis.opendocument.presentation-template',
+ 'application/vnd.ms-powerpoint'];
+
+ static const zipMimeTypes = [
+ 'application/x-tar',
+ 'application/x-gtar',
+ 'application/x-gzip',
+ 'application/x-compressed',
+ 'application/x-zip-compressed',
+ 'application/java-archive'];
+
static const iOSSupportedTypes = {
'text/plain' : 'public.plain-text',
'text/html' : 'public.html',
diff --git a/core/lib/presentation/resources/image_paths.dart b/core/lib/presentation/resources/image_paths.dart
index 6e480151e..826b4ea70 100644
--- a/core/lib/presentation/resources/image_paths.dart
+++ b/core/lib/presentation/resources/image_paths.dart
@@ -118,6 +118,13 @@ class ImagePaths {
String get icSelectedSB => _getImagePath('ic_selected_sb.svg');
String get icUserSB => _getImagePath('ic_user_sb.svg');
String get icComposeWeb => _getImagePath('ic_compose_web.svg');
+ String get icFileDocx => _getImagePath('ic_file_docx.svg');
+ String get icFileZip => _getImagePath('ic_file_zip.svg');
+ String get icFileXlsx => _getImagePath('ic_file_xlsx.svg');
+ String get icFilePng => _getImagePath('ic_file_png.svg');
+ String get icFilePdf => _getImagePath('ic_file_pdf.svg');
+ String get icFilePptx => _getImagePath('ic_file_pptx.svg');
+ String get icFileEPup => _getImagePath('ic_file_epup.svg');
String _getImagePath(String imageName) {
return AssetsPaths.images + imageName;
diff --git a/lib/features/email/presentation/email_view.dart b/lib/features/email/presentation/email_view.dart
index d3d26a1a7..bb776f9be 100644
--- a/lib/features/email/presentation/email_view.dart
+++ b/lib/features/email/presentation/email_view.dart
@@ -479,6 +479,7 @@ class EmailView extends GetView with NetworkConnectionMixin {
icon: SvgPicture.asset(imagePaths.icExpandAttachment,
width: 20,
height: 20,
+ color: AppColor.primaryColor,
fit: BoxFit.fill),
onPressed: () => emailController.toggleDisplayAttachmentsAction()
))
diff --git a/lib/features/email/presentation/extensions/attachment_extension.dart b/lib/features/email/presentation/extensions/attachment_extension.dart
new file mode 100644
index 000000000..f31e7ad52
--- /dev/null
+++ b/lib/features/email/presentation/extensions/attachment_extension.dart
@@ -0,0 +1,28 @@
+
+import 'package:core/core.dart';
+import 'package:model/email/attachment.dart';
+
+extension AttachmentExtension on Attachment {
+
+ String getIcon(ImagePaths imagePaths) {
+ final mediaType = type;
+ log('AttachmentExtension::getIcon(): mediaType: $mediaType');
+ if (mediaType == null) {
+ return imagePaths.icFileEPup;
+ }
+ if (mediaType.isDocFile()) {
+ return imagePaths.icFileDocx;
+ } else if (mediaType.isExcelFile()) {
+ return imagePaths.icFileXlsx;
+ } else if (mediaType.isPowerPointFile()) {
+ return imagePaths.icFilePptx;
+ } else if (mediaType.isPdfFile()) {
+ return imagePaths.icFilePdf;
+ } else if (mediaType.isZipFile()) {
+ return imagePaths.icFileZip;
+ } else if (mediaType.isImageFile()) {
+ return imagePaths.icFilePng;
+ }
+ return imagePaths.icFileEPup;
+ }
+}
\ No newline at end of file
diff --git a/lib/features/email/presentation/widgets/attachment_file_tile_builder.dart b/lib/features/email/presentation/widgets/attachment_file_tile_builder.dart
index d49304111..72d6d4c2d 100644
--- a/lib/features/email/presentation/widgets/attachment_file_tile_builder.dart
+++ b/lib/features/email/presentation/widgets/attachment_file_tile_builder.dart
@@ -4,6 +4,7 @@ import 'package:filesize/filesize.dart';
import 'package:flutter/material.dart';
import 'package:flutter_svg/flutter_svg.dart';
import 'package:model/model.dart';
+import 'package:tmail_ui_user/features/email/presentation/extensions/attachment_extension.dart';
typedef OnDownloadAttachmentFileActionClick = void Function(Attachment attachment);
typedef OnExpandAttachmentActionClick = void Function();
@@ -59,6 +60,7 @@ class AttachmentFileTileBuilder {
alignment: Alignment.center,
margin: EdgeInsets.only(top:heightItem != null ? 8 : 0),
height: heightItem,
+ padding: EdgeInsets.zero,
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(8),
border: Border.all(color: AppColor.attachmentFileBorderColor),
@@ -76,11 +78,19 @@ class AttachmentFileTileBuilder {
if (_onDownloadAttachmentFileActionClick != null) {
_onDownloadAttachmentFileActionClick!(_attachment);
}},
- leading: Transform(
- transform: Matrix4.translationValues(14.0, 2.0, 0.0),
- child: SvgPicture.asset(_imagePaths.icFileAttachment, width: 24, height: 24, fit: BoxFit.fill)),
+ leading: Padding(
+ padding: const EdgeInsets.only(left: 8, bottom: BuildUtils.isWeb ? 6 : 14),
+ child: SvgPicture.asset(
+ _attachment.getIcon(_imagePaths),
+ width: 44,
+ height: 44,
+ fit: BoxFit.fill),
+ ),
title: Transform(
- transform: Matrix4.translationValues(-8.0, -8.0, 0.0),
+ transform: Matrix4.translationValues(
+ BuildUtils.isWeb ? 0.0 : -8.0,
+ BuildUtils.isWeb ? -8.0 : -10.0,
+ 0.0),
child: Text(
_attachment.name ?? '',
maxLines: 1,
@@ -89,7 +99,10 @@ class AttachmentFileTileBuilder {
)),
subtitle: _attachment.size != null && _attachment.size?.value != 0
? Transform(
- transform: Matrix4.translationValues(-8.0, -8.0, 0.0),
+ transform: Matrix4.translationValues(
+ BuildUtils.isWeb ? 0.0 : -8.0,
+ BuildUtils.isWeb ? -8.0 : -10.0,
+ 0.0),
child: Text(
filesize(_attachment.size?.value),
maxLines: 1,
@@ -106,7 +119,12 @@ class AttachmentFileTileBuilder {
Transform(
transform: Matrix4.translationValues(5.0, 5.0, 0.0),
child: IconButton(
- icon: SvgPicture.asset(_imagePaths.icDownload, width: 24, height: 24, fit: BoxFit.fill),
+ icon: SvgPicture.asset(
+ _imagePaths.icDownload,
+ width: 24,
+ height: 24,
+ color: AppColor.primaryColor,
+ fit: BoxFit.fill),
onPressed: () {
if (_onDownloadAttachmentFileActionClick != null) {
_onDownloadAttachmentFileActionClick!(_attachment);