Merge branch 'master' into feature/notifications

This commit is contained in:
Salvatore Giordano
2020-04-10 12:03:43 +02:00
5 changed files with 117 additions and 56 deletions
+47 -17
View File
@@ -63,6 +63,8 @@ class MessageInput extends StatefulWidget {
this.parentMessage,
this.editMessage,
this.maxHeight = 150,
this.keyboardType = TextInputType.multiline,
this.disableAttachments = false,
}) : super(key: key);
/// Message to edit
@@ -77,6 +79,12 @@ class MessageInput extends StatefulWidget {
/// Maximum Height for the TextField to grow before it starts scrolling
final double maxHeight;
/// The keyboard type assigned to the TextField
final TextInputType keyboardType;
/// If true the attachments button will not be displayed
final bool disableAttachments;
@override
_MessageInputState createState() => _MessageInputState();
}
@@ -87,6 +95,7 @@ class _MessageInputState extends State<MessageInput> {
final List<User> _mentionedUsers = [];
TextEditingController _textController;
bool _inputEnabled = true;
bool _messageIsPresent = false;
bool _typingStarted = false;
OverlayEntry _commandsOverlay, _mentionsOverlay;
@@ -94,20 +103,27 @@ class _MessageInputState extends State<MessageInput> {
@override
Widget build(BuildContext context) {
return SafeArea(
child: Padding(
padding: const EdgeInsets.all(8.0),
child: Stack(
overflow: Overflow.visible,
children: <Widget>[
_buildBorder(context),
Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
_buildAttachments(),
_buildTextField(context),
],
),
],
child: GestureDetector(
onPanUpdate: (details) {
if (details.delta.dy > 0) {
_focusNode.unfocus();
}
},
child: Padding(
padding: const EdgeInsets.all(8.0),
child: Stack(
overflow: Overflow.visible,
children: <Widget>[
_buildBorder(context),
Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
_buildAttachments(),
_buildTextField(context),
],
),
],
),
),
),
);
@@ -118,7 +134,7 @@ class _MessageInputState extends State<MessageInput> {
direction: Axis.horizontal,
crossAxisAlignment: CrossAxisAlignment.end,
children: <Widget>[
_buildAttachmentButton(),
if (!widget.disableAttachments) _buildAttachmentButton(),
_buildTextInput(context),
_animateSendButton(context),
],
@@ -127,7 +143,8 @@ class _MessageInputState extends State<MessageInput> {
AnimatedCrossFade _animateSendButton(BuildContext context) {
return AnimatedCrossFade(
crossFadeState: (_messageIsPresent || _attachments.isNotEmpty)
crossFadeState: ((_messageIsPresent || _attachments.isNotEmpty) &&
_attachments.every((a) => a.uploaded == true))
? CrossFadeState.showFirst
: CrossFadeState.showSecond,
firstChild: _buildSendButton(context),
@@ -143,11 +160,13 @@ class _MessageInputState extends State<MessageInput> {
maxHeight: widget.maxHeight,
child: TextField(
key: Key('messageInputText'),
enabled: _inputEnabled,
minLines: null,
maxLines: null,
onSubmitted: (_) {
_sendMessage(context);
},
keyboardType: widget.keyboardType,
controller: _textController,
focusNode: _focusNode,
onChanged: (s) {
@@ -507,6 +526,10 @@ class _MessageInputState extends State<MessageInput> {
}
void _showAttachmentModal() {
if (_focusNode.hasFocus) {
_focusNode.unfocus();
}
showModalBottomSheet(
clipBehavior: Clip.hardEdge,
shape: RoundedRectangleBorder(
@@ -549,7 +572,6 @@ class _MessageInputState extends State<MessageInput> {
leading: Icon(Icons.camera_alt),
title: Text('Photo from camera'),
onTap: () {
ImagePicker.pickImage(source: ImageSource.camera);
_pickFile(FileType.image, true);
Navigator.pop(context);
},
@@ -576,6 +598,10 @@ class _MessageInputState extends State<MessageInput> {
}
void _pickFile(FileType type, bool camera) async {
setState(() {
_inputEnabled = false;
});
File file;
if (camera) {
@@ -588,6 +614,10 @@ class _MessageInputState extends State<MessageInput> {
file = await FilePicker.getFile(type: type);
}
setState(() {
_inputEnabled = true;
});
if (file == null) {
return;
}
+49 -37
View File
@@ -43,6 +43,7 @@ class MessageWidget extends StatefulWidget {
this.isParent = false,
this.onMentionTap,
this.showOtherMessageUsername = false,
this.showVideoFullScreen = true,
}) : super(key: key);
/// Function called on mention tap
@@ -69,6 +70,9 @@ class MessageWidget extends StatefulWidget {
/// True if this is the parent of the thread being showed
final bool isParent;
/// True if the video player will allow fullscreen mode
final bool showVideoFullScreen;
@override
_MessageWidgetState createState() => _MessageWidgetState();
}
@@ -1030,45 +1034,53 @@ class _MessageWidgetState extends State<MessageWidget>
_videoControllers[attachment.assetUrl] = videoController;
}
ChewieController chewieController;
if (_chuwieControllers.containsKey(attachment.assetUrl)) {
chewieController = _chuwieControllers[attachment.assetUrl];
} else {
chewieController = ChewieController(
videoPlayerController: videoController,
autoInitialize: true,
errorBuilder: (_, e) {
if (attachment.thumbUrl == null) {
return _buildErrorImage(attachment);
}
return Stack(
children: <Widget>[
Container(
decoration: BoxDecoration(
image: DecorationImage(
fit: BoxFit.cover,
image: CachedNetworkImageProvider(
attachment.thumbUrl,
return FutureBuilder<void>(
future: videoController.initialize(),
builder: (_, snapshot) {
if (snapshot.connectionState != ConnectionState.done) {
return Center(
child: CircularProgressIndicator(),
);
}
ChewieController chewieController;
if (_chuwieControllers.containsKey(attachment.assetUrl)) {
chewieController = _chuwieControllers[attachment.assetUrl];
} else {
chewieController = ChewieController(
allowFullScreen: widget.showVideoFullScreen,
videoPlayerController: videoController,
autoInitialize: false,
aspectRatio: videoController.value.aspectRatio,
errorBuilder: (_, e) {
return Stack(
children: <Widget>[
Container(
decoration: BoxDecoration(
image: DecorationImage(
fit: BoxFit.cover,
image: CachedNetworkImageProvider(
attachment.thumbUrl,
),
),
),
),
),
),
Material(
color: Colors.transparent,
child: InkWell(
onTap: () => _launchURL(attachment.titleLink),
),
),
],
);
});
_chuwieControllers[attachment.assetUrl] = chewieController;
}
return Chewie(
key: ValueKey<String>(
'ATTACHMENT-${attachment.title}-${widget.message.id}'),
controller: chewieController,
Material(
color: Colors.transparent,
child: InkWell(
onTap: () => _launchURL(attachment.titleLink),
),
),
],
);
});
_chuwieControllers[attachment.assetUrl] = chewieController;
}
return Chewie(
key: ValueKey<String>(
'ATTACHMENT-${attachment.title}-${widget.message.id}'),
controller: chewieController,
);
},
);
}