Merge branch 'master' into develop
This commit is contained in:
@@ -32,7 +32,7 @@ jobs:
|
|||||||
TOTAL_MAX: ${{ steps.analysis.outputs.total_max }}
|
TOTAL_MAX: ${{ steps.analysis.outputs.total_max }}
|
||||||
run: |
|
run: |
|
||||||
PERCENTAGE=$(( $TOTAL * 100 / $TOTAL_MAX ))
|
PERCENTAGE=$(( $TOTAL * 100 / $TOTAL_MAX ))
|
||||||
if (( $PERCENTAGE < 100 ))
|
if (( $PERCENTAGE < 90 ))
|
||||||
then
|
then
|
||||||
echo Score too low!
|
echo Score too low!
|
||||||
exit 1
|
exit 1
|
||||||
|
|||||||
@@ -30,7 +30,7 @@ jobs:
|
|||||||
run: melos bootstrap
|
run: melos bootstrap
|
||||||
- name: 'Dart Analyze'
|
- name: 'Dart Analyze'
|
||||||
run: |
|
run: |
|
||||||
melos exec -c 3 -- \
|
melos exec -c 3 --ignore="*example*" -- \
|
||||||
tuneup check
|
tuneup check
|
||||||
- name: 'Pub Check'
|
- name: 'Pub Check'
|
||||||
run: |
|
run: |
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
# Official Flutter packages for [Stream Chat](https://getstream.io/chat/)
|
# Official Flutter packages for [Stream Chat](https://getstream.io/chat/sdk/flutter/)
|
||||||
|
|
||||||

|

