From a6383199266f8be0fab60d8106b1e798b35cbf54 Mon Sep 17 00:00:00 2001 From: ggurdin <46800240+ggurdin@users.noreply.github.com> Date: Wed, 22 Jan 2025 15:30:31 -0500 Subject: [PATCH] fix: don't show multiple of the same instruction card (#1537) --- lib/pangea/common/utils/any_state_holder.dart | 21 +++++++++++++++---- lib/pangea/common/utils/overlay.dart | 16 ++++++++++---- .../instructions/instructions_show_popup.dart | 1 + 3 files changed, 30 insertions(+), 8 deletions(-) diff --git a/lib/pangea/common/utils/any_state_holder.dart b/lib/pangea/common/utils/any_state_holder.dart index f9e3f4d97..6c885562e 100644 --- a/lib/pangea/common/utils/any_state_holder.dart +++ b/lib/pangea/common/utils/any_state_holder.dart @@ -4,9 +4,16 @@ import 'package:sentry_flutter/sentry_flutter.dart'; import 'package:fluffychat/pangea/common/utils/error_handler.dart'; +class OverlayListEntry { + final OverlayEntry entry; + final String? key; + + OverlayListEntry(this.entry, {this.key}); +} + class PangeaAnyState { final Map _layerLinkAndKeys = {}; - List entries = []; + List entries = []; dispose() { closeOverlay(); @@ -38,18 +45,24 @@ class PangeaAnyState { OverlayEntry entry, BuildContext context, { bool closePrevOverlay = true, + String? overlayKey, }) { + if (overlayKey != null && + entries.any((element) => element.key == overlayKey)) { + return; + } + if (closePrevOverlay) { closeOverlay(); } - entries.add(entry); + entries.add(OverlayListEntry(entry, key: overlayKey)); Overlay.of(context).insert(entry); } void closeOverlay() { if (entries.isNotEmpty) { try { - entries.last.remove(); + entries.last.entry.remove(); } catch (err, s) { ErrorHandler.logError( e: err, @@ -66,7 +79,7 @@ class PangeaAnyState { void closeAllOverlays() { for (int i = 0; i < entries.length; i++) { try { - entries.last.remove(); + entries.last.entry.remove(); } catch (err, s) { ErrorHandler.logError( e: err, diff --git a/lib/pangea/common/utils/overlay.dart b/lib/pangea/common/utils/overlay.dart index ef538a745..32e7a76d5 100644 --- a/lib/pangea/common/utils/overlay.dart +++ b/lib/pangea/common/utils/overlay.dart @@ -29,6 +29,7 @@ class OverlayUtil { Function? onDismiss, OverlayPositionEnum position = OverlayPositionEnum.transform, Offset? offset, + String? overlayKey, }) { try { if (closePrevOverlay) { @@ -70,8 +71,12 @@ class OverlayUtil { ), ); - MatrixState.pAnyState - .openOverlay(entry, context, closePrevOverlay: closePrevOverlay); + MatrixState.pAnyState.openOverlay( + entry, + context, + closePrevOverlay: closePrevOverlay, + overlayKey: overlayKey, + ); } catch (err, stack) { debugger(when: kDebugMode); ErrorHandler.logError( @@ -91,6 +96,7 @@ class OverlayUtil { backDropToDismiss = true, Color? borderColor, bool closePrevOverlay = true, + String? overlayKey, }) { try { final LayerLinkAndKey layerLinkAndKey = @@ -114,14 +120,15 @@ class OverlayUtil { final hasLeftOverflow = (horizontalMidpoint - halfMaxWidth) < 0; final hasRightOverflow = (horizontalMidpoint + halfMaxWidth) > MediaQuery.of(context).size.width; + double xOffset = 0; MediaQuery.of(context).size.width - (horizontalMidpoint + halfMaxWidth); if (hasLeftOverflow) { - xOffset = (horizontalMidpoint - halfMaxWidth) * -1; + xOffset = (horizontalMidpoint - halfMaxWidth - 10) * -1; } else if (hasRightOverflow) { xOffset = MediaQuery.of(context).size.width - - (horizontalMidpoint + halfMaxWidth); + (horizontalMidpoint + halfMaxWidth + 10); } offset = Offset(xOffset, 0); } @@ -146,6 +153,7 @@ class OverlayUtil { borderColor: borderColor, closePrevOverlay: closePrevOverlay, offset: offset, + overlayKey: overlayKey, ); } catch (err, stack) { debugger(when: kDebugMode); diff --git a/lib/pangea/instructions/instructions_show_popup.dart b/lib/pangea/instructions/instructions_show_popup.dart index 3b6efa807..ae5a1c5d2 100644 --- a/lib/pangea/instructions/instructions_show_popup.dart +++ b/lib/pangea/instructions/instructions_show_popup.dart @@ -67,6 +67,7 @@ Future instructionsShowPopup( maxWidth: 300, transformTargetId: transformTargetKey, closePrevOverlay: false, + overlayKey: key.toString(), ); }, );