From 77ac0428ea31698c1bc7a02268736c0731e2e034 Mon Sep 17 00:00:00 2001 From: LittleSheep Date: Mon, 24 Nov 2025 23:21:52 +0800 Subject: [PATCH] :lipstick: The universal escape now can close the fade made dialog --- lib/widgets/alert.dart | 15 +++++++++++++++ lib/widgets/app_scaffold.dart | 7 +++++++ lib/widgets/content/network_status_sheet.dart | 1 + 3 files changed, 23 insertions(+) diff --git a/lib/widgets/alert.dart b/lib/widgets/alert.dart index 4249ebde..4eea834c 100644 --- a/lib/widgets/alert.dart +++ b/lib/widgets/alert.dart @@ -157,6 +157,9 @@ String _parseRemoteError(DioException err) { return message ?? err.toString(); } +// Track active overlay dialogs for dismissal +final List _activeOverlayDialogs = []; + Future showOverlayDialog({ required Widget Function(BuildContext context, void Function(T? result) close) builder, @@ -175,6 +178,7 @@ Future showOverlayDialog({ } entry.remove(); + _activeOverlayDialogs.remove(close); completer.complete(result); } @@ -215,10 +219,21 @@ Future showOverlayDialog({ ), ); + _activeOverlayDialogs.add(() => close(null)); globalOverlay.currentState!.insert(entry); return completer.future; } +// Close the topmost overlay dialog if any exists +bool closeTopmostOverlayDialog() { + if (_activeOverlayDialogs.isNotEmpty) { + final closeFunc = _activeOverlayDialogs.last; + closeFunc(); + return true; + } + return false; +} + const kDialogMaxWidth = 480.0; void showErrorAlert(dynamic err, {IconData? icon}) { diff --git a/lib/widgets/app_scaffold.dart b/lib/widgets/app_scaffold.dart index b8576ca1..8ae17d0e 100644 --- a/lib/widgets/app_scaffold.dart +++ b/lib/widgets/app_scaffold.dart @@ -13,6 +13,7 @@ import 'package:island/route.dart'; import 'package:island/pods/userinfo.dart'; import 'package:island/pods/websocket.dart'; import 'package:island/services/responsive.dart'; +import 'package:island/widgets/alert.dart'; import 'package:island/widgets/upload_overlay.dart'; import 'package:material_symbols_icons/material_symbols_icons.dart'; import 'package:path_provider/path_provider.dart'; @@ -364,6 +365,12 @@ class PopAction extends Action { @override void invoke(PopIntent intent) { + // First, try to close any overlay dialogs + if (closeTopmostOverlayDialog()) { + return; + } + + // If no overlay to close, pop the route if (ref.watch(routerProvider).canPop()) { ref.read(routerProvider).pop(); } diff --git a/lib/widgets/content/network_status_sheet.dart b/lib/widgets/content/network_status_sheet.dart index 017ff02d..388c11af 100644 --- a/lib/widgets/content/network_status_sheet.dart +++ b/lib/widgets/content/network_status_sheet.dart @@ -15,6 +15,7 @@ class NetworkStatusSheet extends HookConsumerWidget { final wsState = ref.watch(websocketStateProvider); return SheetScaffold( + heightFactor: 0.4, titleText: wsState == WebSocketState.connected() ? 'Connection Status'