diff --git a/lib/pages/chat/chat.dart b/lib/pages/chat/chat.dart index d20c2b4f2..ed3b27336 100644 --- a/lib/pages/chat/chat.dart +++ b/lib/pages/chat/chat.dart @@ -1608,15 +1608,6 @@ class ChatController extends State ); } - // #Pangea - /// Close the combined selection view overlay and clear the message - /// text and selection stored for the text in that overlay - void closeSelectionOverlay() { - MatrixState.pAnyState.closeAllOverlays(); - // selectedTokenIndicies.clear(); - } - // Pangea# - // #Pangea // void clearSelectedEvents() => setState(() { // selectedEvents.clear(); @@ -1625,7 +1616,7 @@ class ChatController extends State void clearSelectedEvents() { if (!mounted) return; setState(() { - closeSelectionOverlay(); + MatrixState.pAnyState.closeAllOverlays(); selectedEvents.clear(); showEmojiPicker = false; }); diff --git a/lib/pangea/activity_sessions/activity_session_chat/activity_stats_button.dart b/lib/pangea/activity_sessions/activity_session_chat/activity_stats_button.dart index e14443f1e..59c96915b 100644 --- a/lib/pangea/activity_sessions/activity_session_chat/activity_stats_button.dart +++ b/lib/pangea/activity_sessions/activity_session_chat/activity_stats_button.dart @@ -15,6 +15,7 @@ import 'package:fluffychat/pangea/analytics_misc/construct_type_enum.dart'; import 'package:fluffychat/pangea/common/utils/overlay.dart'; import 'package:fluffychat/pangea/common/widgets/pressable_button.dart'; import 'package:fluffychat/pangea/instructions/instructions_enum.dart'; +import 'package:fluffychat/widgets/matrix.dart'; class ActivityStatsButton extends StatefulWidget { final ChatController controller; @@ -54,6 +55,9 @@ class _ActivityStatsButtonState extends State { bool get _shouldShowInstructions { if (InstructionsEnum.activityStatsMenu.isToggledOff || + MatrixState.pAnyState.isOverlayOpen( + RegExp(r"^word-zoom-card-.*$"), + ) || _xpCount <= 0 || widget.controller.timeline == null) { return false; @@ -111,7 +115,7 @@ class _ActivityStatsButtonState extends State { OverlayUtil.showTutorialOverlay( context, - Center( + overlayContent: Center( child: Container( padding: const EdgeInsets.all(16.0), decoration: BoxDecoration( @@ -144,12 +148,13 @@ class _ActivityStatsButtonState extends State { ), ), ), - cellRect, + overlayKey: "activity_stats_menu_instruction", + anchorRect: cellRect, borderRadius: 12.0, padding: 8.0, - onClick: () => widget.controller.setShowDropdown(true), - onDismiss: () { + onClick: () { InstructionsEnum.activityStatsMenu.setToggledOff(true); + widget.controller.setShowDropdown(true); }, ); } diff --git a/lib/pangea/analytics_misc/level_up/level_up_banner.dart b/lib/pangea/analytics_misc/level_up/level_up_banner.dart index 90a03d6ed..1dd5c6ab0 100644 --- a/lib/pangea/analytics_misc/level_up/level_up_banner.dart +++ b/lib/pangea/analytics_misc/level_up/level_up_banner.dart @@ -40,7 +40,7 @@ class LevelUpUtil { if (!context.mounted) return; - await OverlayUtil.showOverlay( + OverlayUtil.showOverlay( overlayKey: "level_up_notification", context: context, child: LevelUpBanner( @@ -66,8 +66,7 @@ class LevelUpUtil { static Future _waitForSnackbars(BuildContext context) async { final snackbarRegex = RegExp(r'_snackbar$'); - while (MatrixState.pAnyState.activeOverlays - .any((id) => snackbarRegex.hasMatch(id))) { + while (MatrixState.pAnyState.isOverlayOpen(snackbarRegex)) { await Future.delayed(const Duration(milliseconds: 100)); } } diff --git a/lib/pangea/chat/utils/unlocked_morphs_snackbar.dart b/lib/pangea/chat/utils/unlocked_morphs_snackbar.dart index 3d007f768..06ad1fdb9 100644 --- a/lib/pangea/chat/utils/unlocked_morphs_snackbar.dart +++ b/lib/pangea/chat/utils/unlocked_morphs_snackbar.dart @@ -40,7 +40,6 @@ class ConstructNotificationUtil { if (_closedOverlays.contains(overlayKey)) return; _closedOverlays.add(overlayKey); MatrixState.pAnyState.closeOverlay(overlayKey); - MatrixState.pAnyState.activeOverlays.remove(overlayKey); unlockedConstructs.remove(construct); closeCompleter?.complete(); closeCompleter = null; @@ -58,7 +57,7 @@ class ConstructNotificationUtil { ); closeCompleter = Completer(); - OverlayUtil.showOverlay( + final bool result = OverlayUtil.showOverlay( overlayKey: "${construct.string}_snackbar", context: context, child: ConstructNotificationOverlay( @@ -72,13 +71,14 @@ class ConstructNotificationUtil { canPop: false, ); - MatrixState.pAnyState.activeOverlays - .add("${construct.string}_snackbar"); + // if the overlay could not be shown, break the loop + if (!result) { + showingNotification = false; + break; + } await closeCompleter!.future; } catch (e) { - MatrixState.pAnyState.activeOverlays - .remove("${construct.string}_snackbar"); showingNotification = false; break; } diff --git a/lib/pangea/common/utils/any_state_holder.dart b/lib/pangea/common/utils/any_state_holder.dart index 201d9686b..64ea7936e 100644 --- a/lib/pangea/common/utils/any_state_holder.dart +++ b/lib/pangea/common/utils/any_state_holder.dart @@ -9,16 +9,17 @@ class OverlayListEntry { final OverlayEntry entry; final String? key; final bool canPop; + final bool blockOverlay; OverlayListEntry( this.entry, { this.key, this.canPop = true, + this.blockOverlay = false, }); } class PangeaAnyState { - final Set activeOverlays = {}; final Map _layerLinkAndKeys = {}; List entries = []; @@ -39,16 +40,21 @@ class PangeaAnyState { return _layerLinkAndKeys[transformTargetId]!; } - void openOverlay( + bool openOverlay( OverlayEntry entry, BuildContext context, { String? overlayKey, bool canPop = true, + bool blockOverlay = false, bool rootOverlay = false, }) { + if (entries.any((e) => e.blockOverlay)) { + return false; + } + if (overlayKey != null && entries.any((element) => element.key == overlayKey)) { - return; + return false; } entries.add( @@ -56,17 +62,16 @@ class PangeaAnyState { entry, key: overlayKey, canPop: canPop, + blockOverlay: blockOverlay, ), ); - if (overlayKey != null) { - activeOverlays.add(overlayKey); - } - Overlay.of( context, rootOverlay: rootOverlay, ).insert(entry); + + return true; } void closeOverlay([String? overlayKey]) { @@ -89,10 +94,6 @@ class PangeaAnyState { ); } entries.remove(entry); - - if (overlayKey != null) { - activeOverlays.remove(overlayKey); - } } } @@ -126,10 +127,6 @@ class PangeaAnyState { ); } - if (shouldRemove[i].key != null) { - activeOverlays.remove(shouldRemove[i].key); - } - entries.remove(shouldRemove[i]); } } @@ -137,8 +134,10 @@ class PangeaAnyState { RenderBox? getRenderBox(String key) => layerLinkAndKey(key).key.currentContext?.findRenderObject() as RenderBox?; - bool isOverlayOpen(String overlayKey) { - return entries.any((element) => element.key == overlayKey); + bool isOverlayOpen(RegExp regex) { + return entries.any( + (element) => element.key != null && regex.hasMatch(element.key!), + ); } List getMatchingOverlayKeys(RegExp regex) { diff --git a/lib/pangea/common/utils/overlay.dart b/lib/pangea/common/utils/overlay.dart index 99b37c2e8..a18be4332 100644 --- a/lib/pangea/common/utils/overlay.dart +++ b/lib/pangea/common/utils/overlay.dart @@ -18,7 +18,7 @@ enum OverlayPositionEnum { } class OverlayUtil { - static showOverlay({ + static bool showOverlay({ required BuildContext context, required Widget child, String? transformTargetId, @@ -35,6 +35,7 @@ class OverlayUtil { Alignment? followerAnchor, bool ignorePointer = false, bool canPop = true, + bool rootOverlay = false, }) { try { if (position == OverlayPositionEnum.transform) { @@ -96,11 +97,12 @@ class OverlayUtil { ), ); - MatrixState.pAnyState.openOverlay( + return MatrixState.pAnyState.openOverlay( entry, context, overlayKey: overlayKey, canPop: canPop, + rootOverlay: rootOverlay, ); } catch (err, stack) { debugger(when: kDebugMode); @@ -109,6 +111,7 @@ class OverlayUtil { s: stack, data: {}, ); + return false; } } @@ -215,15 +218,17 @@ class OverlayUtil { } static void showTutorialOverlay( - BuildContext context, - Widget overlayContent, - Rect anchorRect, { + BuildContext context, { + required Widget overlayContent, + required String overlayKey, + required Rect anchorRect, double? borderRadius, double? padding, final VoidCallback? onClick, - final VoidCallback? onDismiss, }) { - MatrixState.pAnyState.closeAllOverlays(); + // force close all overlays to prevent showing + // constuct / level up notification on top of tutorial + MatrixState.pAnyState.closeAllOverlays(force: true); final entry = OverlayEntry( builder: (context) { return AnchoredOverlayWidget( @@ -231,7 +236,7 @@ class OverlayUtil { borderRadius: borderRadius, padding: padding, onClick: onClick, - onDismiss: onDismiss, + overlayKey: overlayKey, child: overlayContent, ); }, @@ -240,6 +245,9 @@ class OverlayUtil { entry, context, rootOverlay: true, + overlayKey: overlayKey, + canPop: false, + blockOverlay: true, ); } } diff --git a/lib/pangea/common/widgets/anchored_overlay_widget.dart b/lib/pangea/common/widgets/anchored_overlay_widget.dart index 177450f75..208295582 100644 --- a/lib/pangea/common/widgets/anchored_overlay_widget.dart +++ b/lib/pangea/common/widgets/anchored_overlay_widget.dart @@ -7,18 +7,18 @@ import 'package:fluffychat/widgets/matrix.dart'; class AnchoredOverlayWidget extends StatefulWidget { final Widget child; final Rect anchorRect; + final String overlayKey; final double? borderRadius; final double? padding; final VoidCallback? onClick; - final VoidCallback? onDismiss; const AnchoredOverlayWidget({ required this.child, required this.anchorRect, + required this.overlayKey, this.borderRadius, this.padding, this.onClick, - this.onDismiss, super.key, }); @@ -41,6 +41,17 @@ class _AnchoredOverlayWidgetState extends State { ); } + Future _closeOverlay() async { + if (mounted) { + setState(() { + _visible = false; + }); + await Future.delayed(FluffyThemes.animationDuration); + } + + MatrixState.pAnyState.closeOverlay(widget.overlayKey); + } + @override Widget build(BuildContext context) { final leftPosition = (widget.anchorRect.left + @@ -58,11 +69,9 @@ class _AnchoredOverlayWidgetState extends State { onTapDown: (details) { final tapPos = details.globalPosition; if (widget.anchorRect.contains(tapPos)) { + _closeOverlay(); widget.onClick?.call(); } - - widget.onDismiss?.call(); - MatrixState.pAnyState.closeOverlay(); }, child: Stack( children: [