Merge pull request #1461 from GetStream/ISSUE-1456/SendingMessageIndicatorFix

This commit is contained in:
Sahil Kumar
2023-04-20 15:04:18 +05:30
committed by GitHub
5 changed files with 44 additions and 27 deletions
@@ -2,6 +2,7 @@
🐞 Fixed 🐞 Fixed
- [#1456](https://github.com/GetStream/stream-chat-flutter/issues/1456) Fixed logic for showing that a message was read using sending indicator.
- [#1462](https://github.com/GetStream/stream-chat-flutter/issues/1462) Fixed support for iPad in the share button for images. - [#1462](https://github.com/GetStream/stream-chat-flutter/issues/1462) Fixed support for iPad in the share button for images.
- [#1475](https://github.com/GetStream/stream-chat-flutter/issues/1475) Fixed typo to fix compilation. - [#1475](https://github.com/GetStream/stream-chat-flutter/issues/1475) Fixed typo to fix compilation.
@@ -6,6 +6,7 @@ import 'package:contextmenu/contextmenu.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:stream_chat_flutter/src/context_menu_items/stream_chat_context_menu_item.dart'; import 'package:stream_chat_flutter/src/context_menu_items/stream_chat_context_menu_item.dart';
import 'package:stream_chat_flutter/src/dialogs/dialogs.dart'; import 'package:stream_chat_flutter/src/dialogs/dialogs.dart';
import 'package:stream_chat_flutter/src/message_widget/sending_indicator_builder.dart';
import 'package:stream_chat_flutter/stream_chat_flutter.dart'; import 'package:stream_chat_flutter/stream_chat_flutter.dart';
/// {@template channelPreview} /// {@template channelPreview}
@@ -76,6 +77,7 @@ class ChannelPreview extends StatelessWidget {
Widget build(BuildContext context) { Widget build(BuildContext context) {
final channelPreviewTheme = StreamChannelPreviewTheme.of(context); final channelPreviewTheme = StreamChannelPreviewTheme.of(context);
final streamChatState = StreamChat.of(context); final streamChatState = StreamChat.of(context);
final streamChatTheme = StreamChatTheme.of(context);
return BetterStreamBuilder<bool>( return BetterStreamBuilder<bool>(
stream: channel.isMutedStream, stream: channel.isMutedStream,
initialData: channel.isMuted, initialData: channel.isMuted,
@@ -292,20 +294,20 @@ class ChannelPreview extends StatelessWidget {
stream: channel.state?.readStream, stream: channel.state?.readStream,
initialData: channel.state?.read, initialData: channel.state?.read,
builder: (context, data) { builder: (context, data) {
final readList = data.where((it) => final hasNonUrlAttachments = lastMessage!
it.user.id != .attachments
channel.client.state.currentUser?.id && .where((it) =>
(it.lastRead it.titleLink == null ||
.isAfter(lastMessage!.createdAt) || it.type == 'giphy')
it.lastRead.isAtSameMomentAs( .isNotEmpty;
lastMessage.createdAt,
))); return SendingIndicatorBuilder(
final isMessageRead = readList.length >= messageTheme: streamChatTheme.ownMessageTheme,
(channel.memberCount ?? 0) - 1; message: lastMessage,
return StreamSendingIndicator( hasNonUrlAttachments: hasNonUrlAttachments,
message: lastMessage!, streamChat: streamChatState,
size: channelPreviewTheme.indicatorIconSize, streamChatTheme: streamChatTheme,
isMessageRead: isMessageRead, channel: channel,
); );
}, },
), ),
@@ -1,5 +1,5 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:stream_chat_flutter/src/message_widget/sending_indicator_wrapper.dart'; import 'package:stream_chat_flutter/src/message_widget/sending_indicator_builder.dart';
import 'package:stream_chat_flutter/src/message_widget/thread_painter.dart'; import 'package:stream_chat_flutter/src/message_widget/thread_painter.dart';
import 'package:stream_chat_flutter/src/message_widget/thread_participants.dart'; import 'package:stream_chat_flutter/src/message_widget/thread_participants.dart';
import 'package:stream_chat_flutter/src/message_widget/username.dart'; import 'package:stream_chat_flutter/src/message_widget/username.dart';
@@ -204,7 +204,7 @@ class BottomRow extends StatelessWidget {
if (showSendingIndicator) if (showSendingIndicator)
WidgetSpan( WidgetSpan(
child: sendingIndicatorBuilder?.call(context, message) ?? child: sendingIndicatorBuilder?.call(context, message) ??
SendingIndicatorWrapper( SendingIndicatorBuilder(
messageTheme: messageTheme, messageTheme: messageTheme,
message: message, message: message,
hasNonUrlAttachments: hasNonUrlAttachments, hasNonUrlAttachments: hasNonUrlAttachments,
@@ -6,15 +6,16 @@ import 'package:stream_chat_flutter/stream_chat_flutter.dart';
/// ///
/// Used in [BottomRow]. Should not be used elsewhere. /// Used in [BottomRow]. Should not be used elsewhere.
/// {@endtemplate} /// {@endtemplate}
class SendingIndicatorWrapper extends StatelessWidget { class SendingIndicatorBuilder extends StatelessWidget {
/// {@macro sendingIndicatorWrapper} /// {@macro sendingIndicatorWrapper}
const SendingIndicatorWrapper({ const SendingIndicatorBuilder({
super.key, super.key,
required this.messageTheme, required this.messageTheme,
required this.message, required this.message,
required this.hasNonUrlAttachments, required this.hasNonUrlAttachments,
required this.streamChat, required this.streamChat,
required this.streamChatTheme, required this.streamChatTheme,
this.channel,
}); });
/// {@macro messageTheme} /// {@macro messageTheme}
@@ -32,10 +33,14 @@ class SendingIndicatorWrapper extends StatelessWidget {
/// {@macro streamChatThemeData} /// {@macro streamChatThemeData}
final StreamChatThemeData streamChatTheme; final StreamChatThemeData streamChatTheme;
/// {@macro channel}
final Channel? channel;
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
final style = messageTheme.createdAtStyle; final style = messageTheme.createdAtStyle;
final memberCount = StreamChannel.of(context).channel.memberCount ?? 0; final channel = this.channel ?? StreamChannel.of(context).channel;
final memberCount = channel.memberCount ?? 0;
if (hasNonUrlAttachments && if (hasNonUrlAttachments &&
(message.status == MessageSendingStatus.sending || (message.status == MessageSendingStatus.sending ||
@@ -58,8 +63,6 @@ class SendingIndicatorWrapper extends StatelessWidget {
); );
} }
final channel = StreamChannel.of(context).channel;
return BetterStreamBuilder<List<Read>>( return BetterStreamBuilder<List<Read>>(
stream: channel.state?.readStream, stream: channel.state?.readStream,
initialData: channel.state?.read, initialData: channel.state?.read,
@@ -68,12 +71,14 @@ class SendingIndicatorWrapper extends StatelessWidget {
it.user.id != streamChat.currentUser?.id && it.user.id != streamChat.currentUser?.id &&
(it.lastRead.isAfter(message.createdAt) || (it.lastRead.isAfter(message.createdAt) ||
it.lastRead.isAtSameMomentAs(message.createdAt))); it.lastRead.isAtSameMomentAs(message.createdAt)));
final isMessageRead = readList.length >= (channel.memberCount ?? 0) - 1;
final isMessageRead = readList.isNotEmpty;
Widget child = StreamSendingIndicator( Widget child = StreamSendingIndicator(
message: message, message: message,
isMessageRead: isMessageRead, isMessageRead: isMessageRead,
size: style!.fontSize, size: style!.fontSize,
); );
if (isMessageRead) { if (isMessageRead) {
child = Row( child = Row(
mainAxisSize: MainAxisSize.min, mainAxisSize: MainAxisSize.min,
@@ -90,6 +95,7 @@ class SendingIndicatorWrapper extends StatelessWidget {
], ],
); );
} }
return child; return child;
}, },
); );
@@ -1,5 +1,6 @@
import 'package:collection/collection.dart'; import 'package:collection/collection.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:stream_chat_flutter/src/message_widget/sending_indicator_builder.dart';
import 'package:stream_chat_flutter/stream_chat_flutter.dart'; import 'package:stream_chat_flutter/stream_chat_flutter.dart';
/// A widget that displays a channel preview. /// A widget that displays a channel preview.
@@ -145,6 +146,8 @@ class StreamChannelListTile extends StatelessWidget {
final currentUser = channel.client.state.currentUser!; final currentUser = channel.client.state.currentUser!;
final channelPreviewTheme = StreamChannelPreviewTheme.of(context); final channelPreviewTheme = StreamChannelPreviewTheme.of(context);
final streamChatTheme = StreamChatTheme.of(context);
final streamChat = StreamChat.of(context);
final leading = this.leading ?? final leading = this.leading ??
StreamChannelAvatar( StreamChannelAvatar(
@@ -225,16 +228,21 @@ class StreamChannelListTile extends StatelessWidget {
return const Offstage(); return const Offstage();
} }
final hasNonUrlAttachments = lastMessage.attachments
.where((it) => it.titleLink == null || it.type == 'giphy')
.isNotEmpty;
return Padding( return Padding(
padding: const EdgeInsets.only(right: 4), padding: const EdgeInsets.only(right: 4),
child: child:
sendingIndicatorBuilder?.call(context, lastMessage) ?? sendingIndicatorBuilder?.call(context, lastMessage) ??
StreamSendingIndicator( SendingIndicatorBuilder(
messageTheme: streamChatTheme.ownMessageTheme,
message: lastMessage, message: lastMessage,
size: channelPreviewTheme.indicatorIconSize, hasNonUrlAttachments: hasNonUrlAttachments,
isMessageRead: channelState streamChat: streamChat,
.currentUserRead!.lastRead streamChatTheme: streamChatTheme,
.isAfter(lastMessage.createdAt), channel: channel,
), ),
); );
}, },