diff --git a/lib/src/message_input.dart b/lib/src/message_input.dart index 5c725e8b9..5788d2932 100644 --- a/lib/src/message_input.dart +++ b/lib/src/message_input.dart @@ -16,6 +16,8 @@ import 'package:stream_chat_flutter/src/user_avatar.dart'; import '../stream_chat_flutter.dart'; import 'stream_channel.dart'; +typedef FileUploader = Future Function(File, Channel); + /// Inactive state /// ![screenshot](https://raw.githubusercontent.com/GetStream/stream-chat-flutter/master/screenshots/message_input.png) /// ![screenshot](https://raw.githubusercontent.com/GetStream/stream-chat-flutter/master/screenshots/message_input_paint.png) @@ -67,6 +69,8 @@ class MessageInput extends StatefulWidget { this.maxHeight = 150, this.keyboardType = TextInputType.multiline, this.disableAttachments = false, + this.doImageUploadRequest, + this.doFileUploadRequest, }) : super(key: key); /// Message to edit @@ -87,14 +91,25 @@ class MessageInput extends StatefulWidget { /// If true the attachments button will not be displayed final bool disableAttachments; + /// Override image upload request + final FileUploader doImageUploadRequest; + + /// Override file upload request + final FileUploader doFileUploadRequest; + @override - _MessageInputState createState() => _MessageInputState(); + _MessageInputState createState() => _MessageInputState( + doFileUploadRequest: doFileUploadRequest, + doImageUploadRequest: doImageUploadRequest, + ); } class _MessageInputState extends State { final List<_SendingAttachment> _attachments = []; final _focusNode = FocusNode(); final List _mentionedUsers = []; + FileUploader doImageUploadRequest; + FileUploader doFileUploadRequest; TextEditingController _textController; bool _inputEnabled = true; @@ -102,6 +117,14 @@ class _MessageInputState extends State { bool _typingStarted = false; OverlayEntry _commandsOverlay, _mentionsOverlay; + _MessageInputState({ + this.doImageUploadRequest, + this.doFileUploadRequest, + }) { + doImageUploadRequest ??= _uploadImage; + doFileUploadRequest ??= _uploadFile; + } + @override Widget build(BuildContext context) { return SafeArea( @@ -616,8 +639,6 @@ class _MessageInputState extends State { final channel = StreamChannel.of(context).channel; - final bytes = await file.readAsBytes(); - final attachment = _SendingAttachment( file: file, type: type, @@ -627,28 +648,7 @@ class _MessageInputState extends State { _attachments.add(attachment); }); - String url; - final filename = file.path.split('/').last; - - if (type == FileType.image) { - final res = await channel.sendImage( - MultipartFile.fromBytes( - bytes, - filename: filename, - contentType: MediaType.parse(lookupMimeType(filename)), - ), - ); - url = res.file; - } else { - final res = await channel.sendFile( - MultipartFile.fromBytes( - bytes, - filename: filename, - contentType: MediaType.parse(lookupMimeType(filename)), - ), - ); - url = res.file; - } + final url = await _uploadAttachment(file, type, channel); attachment.url = url; @@ -657,6 +657,46 @@ class _MessageInputState extends State { }); } + Future _uploadAttachment( + File file, + FileType type, + Channel channel, + ) async { + String url; + if (type == FileType.image) { + url = await doImageUploadRequest(file, channel); + } else { + url = await doFileUploadRequest(file, channel); + } + return url; + } + + Future _uploadImage(File file, Channel channel) async { + final filename = file.path.split('/').last; + final bytes = await file.readAsBytes(); + final res = await channel.sendImage( + MultipartFile.fromBytes( + bytes, + filename: filename, + contentType: MediaType.parse(lookupMimeType(filename)), + ), + ); + return res.file; + } + + Future _uploadFile(File file, Channel channel) async { + final filename = file.path.split('/').last; + final bytes = await file.readAsBytes(); + final res = await channel.sendFile( + MultipartFile.fromBytes( + bytes, + filename: filename, + contentType: MediaType.parse(lookupMimeType(filename)), + ), + ); + return res.file; + } + Widget _buildSendButton(BuildContext context) { return IconTheme( data: diff --git a/lib/src/message_widget.dart b/lib/src/message_widget.dart index acd1ff58b..d0802488d 100644 --- a/lib/src/message_widget.dart +++ b/lib/src/message_widget.dart @@ -154,7 +154,8 @@ class _MessageWidgetState extends State UserAvatar(user: widget.message.user), if (_isMyMessage && widget.nextMessage == null && - widget.message.status == MessageSendingStatus.SENT) + (widget.message.status == MessageSendingStatus.SENT || + widget.message.status == null)) Padding( padding: const EdgeInsets.symmetric( horizontal: 1.0,