diff --git a/packages/stream_chat_flutter/CHANGELOG.md b/packages/stream_chat_flutter/CHANGELOG.md index 23950e3d..1d0d0bde 100644 --- a/packages/stream_chat_flutter/CHANGELOG.md +++ b/packages/stream_chat_flutter/CHANGELOG.md @@ -3,6 +3,7 @@ 🐞 Fixed - [[#1247]](https://github.com/GetStream/stream-chat-flutter/issues/1247) Fix Jiffy initialization. +- [[#1232]](https://github.com/getstream/stream-chat-flutter/issues/1232) Fix DateDivider not showing up in the chat. ## 4.4.0 diff --git a/packages/stream_chat_flutter/lib/src/message_list_view.dart b/packages/stream_chat_flutter/lib/src/message_list_view.dart index 31853b90..af54d5ee 100644 --- a/packages/stream_chat_flutter/lib/src/message_list_view.dart +++ b/packages/stream_chat_flutter/lib/src/message_list_view.dart @@ -206,7 +206,7 @@ class StreamMessageListView extends StatefulWidget { this.paginationLimit = 20, this.paginationLoadingIndicatorBuilder, this.keyboardDismissBehavior = ScrollViewKeyboardDismissBehavior.onDrag, - this.spacingWidgetBuilder, + this.spacingWidgetBuilder = _defaultSpacingWidgetBuilder, }); /// [ScrollViewKeyboardDismissBehavior] the defines how this [PositionedList] will @@ -353,7 +353,17 @@ class StreamMessageListView extends StatefulWidget { /// A List of [SpacingType] is provided to provide more data about the /// type of message (thread, difference in time between current and last /// message, default spacing, etc) - final SpacingWidgetBuilder? spacingWidgetBuilder; + final SpacingWidgetBuilder spacingWidgetBuilder; + + static Widget _defaultSpacingWidgetBuilder( + BuildContext context, + List spacingTypes, + ) { + if (!spacingTypes.contains(SpacingType.defaultSpacing)) { + return const SizedBox(height: 8); + } + return const SizedBox(height: 2); + } @override _StreamMessageListViewState createState() => _StreamMessageListViewState(); @@ -612,7 +622,6 @@ class _StreamMessageListViewState extends State { } late final Message message, nextMessage; - late Widget separator; if (widget.reverse) { message = messages[i - 1]; nextMessage = messages[i - 2]; @@ -621,84 +630,53 @@ class _StreamMessageListViewState extends State { nextMessage = messages[i - 1]; } + Widget separator; + + final isThread = message.replyCount! > 0; + if (!Jiffy(message.createdAt.toLocal()).isSame( nextMessage.createdAt.toLocal(), Units.DAY, )) { separator = _buildDateDivider(nextMessage); + } else { + final timeDiff = + Jiffy(nextMessage.createdAt.toLocal()).diff( + message.createdAt.toLocal(), + Units.MINUTE, + ); + + final isNextUserSame = + message.user!.id == nextMessage.user?.id; + final isDeleted = message.isDeleted; + final hasTimeDiff = timeDiff >= 1; + + final spacingRules = [ + if (hasTimeDiff) SpacingType.timeDiff, + if (!isNextUserSame) SpacingType.otherUser, + if (isThread) SpacingType.thread, + if (isDeleted) SpacingType.deleted, + ]; + + if (spacingRules.isEmpty) { + spacingRules.add(SpacingType.defaultSpacing); + } + + separator = widget.spacingWidgetBuilder.call( + context, + spacingRules, + ); } - final timeDiff = - Jiffy(nextMessage.createdAt.toLocal()).diff( - message.createdAt.toLocal(), - Units.MINUTE, - ); - - final spacingRules = []; - - final isNextUserSame = - message.user!.id == nextMessage.user?.id; - final isThread = message.replyCount! > 0; - final isDeleted = message.isDeleted; - final hasTimeDiff = timeDiff >= 1; - - if (hasTimeDiff) { - spacingRules.add(SpacingType.timeDiff); - } - - if (!isNextUserSame) { - spacingRules.add(SpacingType.otherUser); - } - - if (isThread) { - spacingRules.add(SpacingType.thread); - } - - if (isDeleted) { - spacingRules.add(SpacingType.deleted); - } - - if (spacingRules.isNotEmpty) { - separator = widget.spacingWidgetBuilder - ?.call(context, spacingRules) ?? - const SizedBox(height: 8); - } - separator = widget.spacingWidgetBuilder - ?.call(context, [SpacingType.defaultSpacing]) ?? - const SizedBox(height: 2); if (!isThread && unreadCount > 0 && unreadCount == i - 1) { - final unreadMessagesSeparator = widget - .unreadMessagesSeparatorBuilder - ?.call(context, unreadCount); + final unreadMessagesSeparator = + _buildUnreadMessagesSeparator(unreadCount); return Column( crossAxisAlignment: CrossAxisAlignment.stretch, children: [ separator, - unreadMessagesSeparator ?? - Padding( - padding: - const EdgeInsets.symmetric(vertical: 8), - child: DecoratedBox( - decoration: BoxDecoration( - gradient: - _streamTheme.colorTheme.bgGradient, - ), - child: Padding( - padding: const EdgeInsets.all(8), - child: Text( - context.translations - .unreadMessagesSeparatorText( - unreadCount, - ), - textAlign: TextAlign.center, - style: - StreamChannelHeaderTheme.of(context) - .subtitleStyle, - ), - ), - ), - ), + unreadMessagesSeparator, ], ); } @@ -816,6 +794,30 @@ class _StreamMessageListViewState extends State { return child; } + Widget _buildUnreadMessagesSeparator(int unreadCount) { + final unreadMessagesSeparator = + widget.unreadMessagesSeparatorBuilder?.call(context, unreadCount) ?? + Padding( + padding: const EdgeInsets.symmetric(vertical: 8), + child: DecoratedBox( + decoration: BoxDecoration( + gradient: _streamTheme.colorTheme.bgGradient, + ), + child: Padding( + padding: const EdgeInsets.all(8), + child: Text( + context.translations.unreadMessagesSeparatorText( + unreadCount, + ), + textAlign: TextAlign.center, + style: StreamChannelHeaderTheme.of(context).subtitleStyle, + ), + ), + ), + ); + return unreadMessagesSeparator; + } + Widget _buildDateDivider(Message message) { final divider = widget.dateDividerBuilder != null ? widget.dateDividerBuilder!(