|
||||||
|
|
||||||
|
|||||||
@@ -1,3 +1,10 @@
|
|||||||
|
## 1.4.0-beta
|
||||||
|
|
||||||
|
- Improved attachment uploading
|
||||||
|
- Fix: update member presence
|
||||||
|
- Added skip_push to message model
|
||||||
|
- Minor fixes and improvements
|
||||||
|
|
||||||
## 1.3.2+1-beta
|
## 1.3.2+1-beta
|
||||||
|
|
||||||
- Fixed queryChannels bug
|
- Fixed queryChannels bug
|
||||||
|
|||||||
@@ -338,6 +338,7 @@ class Channel {
|
|||||||
_messageAttachmentsUploadCompleter[message.id] =
|
_messageAttachmentsUploadCompleter[message.id] =
|
||||||
attachmentsUploadCompleter;
|
attachmentsUploadCompleter;
|
||||||
|
|
||||||
|
// ignore: unawaited_futures
|
||||||
_uploadAttachments(
|
_uploadAttachments(
|
||||||
message.id,
|
message.id,
|
||||||
message.attachments.map((it) => it.id),
|
message.attachments.map((it) => it.id),
|
||||||
@@ -388,6 +389,7 @@ class Channel {
|
|||||||
_messageAttachmentsUploadCompleter[message.id] =
|
_messageAttachmentsUploadCompleter[message.id] =
|
||||||
attachmentsUploadCompleter;
|
attachmentsUploadCompleter;
|
||||||
|
|
||||||
|
// ignore: unawaited_futures
|
||||||
_uploadAttachments(
|
_uploadAttachments(
|
||||||
message.id,
|
message.id,
|
||||||
message.attachments.map((it) => it.id),
|
message.attachments.map((it) => it.id),
|
||||||
|
|||||||
@@ -510,6 +510,7 @@ class StreamChatClient {
|
|||||||
|
|
||||||
if (status == ConnectionStatus.connected &&
|
if (status == ConnectionStatus.connected &&
|
||||||
state.channels?.isNotEmpty == true) {
|
state.channels?.isNotEmpty == true) {
|
||||||
|
// ignore: unawaited_futures
|
||||||
queryChannelsOnline(filter: {
|
queryChannelsOnline(filter: {
|
||||||
'cid': {
|
'cid': {
|
||||||
'\$in': state.channels.keys.toList(),
|
'\$in': state.channels.keys.toList(),
|
||||||
|
|||||||
@@ -3,4 +3,4 @@ import 'package:stream_chat/src/client.dart';
|
|||||||
/// Current package version
|
/// Current package version
|
||||||
/// Used in [StreamChatClient] to build the `x-stream-client` header
|
/// Used in [StreamChatClient] to build the `x-stream-client` header
|
||||||
// ignore: constant_identifier_names
|
// ignore: constant_identifier_names
|
||||||
const PACKAGE_VERSION = '1.3.2+1-beta';
|
const PACKAGE_VERSION = '1.4.0-beta';
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
name: stream_chat
|
name: stream_chat
|
||||||
homepage: https://getstream.io/
|
homepage: https://getstream.io/
|
||||||
description: The official Dart client for Stream Chat, a service for building chat applications.
|
description: The official Dart client for Stream Chat, a service for building chat applications.
|
||||||
version: 1.3.2+1-beta
|
version: 1.4.0-beta
|
||||||
repository: https://github.com/GetStream/stream-chat-flutter
|
repository: https://github.com/GetStream/stream-chat-flutter
|
||||||
issue_tracker: https://github.com/GetStream/stream-chat-flutter/issues
|
issue_tracker: https://github.com/GetStream/stream-chat-flutter/issues
|
||||||
|
|
||||||
|
|||||||
@@ -1,3 +1,17 @@
|
|||||||
|
## 1.4.0-beta
|
||||||
|
|
||||||
|
- Unfocus `MessageInput` only when sending commands
|
||||||
|
- Updated default error for `MessageSearchListView`
|
||||||
|
- Show error messages as system and keep them in the message input
|
||||||
|
- Remove notification badge logic
|
||||||
|
- Use shimmer while loading images
|
||||||
|
- Polished `StreamChatTheme` adding more options and a new `MessageInputTheme` dedicated to `MessageInput`
|
||||||
|
- Add possibility to specify custom message actions using `MessageWidget.customActions`
|
||||||
|
- Added `MessageListView.onAttachmentTap` callback
|
||||||
|
- Fixed message newline issue
|
||||||
|
- Fixed `MessageListView` scroll keyboard behaviour
|
||||||
|
- Minor fixes and improveqments
|
||||||
|
|
||||||
## 1.3.2-beta
|
## 1.3.2-beta
|
||||||
|
|
||||||
- Updated `stream_chat_core` dependency
|
- Updated `stream_chat_core` dependency
|
||||||
|
|||||||
@@ -45,10 +45,10 @@ class FileAttachment extends AttachmentWidget {
|
|||||||
crossAxisAlignment: CrossAxisAlignment.start,
|
crossAxisAlignment: CrossAxisAlignment.start,
|
||||||
children: [
|
children: [
|
||||||
Container(
|
Container(
|
||||||
child: _getFileTypeImage(context),
|
|
||||||
height: 40.0,
|
height: 40.0,
|
||||||
width: 33.33,
|
width: 33.33,
|
||||||
margin: EdgeInsets.all(8.0),
|
margin: EdgeInsets.all(8.0),
|
||||||
|
child: _getFileTypeImage(context),
|
||||||
),
|
),
|
||||||
SizedBox(width: 8.0),
|
SizedBox(width: 8.0),
|
||||||
Expanded(
|
Expanded(
|
||||||
|
|||||||
@@ -143,6 +143,7 @@ class GiphyAttachment extends AttachmentWidget {
|
|||||||
Card(
|
Card(
|
||||||
color: Colors.white,
|
color: Colors.white,
|
||||||
elevation: 2,
|
elevation: 2,
|
||||||
|
shape: CircleBorder(),
|
||||||
child: IconButton(
|
child: IconButton(
|
||||||
padding: const EdgeInsets.all(0),
|
padding: const EdgeInsets.all(0),
|
||||||
constraints: BoxConstraints.tight(Size(32, 32)),
|
constraints: BoxConstraints.tight(Size(32, 32)),
|
||||||
@@ -156,7 +157,6 @@ class GiphyAttachment extends AttachmentWidget {
|
|||||||
});
|
});
|
||||||
},
|
},
|
||||||
),
|
),
|
||||||
shape: CircleBorder(),
|
|
||||||
),
|
),
|
||||||
Expanded(
|
Expanded(
|
||||||
child: Center(
|
child: Center(
|
||||||
@@ -171,6 +171,7 @@ class GiphyAttachment extends AttachmentWidget {
|
|||||||
Card(
|
Card(
|
||||||
color: Colors.white,
|
color: Colors.white,
|
||||||
elevation: 2,
|
elevation: 2,
|
||||||
|
shape: CircleBorder(),
|
||||||
child: IconButton(
|
child: IconButton(
|
||||||
padding: const EdgeInsets.all(0),
|
padding: const EdgeInsets.all(0),
|
||||||
constraints: BoxConstraints.tight(Size(32, 32)),
|
constraints: BoxConstraints.tight(Size(32, 32)),
|
||||||
@@ -184,7 +185,6 @@ class GiphyAttachment extends AttachmentWidget {
|
|||||||
});
|
});
|
||||||
},
|
},
|
||||||
),
|
),
|
||||||
shape: CircleBorder(),
|
|
||||||
),
|
),
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
|
|||||||
@@ -9,26 +9,32 @@ import 'package:path_provider/path_provider.dart';
|
|||||||
import '../stream_chat_flutter.dart';
|
import '../stream_chat_flutter.dart';
|
||||||
import 'extension.dart';
|
import 'extension.dart';
|
||||||
|
|
||||||
|
/// Callback to download an attachment asset
|
||||||
typedef AttachmentDownloader = Future<String> Function(
|
typedef AttachmentDownloader = Future<String> Function(
|
||||||
Attachment attachment, {
|
Attachment attachment, {
|
||||||
ProgressCallback progressCallback,
|
ProgressCallback progressCallback,
|
||||||
});
|
});
|
||||||
|
|
||||||
|
/// Widget that shows the options in the gallery view
|
||||||
class AttachmentActionsModal extends StatelessWidget {
|
class AttachmentActionsModal extends StatelessWidget {
|
||||||
|
/// The message containing the attachments
|
||||||
final Message message;
|
final Message message;
|
||||||
final String userName;
|
|
||||||
final String sentAt;
|
/// Current page index
|
||||||
final List<Attachment> attachments;
|
|
||||||
final currentIndex;
|
final currentIndex;
|
||||||
|
|
||||||
|
/// Callback to show the message
|
||||||
final VoidCallback onShowMessage;
|
final VoidCallback onShowMessage;
|
||||||
|
|
||||||
|
/// Callback to download images
|
||||||
final AttachmentDownloader imageDownloader;
|
final AttachmentDownloader imageDownloader;
|
||||||
|
|
||||||
|
/// Callback to provide download files
|
||||||
final AttachmentDownloader fileDownloader;
|
final AttachmentDownloader fileDownloader;
|
||||||
|
|
||||||
|
/// Returns a new [AttachmentActionsModal]
|
||||||
const AttachmentActionsModal({
|
const AttachmentActionsModal({
|
||||||
this.message,
|
this.message,
|
||||||
this.userName,
|
|
||||||
this.sentAt,
|
|
||||||
this.attachments,
|
|
||||||
this.currentIndex,
|
this.currentIndex,
|
||||||
this.onShowMessage,
|
this.onShowMessage,
|
||||||
this.imageDownloader,
|
this.imageDownloader,
|
||||||
@@ -85,13 +91,13 @@ class AttachmentActionsModal extends StatelessWidget {
|
|||||||
),
|
),
|
||||||
_buildButton(
|
_buildButton(
|
||||||
context,
|
context,
|
||||||
'Save ${attachments[currentIndex].type == 'video' ? 'Video' : 'Image'}',
|
'Save ${message.attachments[currentIndex].type == 'video' ? 'Video' : 'Image'}',
|
||||||
StreamSvgIcon.iconSave(
|
StreamSvgIcon.iconSave(
|
||||||
size: 24.0,
|
size: 24.0,
|
||||||
color: theme.colorTheme.grey,
|
color: theme.colorTheme.grey,
|
||||||
),
|
),
|
||||||
() {
|
() {
|
||||||
final attachment = attachments[currentIndex];
|
final attachment = message.attachments[currentIndex];
|
||||||
final isImage = attachment.type == 'image';
|
final isImage = attachment.type == 'image';
|
||||||
final saveFile = fileDownloader ?? _downloadAttachment;
|
final saveFile = fileDownloader ?? _downloadAttachment;
|
||||||
final saveImage = imageDownloader ?? _downloadAttachment;
|
final saveImage = imageDownloader ?? _downloadAttachment;
|
||||||
|
|||||||
@@ -71,12 +71,12 @@ class _ChannelFileDisplayScreenState extends State<ChannelFileDisplayScreen> {
|
|||||||
Navigator.of(context).pop();
|
Navigator.of(context).pop();
|
||||||
},
|
},
|
||||||
child: Container(
|
child: Container(
|
||||||
|
width: 24.0,
|
||||||
|
height: 24.0,
|
||||||
child: StreamSvgIcon.left(
|
child: StreamSvgIcon.left(
|
||||||
color: StreamChatTheme.of(context).colorTheme.black,
|
color: StreamChatTheme.of(context).colorTheme.black,
|
||||||
size: 24.0,
|
size: 24.0,
|
||||||
),
|
),
|
||||||
width: 24.0,
|
|
||||||
height: 24.0,
|
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
|
|||||||
@@ -223,8 +223,8 @@ class _ChannelListViewState extends State<ChannelListView> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
return AnimatedSwitcher(
|
return AnimatedSwitcher(
|
||||||
child: child,
|
|
||||||
duration: const Duration(milliseconds: 500),
|
duration: const Duration(milliseconds: 500),
|
||||||
|
child: child,
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -469,8 +469,8 @@ class _ChannelListViewState extends State<ChannelListView> {
|
|||||||
MaterialPageRoute(
|
MaterialPageRoute(
|
||||||
builder: (context) {
|
builder: (context) {
|
||||||
return StreamChannel(
|
return StreamChannel(
|
||||||
child: widget.channelWidget,
|
|
||||||
channel: client,
|
channel: client,
|
||||||
|
child: widget.channelWidget,
|
||||||
);
|
);
|
||||||
},
|
},
|
||||||
),
|
),
|
||||||
@@ -506,12 +506,12 @@ class _ChannelListViewState extends State<ChannelListView> {
|
|||||||
context: context,
|
context: context,
|
||||||
builder: (context) {
|
builder: (context) {
|
||||||
return StreamChannel(
|
return StreamChannel(
|
||||||
|
channel: channel,
|
||||||
child: ChannelBottomSheet(
|
child: ChannelBottomSheet(
|
||||||
onViewInfoTap: () {
|
onViewInfoTap: () {
|
||||||
widget.onViewInfoTap(channel);
|
widget.onViewInfoTap(channel);
|
||||||
},
|
},
|
||||||
),
|
),
|
||||||
channel: channel,
|
|
||||||
);
|
);
|
||||||
},
|
},
|
||||||
);
|
);
|
||||||
@@ -592,13 +592,13 @@ class _ChannelListViewState extends State<ChannelListView> {
|
|||||||
Padding(
|
Padding(
|
||||||
padding: const EdgeInsets.symmetric(horizontal: 8),
|
padding: const EdgeInsets.symmetric(horizontal: 8),
|
||||||
child: StreamChannel(
|
child: StreamChannel(
|
||||||
|
channel: channel,
|
||||||
child: ChannelName(
|
child: ChannelName(
|
||||||
textStyle: TextStyle(
|
textStyle: TextStyle(
|
||||||
fontSize: 12,
|
fontSize: 12,
|
||||||
fontWeight: FontWeight.w600,
|
fontWeight: FontWeight.w600,
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
channel: channel,
|
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
],
|
],
|
||||||
|
|||||||
@@ -78,12 +78,12 @@ class _ChannelMediaDisplayScreenState extends State<ChannelMediaDisplayScreen> {
|
|||||||
Navigator.of(context).pop();
|
Navigator.of(context).pop();
|
||||||
},
|
},
|
||||||
child: Container(
|
child: Container(
|
||||||
|
width: 24.0,
|
||||||
|
height: 24.0,
|
||||||
child: StreamSvgIcon.left(
|
child: StreamSvgIcon.left(
|
||||||
color: StreamChatTheme.of(context).colorTheme.black,
|
color: StreamChatTheme.of(context).colorTheme.black,
|
||||||
size: 24.0,
|
size: 24.0,
|
||||||
),
|
),
|
||||||
width: 24.0,
|
|
||||||
height: 24.0,
|
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
|
|||||||
@@ -237,13 +237,13 @@ class _ImageFooterState extends State<ImageFooter> {
|
|||||||
media = InkWell(
|
media = InkWell(
|
||||||
onTap: () => widget.mediaSelectedCallBack(index),
|
onTap: () => widget.mediaSelectedCallBack(index),
|
||||||
child: AspectRatio(
|
child: AspectRatio(
|
||||||
|
aspectRatio: 1.0,
|
||||||
child: CachedNetworkImage(
|
child: CachedNetworkImage(
|
||||||
imageUrl: attachment.imageUrl ??
|
imageUrl: attachment.imageUrl ??
|
||||||
attachment.assetUrl ??
|
attachment.assetUrl ??
|
||||||
attachment.thumbUrl,
|
attachment.thumbUrl,
|
||||||
fit: BoxFit.cover,
|
fit: BoxFit.cover,
|
||||||
),
|
),
|
||||||
aspectRatio: 1.0,
|
|
||||||
),
|
),
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -111,10 +111,7 @@ class ImageHeader extends StatelessWidget implements PreferredSizeWidget {
|
|||||||
return StreamChannel(
|
return StreamChannel(
|
||||||
channel: channel,
|
channel: channel,
|
||||||
child: AttachmentActionsModal(
|
child: AttachmentActionsModal(
|
||||||
userName: userName,
|
|
||||||
sentAt: sentAt,
|
|
||||||
message: message,
|
message: message,
|
||||||
attachments: urls,
|
|
||||||
currentIndex: currentIndex,
|
currentIndex: currentIndex,
|
||||||
onShowMessage: onShowMessage,
|
onShowMessage: onShowMessage,
|
||||||
),
|
),
|
||||||
|
|||||||
@@ -56,6 +56,11 @@ class _MediaListViewState extends State<MediaListView> {
|
|||||||
return Padding(
|
return Padding(
|
||||||
padding: const EdgeInsets.symmetric(horizontal: 1.0, vertical: 1.0),
|
padding: const EdgeInsets.symmetric(horizontal: 1.0, vertical: 1.0),
|
||||||
child: InkWell(
|
child: InkWell(
|
||||||
|
onTap: () {
|
||||||
|
if (widget.onSelect != null) {
|
||||||
|
widget.onSelect(media);
|
||||||
|
}
|
||||||
|
},
|
||||||
child: Stack(
|
child: Stack(
|
||||||
children: [
|
children: [
|
||||||
AspectRatio(
|
AspectRatio(
|
||||||
@@ -125,11 +130,6 @@ class _MediaListViewState extends State<MediaListView> {
|
|||||||
]
|
]
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
onTap: () {
|
|
||||||
if (widget.onSelect != null) {
|
|
||||||
widget.onSelect(media);
|
|
||||||
}
|
|
||||||
},
|
|
||||||
),
|
),
|
||||||
);
|
);
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -417,8 +417,8 @@ class MessageInputState extends State<MessageInput> {
|
|||||||
Widget _animateSendButton(BuildContext context) {
|
Widget _animateSendButton(BuildContext context) {
|
||||||
final sendButton = widget.activeSendButton != null
|
final sendButton = widget.activeSendButton != null
|
||||||
? InkWell(
|
? InkWell(
|
||||||
child: widget.activeSendButton,
|
|
||||||
onTap: sendMessage,
|
onTap: sendMessage,
|
||||||
|
child: widget.activeSendButton,
|
||||||
)
|
)
|
||||||
: _buildSendButton(context);
|
: _buildSendButton(context);
|
||||||
return Padding(
|
return Padding(
|
||||||
@@ -1083,81 +1083,81 @@ class MessageInputState extends State<MessageInput> {
|
|||||||
switch (iconType) {
|
switch (iconType) {
|
||||||
case 'giphy':
|
case 'giphy':
|
||||||
return CircleAvatar(
|
return CircleAvatar(
|
||||||
|
radius: 12,
|
||||||
child: StreamSvgIcon.giphyIcon(
|
child: StreamSvgIcon.giphyIcon(
|
||||||
size: 24.0,
|
size: 24.0,
|
||||||
),
|
),
|
||||||
radius: 12,
|
|
||||||
);
|
);
|
||||||
break;
|
break;
|
||||||
case 'ban':
|
case 'ban':
|
||||||
return CircleAvatar(
|
return CircleAvatar(
|
||||||
backgroundColor: StreamChatTheme.of(context).colorTheme.accentBlue,
|
backgroundColor: StreamChatTheme.of(context).colorTheme.accentBlue,
|
||||||
|
radius: 12,
|
||||||
child: StreamSvgIcon.iconUserDelete(
|
child: StreamSvgIcon.iconUserDelete(
|
||||||
size: 16.0,
|
size: 16.0,
|
||||||
color: Colors.white,
|
color: Colors.white,
|
||||||
),
|
),
|
||||||
radius: 12,
|
|
||||||
);
|
);
|
||||||
break;
|
break;
|
||||||
case 'flag':
|
case 'flag':
|
||||||
return CircleAvatar(
|
return CircleAvatar(
|
||||||
backgroundColor: StreamChatTheme.of(context).colorTheme.accentBlue,
|
backgroundColor: StreamChatTheme.of(context).colorTheme.accentBlue,
|
||||||
|
radius: 12,
|
||||||
child: StreamSvgIcon.flag(
|
child: StreamSvgIcon.flag(
|
||||||
size: 14.0,
|
size: 14.0,
|
||||||
color: Colors.white,
|
color: Colors.white,
|
||||||
),
|
),
|
||||||
radius: 12,
|
|
||||||
);
|
);
|
||||||
break;
|
break;
|
||||||
case 'imgur':
|
case 'imgur':
|
||||||
return CircleAvatar(
|
return CircleAvatar(
|
||||||
backgroundColor: StreamChatTheme.of(context).colorTheme.accentBlue,
|
backgroundColor: StreamChatTheme.of(context).colorTheme.accentBlue,
|
||||||
|
radius: 12,
|
||||||
child: ClipOval(
|
child: ClipOval(
|
||||||
child: StreamSvgIcon.imgur(
|
child: StreamSvgIcon.imgur(
|
||||||
size: 24.0,
|
size: 24.0,
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
radius: 12,
|
|
||||||
);
|
);
|
||||||
break;
|
break;
|
||||||
case 'mute':
|
case 'mute':
|
||||||
return CircleAvatar(
|
return CircleAvatar(
|
||||||
backgroundColor: StreamChatTheme.of(context).colorTheme.accentBlue,
|
backgroundColor: StreamChatTheme.of(context).colorTheme.accentBlue,
|
||||||
|
radius: 12,
|
||||||
child: StreamSvgIcon.mute(
|
child: StreamSvgIcon.mute(
|
||||||
size: 16.0,
|
size: 16.0,
|
||||||
color: Colors.white,
|
color: Colors.white,
|
||||||
),
|
),
|
||||||
radius: 12,
|
|
||||||
);
|
);
|
||||||
break;
|
break;
|
||||||
case 'unban':
|
case 'unban':
|
||||||
return CircleAvatar(
|
return CircleAvatar(
|
||||||
backgroundColor: StreamChatTheme.of(context).colorTheme.accentBlue,
|
backgroundColor: StreamChatTheme.of(context).colorTheme.accentBlue,
|
||||||
|
radius: 12,
|
||||||
child: StreamSvgIcon.userAdd(
|
child: StreamSvgIcon.userAdd(
|
||||||
size: 16.0,
|
size: 16.0,
|
||||||
color: Colors.white,
|
color: Colors.white,
|
||||||
),
|
),
|
||||||
radius: 12,
|
|
||||||
);
|
);
|
||||||
break;
|
break;
|
||||||
case 'unmute':
|
case 'unmute':
|
||||||
return CircleAvatar(
|
return CircleAvatar(
|
||||||
backgroundColor: StreamChatTheme.of(context).colorTheme.accentBlue,
|
backgroundColor: StreamChatTheme.of(context).colorTheme.accentBlue,
|
||||||
|
radius: 12,
|
||||||
child: StreamSvgIcon.volumeUp(
|
child: StreamSvgIcon.volumeUp(
|
||||||
size: 16.0,
|
size: 16.0,
|
||||||
color: Colors.white,
|
color: Colors.white,
|
||||||
),
|
),
|
||||||
radius: 12,
|
|
||||||
);
|
);
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
return CircleAvatar(
|
return CircleAvatar(
|
||||||
backgroundColor: StreamChatTheme.of(context).colorTheme.accentBlue,
|
backgroundColor: StreamChatTheme.of(context).colorTheme.accentBlue,
|
||||||
|
radius: 12,
|
||||||
child: StreamSvgIcon.lightning(
|
child: StreamSvgIcon.lightning(
|
||||||
size: 16.0,
|
size: 16.0,
|
||||||
color: Colors.white,
|
color: Colors.white,
|
||||||
),
|
),
|
||||||
radius: 12,
|
|
||||||
);
|
);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@@ -1677,8 +1677,8 @@ class MessageInputState extends State<MessageInput> {
|
|||||||
);
|
);
|
||||||
default:
|
default:
|
||||||
return Container(
|
return Container(
|
||||||
child: Icon(Icons.insert_drive_file),
|
|
||||||
color: Colors.black26,
|
color: Colors.black26,
|
||||||
|
child: Icon(Icons.insert_drive_file),
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -2147,6 +2147,9 @@ class MessageInputState extends State<MessageInput> {
|
|||||||
mainAxisAlignment: MainAxisAlignment.center,
|
mainAxisAlignment: MainAxisAlignment.center,
|
||||||
children: [
|
children: [
|
||||||
TextButton(
|
TextButton(
|
||||||
|
onPressed: () {
|
||||||
|
Navigator.of(context).pop();
|
||||||
|
},
|
||||||
child: Text(
|
child: Text(
|
||||||
'OK',
|
'OK',
|
||||||
style: StreamChatTheme.of(context)
|
style: StreamChatTheme.of(context)
|
||||||
@@ -2157,9 +2160,6 @@ class MessageInputState extends State<MessageInput> {
|
|||||||
.colorTheme
|
.colorTheme
|
||||||
.accentBlue),
|
.accentBlue),
|
||||||
),
|
),
|
||||||
onPressed: () {
|
|
||||||
Navigator.of(context).pop();
|
|
||||||
},
|
|
||||||
),
|
),
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
@@ -2298,6 +2298,7 @@ class __PickerWidgetState extends State<_PickerWidget> {
|
|||||||
child: Container(
|
child: Container(
|
||||||
constraints: BoxConstraints.expand(),
|
constraints: BoxConstraints.expand(),
|
||||||
color: StreamChatTheme.of(context).colorTheme.whiteSmoke,
|
color: StreamChatTheme.of(context).colorTheme.whiteSmoke,
|
||||||
|
alignment: Alignment.center,
|
||||||
child: Text(
|
child: Text(
|
||||||
'Add more files',
|
'Add more files',
|
||||||
style: TextStyle(
|
style: TextStyle(
|
||||||
@@ -2305,7 +2306,6 @@ class __PickerWidgetState extends State<_PickerWidget> {
|
|||||||
fontWeight: FontWeight.bold,
|
fontWeight: FontWeight.bold,
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
alignment: Alignment.center,
|
|
||||||
),
|
),
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -624,9 +624,6 @@ class _MessageListViewState extends State<MessageListView> {
|
|||||||
children: [
|
children: [
|
||||||
FloatingActionButton(
|
FloatingActionButton(
|
||||||
backgroundColor: StreamChatTheme.of(context).colorTheme.white,
|
backgroundColor: StreamChatTheme.of(context).colorTheme.white,
|
||||||
child: StreamSvgIcon.down(
|
|
||||||
color: StreamChatTheme.of(context).colorTheme.black,
|
|
||||||
),
|
|
||||||
onPressed: () {
|
onPressed: () {
|
||||||
if (unreadCount > 0) {
|
if (unreadCount > 0) {
|
||||||
streamChannel.channel.markRead();
|
streamChannel.channel.markRead();
|
||||||
@@ -644,6 +641,9 @@ class _MessageListViewState extends State<MessageListView> {
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
child: StreamSvgIcon.down(
|
||||||
|
color: StreamChatTheme.of(context).colorTheme.black,
|
||||||
|
),
|
||||||
),
|
),
|
||||||
if (showUnreadCount)
|
if (showUnreadCount)
|
||||||
Positioned(
|
Positioned(
|
||||||
@@ -1045,10 +1045,6 @@ class _MessageListViewState extends State<MessageListView> {
|
|||||||
end: colorTheme.white.withOpacity(0),
|
end: colorTheme.white.withOpacity(0),
|
||||||
),
|
),
|
||||||
duration: const Duration(seconds: 3),
|
duration: const Duration(seconds: 3),
|
||||||
child: Padding(
|
|
||||||
padding: const EdgeInsets.only(top: 4.0),
|
|
||||||
child: child,
|
|
||||||
),
|
|
||||||
onEnd: () => initialMessageHighlightComplete = true,
|
onEnd: () => initialMessageHighlightComplete = true,
|
||||||
builder: (_, color, child) {
|
builder: (_, color, child) {
|
||||||
return Container(
|
return Container(
|
||||||
@@ -1056,6 +1052,10 @@ class _MessageListViewState extends State<MessageListView> {
|
|||||||
child: child,
|
child: child,
|
||||||
);
|
);
|
||||||
},
|
},
|
||||||
|
child: Padding(
|
||||||
|
padding: const EdgeInsets.only(top: 4.0),
|
||||||
|
child: child,
|
||||||
|
),
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
return child;
|
return child;
|
||||||
|
|||||||
@@ -238,6 +238,9 @@ class MessageReactionsModal extends StatelessWidget {
|
|||||||
borderRadius: BorderRadius.circular(32),
|
borderRadius: BorderRadius.circular(32),
|
||||||
),
|
),
|
||||||
Positioned(
|
Positioned(
|
||||||
|
bottom: 6,
|
||||||
|
left: isCurrentUser ? -3 : null,
|
||||||
|
right: isCurrentUser ? -3 : null,
|
||||||
child: Align(
|
child: Align(
|
||||||
alignment:
|
alignment:
|
||||||
reverse ? Alignment.centerRight : Alignment.centerLeft,
|
reverse ? Alignment.centerRight : Alignment.centerLeft,
|
||||||
@@ -251,9 +254,6 @@ class MessageReactionsModal extends StatelessWidget {
|
|||||||
highlightOwnReactions: false,
|
highlightOwnReactions: false,
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
bottom: 6,
|
|
||||||
left: isCurrentUser ? -3 : null,
|
|
||||||
right: isCurrentUser ? -3 : null,
|
|
||||||
),
|
),
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
|
|||||||
@@ -377,9 +377,9 @@ class _MessageWidgetState extends State<MessageWidget>
|
|||||||
portal: Container(
|
portal: Container(
|
||||||
transform:
|
transform:
|
||||||
Matrix4.translationValues(-12, 0, 0),
|
Matrix4.translationValues(-12, 0, 0),
|
||||||
child: _buildReactionIndicator(context),
|
|
||||||
constraints:
|
constraints:
|
||||||
BoxConstraints(maxWidth: 22 * 6.0),
|
BoxConstraints(maxWidth: 22 * 6.0),
|
||||||
|
child: _buildReactionIndicator(context),
|
||||||
),
|
),
|
||||||
portalAnchor: Alignment(-1.0, -1.0),
|
portalAnchor: Alignment(-1.0, -1.0),
|
||||||
childAnchor: Alignment(1, -1.0),
|
childAnchor: Alignment(1, -1.0),
|
||||||
|
|||||||
@@ -94,6 +94,19 @@ class _ReactionPickerState extends State<ReactionPicker>
|
|||||||
height: 24,
|
height: 24,
|
||||||
width: 24,
|
width: 24,
|
||||||
),
|
),
|
||||||
|
onPressed: () {
|
||||||
|
if (ownReactionIndex != -1) {
|
||||||
|
removeReaction(
|
||||||
|
context,
|
||||||
|
widget.message.ownReactions[ownReactionIndex],
|
||||||
|
);
|
||||||
|
} else {
|
||||||
|
sendReaction(
|
||||||
|
context,
|
||||||
|
reactionIcon.type,
|
||||||
|
);
|
||||||
|
}
|
||||||
|
},
|
||||||
child: AnimatedBuilder(
|
child: AnimatedBuilder(
|
||||||
animation: animations[index],
|
animation: animations[index],
|
||||||
builder: (context, val) {
|
builder: (context, val) {
|
||||||
@@ -121,19 +134,6 @@ class _ReactionPickerState extends State<ReactionPicker>
|
|||||||
),
|
),
|
||||||
);
|
);
|
||||||
}),
|
}),
|
||||||
onPressed: () {
|
|
||||||
if (ownReactionIndex != -1) {
|
|
||||||
removeReaction(
|
|
||||||
context,
|
|
||||||
widget.message.ownReactions[ownReactionIndex],
|
|
||||||
);
|
|
||||||
} else {
|
|
||||||
sendReaction(
|
|
||||||
context,
|
|
||||||
reactionIcon.type,
|
|
||||||
);
|
|
||||||
}
|
|
||||||
},
|
|
||||||
),
|
),
|
||||||
);
|
);
|
||||||
})
|
})
|
||||||
|
|||||||
@@ -92,9 +92,9 @@ class StreamChatState extends State<StreamChat> {
|
|||||||
),
|
),
|
||||||
child: StreamChatCore(
|
child: StreamChatCore(
|
||||||
client: client,
|
client: client,
|
||||||
child: widget.child,
|
|
||||||
onBackgroundEventReceived: widget.onBackgroundEventReceived,
|
onBackgroundEventReceived: widget.onBackgroundEventReceived,
|
||||||
backgroundKeepAlive: widget.backgroundKeepAlive,
|
backgroundKeepAlive: widget.backgroundKeepAlive,
|
||||||
|
child: widget.child,
|
||||||
),
|
),
|
||||||
);
|
);
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -13,7 +13,6 @@ class StreamNeumorphicButton extends StatelessWidget {
|
|||||||
@override
|
@override
|
||||||
Widget build(BuildContext context) {
|
Widget build(BuildContext context) {
|
||||||
return Container(
|
return Container(
|
||||||
child: child,
|
|
||||||
margin: EdgeInsets.all(8.0),
|
margin: EdgeInsets.all(8.0),
|
||||||
height: 40,
|
height: 40,
|
||||||
width: 40,
|
width: 40,
|
||||||
@@ -35,6 +34,7 @@ class StreamNeumorphicButton extends StatelessWidget {
|
|||||||
),
|
),
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
|
child: child,
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -28,6 +28,9 @@ class UrlAttachment extends StatelessWidget {
|
|||||||
Container(
|
Container(
|
||||||
clipBehavior: Clip.antiAliasWithSaveLayer,
|
clipBehavior: Clip.antiAliasWithSaveLayer,
|
||||||
margin: EdgeInsets.symmetric(horizontal: 8.0),
|
margin: EdgeInsets.symmetric(horizontal: 8.0),
|
||||||
|
decoration: BoxDecoration(
|
||||||
|
borderRadius: BorderRadius.circular(8.0),
|
||||||
|
),
|
||||||
child: Stack(
|
child: Stack(
|
||||||
children: [
|
children: [
|
||||||
CachedNetworkImage(
|
CachedNetworkImage(
|
||||||
@@ -39,6 +42,12 @@ class UrlAttachment extends StatelessWidget {
|
|||||||
left: 0.0,
|
left: 0.0,
|
||||||
bottom: -1,
|
bottom: -1,
|
||||||
child: Container(
|
child: Container(
|
||||||
|
decoration: BoxDecoration(
|
||||||
|
borderRadius: BorderRadius.only(
|
||||||
|
topRight: Radius.circular(16.0),
|
||||||
|
),
|
||||||
|
color: StreamChatTheme.of(context).colorTheme.blueAlice,
|
||||||
|
),
|
||||||
child: Padding(
|
child: Padding(
|
||||||
padding: const EdgeInsets.only(
|
padding: const EdgeInsets.only(
|
||||||
top: 8.0,
|
top: 8.0,
|
||||||
@@ -57,19 +66,10 @@ class UrlAttachment extends StatelessWidget {
|
|||||||
),
|
),
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
decoration: BoxDecoration(
|
|
||||||
borderRadius: BorderRadius.only(
|
|
||||||
topRight: Radius.circular(16.0),
|
|
||||||
),
|
|
||||||
color: StreamChatTheme.of(context).colorTheme.blueAlice,
|
|
||||||
),
|
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
decoration: BoxDecoration(
|
|
||||||
borderRadius: BorderRadius.circular(8.0),
|
|
||||||
),
|
|
||||||
),
|
),
|
||||||
Padding(
|
Padding(
|
||||||
padding: textPadding,
|
padding: textPadding,
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
name: stream_chat_flutter
|
name: stream_chat_flutter
|
||||||
homepage: https://github.com/GetStream/stream-chat-flutter
|
homepage: https://github.com/GetStream/stream-chat-flutter
|
||||||
description: Stream Chat official Flutter SDK. Build your own chat experience using Dart and Flutter.
|
description: Stream Chat official Flutter SDK. Build your own chat experience using Dart and Flutter.
|
||||||
version: 1.3.2-beta
|
version: 1.4.0-beta
|
||||||
repository: https://github.com/GetStream/stream-chat-flutter
|
repository: https://github.com/GetStream/stream-chat-flutter
|
||||||
issue_tracker: https://github.com/GetStream/stream-chat-flutter/issues
|
issue_tracker: https://github.com/GetStream/stream-chat-flutter/issues
|
||||||
|
|
||||||
|
|||||||
@@ -1,3 +1,8 @@
|
|||||||
|
## 1.4.0-beta
|
||||||
|
|
||||||
|
* Added `MessageListCore.messageFilter` to filter messages locally
|
||||||
|
* Minor fixes and improvements
|
||||||
|
|
||||||
## 1.3.2-beta
|
## 1.3.2-beta
|
||||||
|
|
||||||
* Update llc dependency
|
* Update llc dependency
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
name: stream_chat_flutter_core
|
name: stream_chat_flutter_core
|
||||||
homepage: https://github.com/GetStream/stream-chat-flutter
|
homepage: https://github.com/GetStream/stream-chat-flutter
|
||||||
description: Stream Chat official Flutter SDK Core. Build your own chat experience using Dart and Flutter.
|
description: Stream Chat official Flutter SDK Core. Build your own chat experience using Dart and Flutter.
|
||||||
version: 1.3.2-beta
|
version: 1.4.0-beta
|
||||||
repository: https://github.com/GetStream/stream-chat-flutter
|
repository: https://github.com/GetStream/stream-chat-flutter
|
||||||
issue_tracker: https://github.com/GetStream/stream-chat-flutter/issues
|
issue_tracker: https://github.com/GetStream/stream-chat-flutter/issues
|
||||||
|
|
||||||
|
|||||||
@@ -1,3 +1,7 @@
|
|||||||
|
## 1.4.0-beta
|
||||||
|
|
||||||
|
* Update llc dependency
|
||||||
|
|
||||||
## 1.3.0-beta
|
## 1.3.0-beta
|
||||||
|
|
||||||
* Update llc dependency
|
* Update llc dependency
|
||||||
|
|||||||
@@ -11,7 +11,7 @@ dependencies:
|
|||||||
flutter:
|
flutter:
|
||||||
sdk: flutter
|
sdk: flutter
|
||||||
cupertino_icons: ^1.0.0
|
cupertino_icons: ^1.0.0
|
||||||
stream_chat: ^1.3.0
|
stream_chat: ^1.4.0
|
||||||
stream_chat_persistence:
|
stream_chat_persistence:
|
||||||
path: ../
|
path: ../
|
||||||
|
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
name: stream_chat_persistence
|
name: stream_chat_persistence
|
||||||
homepage: https://github.com/GetStream/stream-chat-flutter
|
homepage: https://github.com/GetStream/stream-chat-flutter
|
||||||
description: Official Stream Chat Persistence library. Build your own chat experience using Dart and Flutter.
|
description: Official Stream Chat Persistence library. Build your own chat experience using Dart and Flutter.
|
||||||
version: 1.3.0-beta
|
version: 1.4.0-beta
|
||||||
repository: https://github.com/GetStream/stream-chat-flutter
|
repository: https://github.com/GetStream/stream-chat-flutter
|
||||||
issue_tracker: https://github.com/GetStream/stream-chat-flutter/issues
|
issue_tracker: https://github.com/GetStream/stream-chat-flutter/issues
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user