diff --git a/packages/stream_chat/lib/src/models/attachment.dart b/packages/stream_chat/lib/src/models/attachment.dart index cc55aa71..e2e81cd9 100644 --- a/packages/stream_chat/lib/src/models/attachment.dart +++ b/packages/stream_chat/lib/src/models/attachment.dart @@ -58,7 +58,7 @@ class Attachment { final AttachmentFile file; /// The current upload state of the attachment - final UploadState uploadState; + UploadState uploadState; /// Map of custom channel extraData @JsonKey(includeIfNull: false) @@ -123,10 +123,15 @@ class Attachment { this.actions, this.extraData, this.file, - this.uploadState, + UploadState uploadState, }) : id = id ?? Uuid().v4(), title = title ?? file?.name, - localUri = file?.path != null ? Uri.parse(file.path) : null; + localUri = file?.path != null ? Uri.parse(file.path) : null { + this.uploadState = uploadState ?? + ((assetUrl != null || imageUrl != null) + ? UploadState.success() + : UploadState.preparing()); + } /// Create a new instance from a json factory Attachment.fromJson(Map json) { diff --git a/packages/stream_chat_flutter/lib/src/attachment/attachment_upload_state_builder.dart b/packages/stream_chat_flutter/lib/src/attachment/attachment_upload_state_builder.dart index fb65fd12..2425b966 100644 --- a/packages/stream_chat_flutter/lib/src/attachment/attachment_upload_state_builder.dart +++ b/packages/stream_chat_flutter/lib/src/attachment/attachment_upload_state_builder.dart @@ -27,7 +27,9 @@ class AttachmentUploadStateBuilder extends StatelessWidget { @override Widget build(BuildContext context) { - if (attachment.uploadState == null) return Offstage(); + if (message.status == null || message.status == MessageSendingStatus.sent) { + return Offstage(); + } final messageId = message.id; final attachmentId = attachment.id; diff --git a/packages/stream_chat_flutter/lib/src/attachment/file_attachment.dart b/packages/stream_chat_flutter/lib/src/attachment/file_attachment.dart index ee6b10c8..f7fbc277 100644 --- a/packages/stream_chat_flutter/lib/src/attachment/file_attachment.dart +++ b/packages/stream_chat_flutter/lib/src/attachment/file_attachment.dart @@ -227,6 +227,20 @@ class FileAttachment extends AttachmentWidget { }, ); + if (message != null && + (message.status == null || + message.status == MessageSendingStatus.sent)) { + trailingWidget = IconButton( + icon: StreamSvgIcon.cloudDownload(color: theme.colorTheme.black), + padding: const EdgeInsets.all(8), + visualDensity: VisualDensity.compact, + splashRadius: 16, + onPressed: () { + launchURL(context, attachment.assetUrl); + }, + ); + } + return Material( type: MaterialType.transparency, child: trailingWidget, @@ -241,6 +255,9 @@ class FileAttachment extends AttachmentWidget { ); return attachment.uploadState?.when( preparing: () { + if (message == null) { + return Text('${fileSize(size, 2)}', style: textStyle); + } return UploadProgressIndicator( uploaded: 0, total: double.maxFinite.toInt(), diff --git a/packages/stream_chat_flutter/lib/src/image_actions_modal.dart b/packages/stream_chat_flutter/lib/src/image_actions_modal.dart index 90d73064..1304b90d 100644 --- a/packages/stream_chat_flutter/lib/src/image_actions_modal.dart +++ b/packages/stream_chat_flutter/lib/src/image_actions_modal.dart @@ -109,10 +109,7 @@ class ImageActionsModal extends StatelessWidget { final remainingAttachments = [...message.attachments] ..removeAt(currentIndex); channel.updateMessage(message.copyWith( - attachments: remainingAttachments.map((e) { - return e.copyWith( - uploadState: UploadState.success()); - }).toList(), + attachments: remainingAttachments, )); Navigator.pop(context); Navigator.pop(context);