From 9884c0452df8beb9cd1e4cbec8ff02ead20da94a Mon Sep 17 00:00:00 2001 From: Deven Joshi Date: Mon, 15 Nov 2021 18:47:32 +0530 Subject: [PATCH 1/6] added spacing types --- .../lib/src/message_list_view.dart | 78 +++++++++++++++++-- 1 file changed, 72 insertions(+), 6 deletions(-) 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 5424a1c2..8d4409bc 100644 --- a/packages/stream_chat_flutter/lib/src/message_list_view.dart +++ b/packages/stream_chat_flutter/lib/src/message_list_view.dart @@ -58,6 +58,44 @@ typedef OnMessageTap = void Function(Message); /// Callback on reply tapped typedef ReplyTapCallback = void Function(Message); +/// Spacing Types (These are properties of a message to help inform the decision +/// of how much space / which widget to build after it) +enum SpacingType { + /// Message is a thread + thread, + + /// There is a >1s time diff between current and last message + timeDiff, + + /// Next message is by a different user + otherUser, + + /// Message is deleted + deleted, + + /// No other conditions are valid, default spacing (This will likely be the + /// only rule in the list provided) + defaultSpacing, +} + +/// Builder for building certain spacing after widgets. +/// This spacing can be in form of any widgets you like. +/// A List of [SpacingType] is provided to help inform the decision of +/// what to build after the message. +/// +/// As an example: +/// MessageListView( +/// spacingWidgetBuilder: (context, list) { +/// if(list.contains(SpacingType.defaultSpacing)) { +/// return SizedBox(height: 2.0,); +/// } else { +/// return SizedBox(height: 8.0,); +/// } +/// }, +/// ), +typedef SpacingWidgetBuilder = Widget Function( + BuildContext context, List spacingTypes); + /// Class for message details // ignore: prefer-match-file-name class MessageDetails { @@ -171,6 +209,7 @@ class MessageListView extends StatefulWidget { this.reverse = true, this.paginationLimit = 20, this.paginationLoadingIndicatorBuilder, + this.spacingWidgetBuilder, }) : super(key: key); /// Function used to build a custom message widget @@ -289,6 +328,12 @@ class MessageListView extends StatefulWidget { /// Builder used to build the loading indicator shown while paginating. final WidgetBuilder? paginationLoadingIndicatorBuilder; + /// This allows a user to customise the space after a message + /// 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; + @override _MessageListViewState createState() => _MessageListViewState(); } @@ -564,17 +609,38 @@ class _MessageListViewState extends State { Units.MINUTE, ); + final spacingRules = []; + final isNextUserSame = message.user!.id == nextMessage.user?.id; final isThread = message.replyCount! > 0; final isDeleted = message.isDeleted; - if (timeDiff >= 1 || - !isNextUserSame || - isThread || - isDeleted) { - return const SizedBox(height: 8); + final hasTimeDiff = timeDiff >= 1; + + if (hasTimeDiff) { + spacingRules.add(SpacingType.timeDiff); } - return const SizedBox(height: 2); + + if (!isNextUserSame) { + spacingRules.add(SpacingType.otherUser); + } + + if (isThread) { + spacingRules.add(SpacingType.thread); + } + + if (isDeleted) { + spacingRules.add(SpacingType.deleted); + } + + if (spacingRules.isNotEmpty) { + return widget.spacingWidgetBuilder + ?.call(context, spacingRules) ?? + const SizedBox(height: 8); + } + return widget.spacingWidgetBuilder + ?.call(context, [SpacingType.defaultSpacing]) ?? + const SizedBox(height: 2); }, itemBuilder: (context, i) { if (i == itemCount - 1) { From 3470ed0bf19be17896abde1444e4a12cefc83872 Mon Sep 17 00:00:00 2001 From: Deven Joshi Date: Mon, 15 Nov 2021 18:48:50 +0530 Subject: [PATCH 2/6] added changelog --- packages/stream_chat_flutter/CHANGELOG.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/packages/stream_chat_flutter/CHANGELOG.md b/packages/stream_chat_flutter/CHANGELOG.md index 00f8412b..d85d75e1 100644 --- a/packages/stream_chat_flutter/CHANGELOG.md +++ b/packages/stream_chat_flutter/CHANGELOG.md @@ -1,3 +1,9 @@ +## Upcoming + +✅ Added + +- `MessageListView` now allows more better control over spacing after messages using `spacingWidgetBuilder`. + ## 3.2.0 - Updated Dart SDK constraints to `>=2.14.0 <3.0.0` From a6943ed00b1b155e823c536272b4e6842498b38b Mon Sep 17 00:00:00 2001 From: Deven Joshi Date: Mon, 15 Nov 2021 18:50:58 +0530 Subject: [PATCH 3/6] fmt --- packages/stream_chat_flutter/lib/src/message_list_view.dart | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) 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 8d4409bc..94824ef4 100644 --- a/packages/stream_chat_flutter/lib/src/message_list_view.dart +++ b/packages/stream_chat_flutter/lib/src/message_list_view.dart @@ -94,7 +94,9 @@ enum SpacingType { /// }, /// ), typedef SpacingWidgetBuilder = Widget Function( - BuildContext context, List spacingTypes); + BuildContext context, + List spacingTypes, +); /// Class for message details // ignore: prefer-match-file-name From 811a21079b820fe10dbedd3b119d2d5d7a18b620 Mon Sep 17 00:00:00 2001 From: Deven Joshi Date: Mon, 15 Nov 2021 18:57:05 +0530 Subject: [PATCH 4/6] analysis --- packages/stream_chat_flutter/lib/src/gallery_footer.dart | 1 - 1 file changed, 1 deletion(-) diff --git a/packages/stream_chat_flutter/lib/src/gallery_footer.dart b/packages/stream_chat_flutter/lib/src/gallery_footer.dart index dcfa0e29..0acd9b02 100644 --- a/packages/stream_chat_flutter/lib/src/gallery_footer.dart +++ b/packages/stream_chat_flutter/lib/src/gallery_footer.dart @@ -1,7 +1,6 @@ import 'dart:io'; import 'package:cached_network_image/cached_network_image.dart'; -import 'package:dio/dio.dart'; import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; import 'package:path_provider/path_provider.dart'; From 687fa6cfce4494416a201170526349c8a64e0c59 Mon Sep 17 00:00:00 2001 From: Deven Joshi Date: Mon, 15 Nov 2021 19:13:07 +0530 Subject: [PATCH 5/6] added back dio --- packages/stream_chat_flutter/lib/src/gallery_footer.dart | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/stream_chat_flutter/lib/src/gallery_footer.dart b/packages/stream_chat_flutter/lib/src/gallery_footer.dart index 0acd9b02..dcfa0e29 100644 --- a/packages/stream_chat_flutter/lib/src/gallery_footer.dart +++ b/packages/stream_chat_flutter/lib/src/gallery_footer.dart @@ -1,6 +1,7 @@ import 'dart:io'; import 'package:cached_network_image/cached_network_image.dart'; +import 'package:dio/dio.dart'; import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; import 'package:path_provider/path_provider.dart'; From ebd6b45efdc340a39c09567877ba872bd08059f8 Mon Sep 17 00:00:00 2001 From: Salvatore Giordano Date: Thu, 18 Nov 2021 17:08:16 +0100 Subject: [PATCH 6/6] chore(ui): update changelog --- packages/stream_chat_flutter/CHANGELOG.md | 2 -- 1 file changed, 2 deletions(-) diff --git a/packages/stream_chat_flutter/CHANGELOG.md b/packages/stream_chat_flutter/CHANGELOG.md index 4a92c76f..5d119e8c 100644 --- a/packages/stream_chat_flutter/CHANGELOG.md +++ b/packages/stream_chat_flutter/CHANGELOG.md @@ -4,8 +4,6 @@ - `MessageListView` now allows more better control over spacing after messages using `spacingWidgetBuilder`. -## Upcoming - 🐞 Fixed - Fixed `MessageWidget` null errors associated with `channel.memberCount`.