Merge pull request #1030 from GetStream/live-event-improvements

feat(flutter): Live event integration improvements
This commit is contained in:
Salvatore Giordano
2022-04-07 10:53:23 +02:00
committed by GitHub
2 changed files with 79 additions and 34 deletions
@@ -172,6 +172,7 @@ class StreamMessageListView extends StatefulWidget {
const StreamMessageListView({
Key? key,
this.showScrollToBottom = true,
this.scrollToBottomBuilder,
this.messageBuilder,
this.parentMessageBuilder,
this.parentMessage,
@@ -243,6 +244,25 @@ class StreamMessageListView extends StatefulWidget {
/// messages and the scroll offset is not zero
final bool showScrollToBottom;
/// Function used to build a custom scroll to bottom widget
///
/// Provides the current unread messages count and a reference
/// to the function that is executed on tap of this widget by default
///
/// As an example:
/// MessageListView(
/// scrollToBottomBuilder: (unreadCount, defaultTapAction) {
/// return InkWell(
/// onTap: () => defaultTapAction(unreadCount),
/// child: Text('Scroll To Bottom'),
/// );
/// },
/// ),
final Widget Function(
int unreadCount,
Future<void> Function(int) scrollToBottomDefaultTapAction,
)? scrollToBottomBuilder;
/// Parent message in case of a thread
final Message? parentMessage;
@@ -848,6 +868,29 @@ class _StreamMessageListViewState extends State<StreamMessageListView> {
.index;
}
Future<void> scrollToBottomDefaultTapAction(int unreadCount) async {
if (unreadCount > 0) {
streamChannel!.channel.markRead();
}
if (!_upToDate) {
_bottomPaginationActive = false;
initialAlignment = 0;
initialIndex = 0;
await streamChannel!.reloadChannel();
WidgetsBinding.instance?.addPostFrameCallback((_) {
_scrollController!.jumpTo(index: 0);
});
} else {
_showScrollToBottom.value = false;
_scrollController!.scrollTo(
index: 0,
duration: const Duration(seconds: 1),
curve: Curves.easeInOut,
);
}
}
Widget _buildScrollToBottom() => StreamBuilder<int>(
stream: streamChannel!.channel.state!.unreadCountStream,
builder: (_, snapshot) {
@@ -857,6 +900,12 @@ class _StreamMessageListViewState extends State<StreamMessageListView> {
return const Offstage();
}
final unreadCount = snapshot.data!;
if (widget.scrollToBottomBuilder != null) {
return widget.scrollToBottomBuilder!(
unreadCount,
scrollToBottomDefaultTapAction,
);
}
final showUnreadCount = unreadCount > 0 &&
streamChannel!.channel.state!.members.any((e) =>
e.userId ==
@@ -871,28 +920,7 @@ class _StreamMessageListViewState extends State<StreamMessageListView> {
children: [
FloatingActionButton(
backgroundColor: _streamTheme.colorTheme.barsBg,
onPressed: () async {
if (unreadCount > 0) {
streamChannel!.channel.markRead();
}
if (!_upToDate) {
_bottomPaginationActive = false;
initialAlignment = 0;
initialIndex = 0;
await streamChannel!.reloadChannel();
WidgetsBinding.instance?.addPostFrameCallback((_) {
_scrollController!.jumpTo(index: 0);
});
} else {
_showScrollToBottom.value = false;
_scrollController!.scrollTo(
index: 0,
duration: const Duration(seconds: 1),
curve: Curves.easeInOut,
);
}
},
onPressed: () => scrollToBottomDefaultTapAction(unreadCount),
child: widget.reverse
? StreamSvgIcon.down(
color: _streamTheme.colorTheme.textHighEmphasis,
@@ -210,6 +210,8 @@ class StreamMessageInput extends StatefulWidget {
this.enableSafeArea,
this.elevation,
this.shadow,
this.autoCorrect,
this.disableEmojiSuggestionsOverlay,
}) : super(key: key);
/// List of options for showing overlays.
@@ -329,6 +331,14 @@ class StreamMessageInput extends StatefulWidget {
/// Shadow for the [StreamMessageInput] widget
final BoxShadow? shadow;
/// Disable autoCorrect by passing false
/// autoCorrect is enabled by default
final bool? autoCorrect;
/// Disable the default emoji suggestions
/// Enabled by default
final bool? disableEmojiSuggestionsOverlay;
static bool _defaultValidator(Message message) =>
message.text?.isNotEmpty == true || message.attachments.isNotEmpty;
@@ -360,6 +370,11 @@ class StreamMessageInputState extends State<StreamMessageInput>
bool get _isEditing =>
_effectiveController.value.status != MessageSendingStatus.sending;
bool get _autoCorrect => widget.autoCorrect ?? true;
bool get _disableEmojiSuggestionsOverlay =>
widget.disableEmojiSuggestionsOverlay ?? false;
RestorableMessageInputController? _controller;
MessageInputController get _effectiveController =>
@@ -589,18 +604,19 @@ class StreamMessageInputState extends State<StreamMessageInput>
visible: _showCommandsOverlay,
widget: _buildCommandsOverlayEntry(),
),
OverlayOptions(
visible: _focusNode.hasFocus &&
_effectiveController.text.isNotEmpty &&
_effectiveController.baseOffset > 0 &&
_effectiveController.text
.substring(
0,
_effectiveController.baseOffset,
)
.contains(':'),
widget: _buildEmojiOverlay(),
),
if (!_disableEmojiSuggestionsOverlay)
OverlayOptions(
visible: _focusNode.hasFocus &&
_effectiveController.text.isNotEmpty &&
_effectiveController.baseOffset > 0 &&
_effectiveController.text
.substring(
0,
_effectiveController.baseOffset,
)
.contains(':'),
widget: _buildEmojiOverlay(),
),
OverlayOptions(
visible: _showMentionsOverlay,
widget: _buildMentionsOverlayEntry(),
@@ -802,6 +818,7 @@ class StreamMessageInputState extends State<StreamMessageInput>
textAlignVertical: TextAlignVertical.center,
decoration: _getInputDecoration(context),
textCapitalization: TextCapitalization.sentences,
autocorrect: _autoCorrect,
),
),
],