diff --git a/lib/pangea/widgets/chat/message_selection_overlay.dart b/lib/pangea/widgets/chat/message_selection_overlay.dart index 5e9cb3fe9..edd96aedf 100644 --- a/lib/pangea/widgets/chat/message_selection_overlay.dart +++ b/lib/pangea/widgets/chat/message_selection_overlay.dart @@ -232,8 +232,8 @@ class MessageOverlayController extends State messageSize!.height - toolbarButtonsHeight; - final bool hasHeaderOverflow = (messageOffset!.dy - toolbarButtonsHeight) < - (AppConfig.toolbarMaxHeight + headerHeight); + final bool hasHeaderOverflow = + messageOffset!.dy < (AppConfig.toolbarMaxHeight + headerHeight); final bool hasFooterOverflow = footerHeight > currentBottomOffset; if (!hasHeaderOverflow && !hasFooterOverflow) return; @@ -252,7 +252,8 @@ class MessageOverlayController extends State newTopOffset < (headerHeight + AppConfig.toolbarMaxHeight); if (hasHeaderOverflow || upshiftCausesHeaderOverflow) { - animationEndOffset = midpoint - messageSize!.height; + animationEndOffset = + midpoint - messageSize!.height - toolbarButtonsHeight; final totalTopOffset = animationEndOffset + messageSize!.height + AppConfig.toolbarMaxHeight; final remainingSpace = screenHeight - totalTopOffset; @@ -266,6 +267,15 @@ class MessageOverlayController extends State animationEndOffset = footerHeight; } + if (animationEndOffset < footerHeight + toolbarButtonsHeight) { + adjustedMessageHeight = screenHeight - + AppConfig.toolbarMaxHeight - + headerHeight - + footerHeight - + toolbarButtonsHeight; + animationEndOffset = footerHeight; + } + _overlayPositionAnimation = Tween( begin: currentBottomOffset, end: animationEndOffset, @@ -296,6 +306,7 @@ class MessageOverlayController extends State Size? get messageSize => messageRenderBox?.size; Offset? get messageOffset => messageRenderBox?.localToGlobal(Offset.zero); + double? adjustedMessageHeight; // height of the reply/forward bar + the reaction picker + contextual padding double get footerHeight => @@ -352,16 +363,20 @@ class MessageOverlayController extends State pangeaMessageEvent: widget._pangeaMessageEvent, overLayController: this, ), - OverlayMessage( - pangeaMessageEvent, - immersionMode: widget.chatController.choreographer.immersionMode, - controller: widget.chatController, - overlayController: this, - nextEvent: widget._nextEvent, - prevEvent: widget._prevEvent, - timeline: widget.chatController.timeline!, - messageWidth: messageSize!.width, - messageHeight: messageSize!.height, + SizedBox( + height: adjustedMessageHeight, + child: OverlayMessage( + pangeaMessageEvent, + immersionMode: + widget.chatController.choreographer.immersionMode, + controller: widget.chatController, + overlayController: this, + nextEvent: widget._nextEvent, + prevEvent: widget._prevEvent, + timeline: widget.chatController.timeline!, + messageWidth: messageSize!.width, + messageHeight: messageSize!.height, + ), ), ToolbarButtons( overlayController: this, diff --git a/lib/pangea/widgets/chat/message_toolbar.dart b/lib/pangea/widgets/chat/message_toolbar.dart index 0e5b40b7e..704338764 100644 --- a/lib/pangea/widgets/chat/message_toolbar.dart +++ b/lib/pangea/widgets/chat/message_toolbar.dart @@ -133,6 +133,9 @@ class MessageToolbarState extends State { Radius.circular(AppConfig.borderRadius), ), ), + constraints: const BoxConstraints( + maxHeight: AppConfig.toolbarMaxHeight, + ), child: Row( children: [ Expanded( diff --git a/lib/pangea/widgets/chat/overlay_message.dart b/lib/pangea/widgets/chat/overlay_message.dart index 9372edbfb..23c5cf267 100644 --- a/lib/pangea/widgets/chat/overlay_message.dart +++ b/lib/pangea/widgets/chat/overlay_message.dart @@ -88,30 +88,32 @@ class OverlayMessage extends StatelessWidget { shape: RoundedRectangleBorder( borderRadius: borderRadius, ), - child: Container( - decoration: BoxDecoration( - borderRadius: BorderRadius.circular( - AppConfig.borderRadius, + child: SingleChildScrollView( + child: Container( + decoration: BoxDecoration( + borderRadius: BorderRadius.circular( + AppConfig.borderRadius, + ), + ), + padding: const EdgeInsets.symmetric( + horizontal: 16, + vertical: 8, + ), + width: messageWidth, + height: messageHeight, + child: MessageContent( + pangeaMessageEvent.event, + textColor: ownMessage + ? theme.colorScheme.onPrimary + : theme.colorScheme.onSurface, + pangeaMessageEvent: pangeaMessageEvent, + immersionMode: immersionMode, + overlayController: overlayController, + controller: controller, + nextEvent: nextEvent, + prevEvent: prevEvent, + borderRadius: borderRadius, ), - ), - padding: const EdgeInsets.symmetric( - horizontal: 16, - vertical: 8, - ), - width: messageWidth, - height: messageHeight, - child: MessageContent( - pangeaMessageEvent.event, - textColor: ownMessage - ? theme.colorScheme.onPrimary - : theme.colorScheme.onSurface, - pangeaMessageEvent: pangeaMessageEvent, - immersionMode: immersionMode, - overlayController: overlayController, - controller: controller, - nextEvent: nextEvent, - prevEvent: prevEvent, - borderRadius: borderRadius, ), ), );