This commit is contained in:
Salvatore Giordano
2020-11-18 13:32:18 +01:00
parent 957194217b
commit 7cf30b501f
5 changed files with 87 additions and 56 deletions
+1 -1
View File
@@ -1 +1 @@
bb5f9103d9045cd6244bcae1f5f343e5
c3e639ccf9b069e37a7d1345194e6b99
+1 -1
View File
@@ -1,6 +1,6 @@
name: example
description: A new Flutter project.
version: 1.0.59+61
version: 1.0.60+62
environment:
sdk: ">=2.2.2 <3.0.0"
+45 -54
View File
@@ -19,6 +19,7 @@ import 'package:stream_chat_flutter/src/media_list_view.dart';
import 'package:stream_chat_flutter/src/message_list_view.dart';
import 'package:stream_chat_flutter/src/stream_chat_theme.dart';
import 'package:stream_chat_flutter/src/user_avatar.dart';
import 'package:stream_chat_flutter/src/video_thumbnail.dart';
import 'package:substring_highlight/substring_highlight.dart';
import '../stream_chat_flutter.dart';
@@ -41,6 +42,8 @@ enum DefaultAttachmentTypes {
file,
}
const _kMinMediaPickerSize = 360.0;
/// 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)
@@ -182,7 +185,7 @@ class MessageInputState extends State<MessageInput> {
bool _sendAsDm = false;
bool _openFilePickerSection = false;
int _filePickerIndex = 0;
double _filePickerSize = 250.0;
double _filePickerSize = _kMinMediaPickerSize;
/// The editing controller passed to the input TextField
TextEditingController textEditingController;
@@ -654,9 +657,11 @@ class MessageInputState extends State<MessageInput> {
},
),
IconButton(
icon: Icon(
StreamIcons.camera,
size: 24,
icon: SvgPicture.asset(
'svgs/icon_camera.svg',
package: 'stream_chat_flutter',
height: 24,
width: 24,
color: _filePickerIndex == 2
? StreamChatTheme.of(context).accentColor
: Colors.black.withOpacity(0.5),
@@ -684,7 +689,7 @@ class MessageInputState extends State<MessageInput> {
setState(() {
_animateContainer = false;
_filePickerSize = (_filePickerSize - update.delta.dy).clamp(
240.0,
_kMinMediaPickerSize,
MediaQuery.of(context).size.height / 1.7,
);
});
@@ -753,9 +758,10 @@ class MessageInputState extends State<MessageInput> {
.any((element) => element.id == media.id)) {
_addAttachment(media);
} else {
_attachments
.removeWhere((element) => element.id == media.id);
setState(() {});
setState(() {
_attachments
.removeWhere((element) => element.id == media.id);
});
}
},
);
@@ -813,35 +819,7 @@ class MessageInputState extends State<MessageInput> {
}
void _addAttachment(Media medium) async {
final mediaFile = await medium.getFile();
final thumbBytes = await medium.getThumbnail();
final file = PlatformFile(
path: mediaFile.path,
bytes: mediaFile.readAsBytesSync(),
);
final thumbFile = PlatformFile(
bytes: thumbBytes,
name: '${file.name ?? file.path?.split('/')?.last}_thumbnail.jpeg',
);
setState(() {
_inputEnabled = true;
});
if (file == null) {
return;
}
final channel = StreamChannel.of(context).channel;
final attachment = _SendingAttachment(
file: file,
thumbFile: thumbFile,
attachment: Attachment(
localUri: file.path != null ? Uri.parse(file.path) : null,
type: medium.mediaType == MediaType.image ? 'image' : 'video',
),
id: medium.id,
);
@@ -849,11 +827,23 @@ class MessageInputState extends State<MessageInput> {
_attachments.add(attachment);
});
final thumbUrl = await _uploadImage(
thumbFile,
channel,
final mediaFile = await medium.getFile();
final file = PlatformFile(
path: mediaFile.path,
bytes: mediaFile.readAsBytesSync(),
);
final channel = StreamChannel.of(context).channel;
setState(() {
attachment
..file = file
..attachment = Attachment(
localUri: file.path != null ? Uri.parse(file.path) : null,
type: medium.mediaType == MediaType.image ? 'image' : 'video',
);
});
final url = await _uploadAttachment(
file,
medium.mediaType == MediaType.image
@@ -868,12 +858,10 @@ class MessageInputState extends State<MessageInput> {
if (fileType == DefaultAttachmentTypes.image) {
attachment.attachment = attachment.attachment.copyWith(
imageUrl: url,
thumbUrl: thumbUrl,
);
} else {
attachment.attachment = attachment.attachment.copyWith(
assetUrl: url,
thumbUrl: thumbUrl,
);
}
@@ -1221,6 +1209,10 @@ class MessageInputState extends State<MessageInput> {
);
}
if (attachment.attachment == null) {
return SizedBox();
}
switch (attachment.attachment.type) {
case 'image':
case 'giphy':
@@ -1230,22 +1222,20 @@ class MessageInputState extends State<MessageInput> {
fit: BoxFit.cover,
)
: Image.network(
attachment.attachment.imageUrl ??
attachment.attachment.thumbUrl,
attachment.attachment.imageUrl,
fit: BoxFit.cover,
);
break;
case 'video':
return Stack(
children: [
Container(
child: attachment.thumbFile != null
? Image.memory(
attachment.thumbFile.bytes,
fit: BoxFit.cover,
)
: Icon(Icons.videocam),
color: Colors.black26,
Positioned.fill(
child: Container(
child: VideoThumbnail(
file: File(
attachment.file.path,
)),
),
),
Positioned(
left: 8,
@@ -1314,7 +1304,7 @@ class MessageInputState extends State<MessageInput> {
setState(() {
_animateContainer = true;
_openFilePickerSection = false;
_filePickerSize = 250.0;
_filePickerSize = _kMinMediaPickerSize;
});
} else {
final status = await (Platform.isAndroid
@@ -1450,6 +1440,9 @@ class MessageInputState extends State<MessageInput> {
} else if (fileType == DefaultAttachmentTypes.video) {
pickedFile = await _imagePicker.getVideo(source: ImageSource.camera);
}
if (pickedFile == null) {
return;
}
final bytes = await pickedFile.readAsBytes();
file = PlatformFile(
path: pickedFile.path,
@@ -1774,14 +1767,12 @@ class MessageInputState extends State<MessageInput> {
class _SendingAttachment {
PlatformFile file;
PlatformFile thumbFile;
Attachment attachment;
bool uploaded;
String id;
_SendingAttachment({
this.file,
this.thumbFile,
this.attachment,
this.uploaded = false,
this.id,
+37
View File
@@ -0,0 +1,37 @@
import 'dart:io';
import 'package:flutter/material.dart';
import 'package:video_player/video_player.dart';
class VideoThumbnail extends StatefulWidget {
final File file;
const VideoThumbnail({
Key key,
@required this.file,
}) : super(key: key);
@override
_VideoThumbnailState createState() => _VideoThumbnailState();
}
class _VideoThumbnailState extends State<VideoThumbnail> {
VideoPlayerController _videoPlayerController;
@override
Widget build(BuildContext context) {
return VideoPlayer(_videoPlayerController);
}
@override
void initState() {
_videoPlayerController = VideoPlayerController.file(widget.file)
..initialize();
super.initState();
}
@override
void dispose() {
_videoPlayerController.dispose();
super.dispose();
}
}
+3
View File
@@ -0,0 +1,3 @@
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
<path fill-rule="evenodd" clip-rule="evenodd" d="M15 3H9L7 5H3C2.44771 5 2 5.44772 2 6V20C2 20.5523 2.44771 21 3 21H21C21.5523 21 22 20.5523 22 20V6C22 5.44772 21.5523 5 21 5H17L15 3ZM7.828 7L9.828 5H14.172L16.172 7H20V19H4V7H7.828ZM12 18C8.96243 18 6.5 15.5376 6.5 12.5C6.5 9.46243 8.96243 7 12 7C15.0376 7 17.5 9.46243 17.5 12.5C17.5 15.5376 15.0376 18 12 18ZM15.5 12.5C15.5 14.433 13.933 16 12 16C10.067 16 8.5 14.433 8.5 12.5C8.5 10.567 10.067 9 12 9C13.933 9 15.5 10.567 15.5 12.5Z" fill="black"/>
</svg>

After

Width:  |  Height:  |  Size: 606 B