diff --git a/lib/pages/chat/chat_event_list.dart b/lib/pages/chat/chat_event_list.dart index 963a2c230..24508bb62 100644 --- a/lib/pages/chat/chat_event_list.dart +++ b/lib/pages/chat/chat_event_list.dart @@ -168,7 +168,6 @@ class ChatEventList extends StatelessWidget { onSelect: controller.onSelectMessage, scrollToEventId: (String eventId) => controller.scrollToEventId(eventId), - scrollController: controller.scrollController, longPressSelect: controller.selectedEvents.isNotEmpty, // #Pangea selectedDisplayLang: diff --git a/lib/pages/chat/events/message.dart b/lib/pages/chat/events/message.dart index a1d04cb5c..45b60abd1 100644 --- a/lib/pages/chat/events/message.dart +++ b/lib/pages/chat/events/message.dart @@ -43,7 +43,6 @@ class Message extends StatelessWidget { final bool immersionMode; final bool definitions; final ChatController controller; - final ScrollController scrollController; // Pangea# final Color? avatarPresenceBackgroundColor; @@ -69,7 +68,6 @@ class Message extends StatelessWidget { required this.immersionMode, required this.definitions, required this.controller, - required this.scrollController, // Pangea# super.key, }); @@ -321,10 +319,9 @@ class Message extends StatelessWidget { // #Pangea onTap: () => toolbarController?.showToolbar( context, - scrollController, ), - onDoubleTap: () => toolbarController - ?.showToolbar(context, scrollController), + onDoubleTap: () => + toolbarController?.showToolbar(context), // Pangea# onLongPress: longPressSelect ? null @@ -447,8 +444,6 @@ class Message extends StatelessWidget { immersionMode: immersionMode, toolbarController: toolbarController, - scrollController: - scrollController, // Pangea# ), if (event.hasAggregatedEvents( @@ -595,8 +590,8 @@ class Message extends StatelessWidget { children: [ if (pangeaMessageEvent?.showMessageButtons ?? false) MessageButtons( - toolbarController: toolbarController, - scrollController: scrollController), + toolbarController: toolbarController, + ), MessageReactions(event, timeline), ], ), diff --git a/lib/pages/chat/events/message_content.dart b/lib/pages/chat/events/message_content.dart index ab6c60193..01ae471f8 100644 --- a/lib/pages/chat/events/message_content.dart +++ b/lib/pages/chat/events/message_content.dart @@ -39,7 +39,6 @@ class MessageContent extends StatelessWidget { final bool immersionMode; final ToolbarDisplayController? toolbarController; final bool isOverlay; - final ScrollController scrollController; // Pangea# const MessageContent( @@ -53,7 +52,6 @@ class MessageContent extends StatelessWidget { required this.immersionMode, required this.toolbarController, this.isOverlay = false, - required this.scrollController, // Pangea# required this.borderRadius, }); @@ -301,7 +299,6 @@ class MessageContent extends StatelessWidget { style: messageTextStyle, pangeaMessageEvent: pangeaMessageEvent!, immersionMode: immersionMode, - scrollController: scrollController, toolbarController: toolbarController, ); } else if (pangeaMessageEvent != null) { @@ -325,8 +322,7 @@ class MessageContent extends StatelessWidget { toolbarController?.toolbar?.textSelection .onTextSelection(selection); }, - onTap: () => - toolbarController?.showToolbar(context, scrollController), + onTap: () => toolbarController?.showToolbar(context), contextMenuBuilder: (context, state) => (toolbarController?.highlighted ?? false) ? const SizedBox.shrink() @@ -335,12 +331,10 @@ class MessageContent extends StatelessWidget { textSelection: state, onDefine: () => toolbarController?.showToolbar( context, - scrollController, mode: MessageMode.definition, ), onListen: () => toolbarController?.showToolbar( context, - scrollController, mode: MessageMode.textToSpeech, ), ), diff --git a/lib/pangea/widgets/chat/message_buttons.dart b/lib/pangea/widgets/chat/message_buttons.dart index 7d3539298..f7748675f 100644 --- a/lib/pangea/widgets/chat/message_buttons.dart +++ b/lib/pangea/widgets/chat/message_buttons.dart @@ -4,18 +4,15 @@ import 'package:flutter/material.dart'; class MessageButtons extends StatelessWidget { final ToolbarDisplayController? toolbarController; - final ScrollController scrollController; const MessageButtons({ super.key, - required this.scrollController, this.toolbarController, }); void showActivity(BuildContext context) { toolbarController?.showToolbar( context, - scrollController, mode: MessageMode.practiceActivity, ); } diff --git a/lib/pangea/widgets/chat/message_toolbar.dart b/lib/pangea/widgets/chat/message_toolbar.dart index 41ae358d3..477c64e5f 100644 --- a/lib/pangea/widgets/chat/message_toolbar.dart +++ b/lib/pangea/widgets/chat/message_toolbar.dart @@ -59,8 +59,7 @@ class ToolbarDisplayController { } void showToolbar( - BuildContext context, - ScrollController scrollController, { + BuildContext context, { MessageMode? mode, }) { bool toolbarUp = true; @@ -82,46 +81,49 @@ class ToolbarDisplayController { final Size transformTargetSize = (targetRenderBox as RenderBox).size; messageWidth = transformTargetSize.width; final Offset targetOffset = (targetRenderBox).localToGlobal(Offset.zero); - // final double screenHeight = MediaQuery.of(context).size.height; - // If message is too close to top, make space for toolbar + + // If there is enough space above, procede as normal + // Else if there is enough space below, show toolbar underneath if (targetOffset.dy < 320) { - // If chat can scroll up, do so - var scrollTo = scrollController.offset - targetOffset.dy + 320; - if (scrollTo >= scrollController.position.minScrollExtent && - scrollTo <= scrollController.position.maxScrollExtent) { - scrollController.animateTo( - scrollTo, + final spaceBeneath = MediaQuery.of(context).size.height - + (targetOffset.dy + transformTargetSize.height); + if (spaceBeneath >= 320) { + toolbarUp = false; + } + + // See if it's possible to scroll up to make space + else if (controller.scrollController.offset - targetOffset.dy + 320 >= + controller.scrollController.position.minScrollExtent && + controller.scrollController.offset - targetOffset.dy + 320 <= + controller.scrollController.position.maxScrollExtent) { + controller.scrollController.animateTo( + controller.scrollController.offset - targetOffset.dy + 320, duration: FluffyThemes.animationDuration, curve: FluffyThemes.animationCurve, ); } - // If cannot scroll up enough, show toolbar underneath instead - else { + + // See if it's possible to scroll down to make space + else if (controller.scrollController.offset + spaceBeneath - 320 >= + controller.scrollController.position.minScrollExtent && + controller.scrollController.offset + spaceBeneath - 320 <= + controller.scrollController.position.maxScrollExtent) { + controller.scrollController.animateTo( + controller.scrollController.offset + spaceBeneath - 320, + duration: FluffyThemes.animationDuration, + curve: FluffyThemes.animationCurve, + ); toolbarUp = false; - // Scroll down if need more space beneath message - final spaceBeneath = MediaQuery.of(context).size.height - - targetOffset.dy - - transformTargetSize.height; - if (spaceBeneath < 320) { - scrollTo = scrollController.offset + spaceBeneath - 320; - if (scrollTo >= scrollController.position.minScrollExtent && - scrollTo <= scrollController.position.maxScrollExtent) { - scrollController.animateTo( - scrollTo, - duration: FluffyThemes.animationDuration, - curve: FluffyThemes.animationCurve, - ); - } - // If can't scroll down enough, scroll up as much as possible and show toolbar above - else { - scrollController.animateTo( - scrollController.position.minScrollExtent, - duration: FluffyThemes.animationDuration, - curve: FluffyThemes.animationCurve, - ); - toolbarUp = true; - } - } + } + + // If message is too big and can't scroll either way + // Scroll up as much as possible, and show toolbar above + else { + controller.scrollController.animateTo( + controller.scrollController.position.minScrollExtent, + duration: FluffyThemes.animationDuration, + curve: FluffyThemes.animationCurve, + ); } } } @@ -132,7 +134,6 @@ class ToolbarDisplayController { immersionMode: immersionMode, ownMessage: pangeaMessageEvent.ownMessage, toolbarController: this, - scrollController: scrollController, width: messageWidth, nextEvent: nextEvent, previousEvent: previousEvent, diff --git a/lib/pangea/widgets/chat/overlay_message.dart b/lib/pangea/widgets/chat/overlay_message.dart index 86ad9cfb8..5f3d46c7e 100644 --- a/lib/pangea/widgets/chat/overlay_message.dart +++ b/lib/pangea/widgets/chat/overlay_message.dart @@ -21,7 +21,6 @@ class OverlayMessage extends StatelessWidget { final bool ownMessage; final ToolbarDisplayController toolbarController; final double? width; - final ScrollController scrollController; const OverlayMessage( this.event, { @@ -32,7 +31,6 @@ class OverlayMessage extends StatelessWidget { required this.immersionMode, required this.ownMessage, required this.toolbarController, - required this.scrollController, this.width, super.key, }); @@ -153,7 +151,6 @@ class OverlayMessage extends StatelessWidget { pangeaMessageEvent: pangeaMessageEvent, immersionMode: immersionMode, toolbarController: toolbarController, - scrollController: scrollController, isOverlay: true, ), if (event.hasAggregatedEvents( diff --git a/lib/pangea/widgets/igc/pangea_rich_text.dart b/lib/pangea/widgets/igc/pangea_rich_text.dart index 4302807e6..abf583b3b 100644 --- a/lib/pangea/widgets/igc/pangea_rich_text.dart +++ b/lib/pangea/widgets/igc/pangea_rich_text.dart @@ -21,14 +21,12 @@ class PangeaRichText extends StatefulWidget { final bool immersionMode; final ToolbarDisplayController? toolbarController; final TextStyle? style; - final ScrollController scrollController; const PangeaRichText({ super.key, required this.pangeaMessageEvent, required this.immersionMode, required this.toolbarController, - required this.scrollController, this.style, }); @@ -153,8 +151,7 @@ class PangeaRichTextState extends State { widget.toolbarController?.toolbar?.textSelection .onTextSelection(selection); }, - onTap: () => widget.toolbarController - ?.showToolbar(context, widget.scrollController), + onTap: () => widget.toolbarController?.showToolbar(context), enableInteractiveSelection: widget.toolbarController?.highlighted ?? false, contextMenuBuilder: (context, state) => @@ -165,12 +162,10 @@ class PangeaRichTextState extends State { textSelection: state, onDefine: () => widget.toolbarController?.showToolbar( context, - widget.scrollController, mode: MessageMode.definition, ), onListen: () => widget.toolbarController?.showToolbar( context, - widget.scrollController, mode: MessageMode.textToSpeech, ), ),