diff --git a/lib/l10n/intl_nb.arb b/lib/l10n/intl_nb.arb index 187bbdefc..78dcddb62 100644 --- a/lib/l10n/intl_nb.arb +++ b/lib/l10n/intl_nb.arb @@ -2668,6 +2668,8 @@ } } }, + "noMessagesYet": "Ingen meldinger enda", + "@noMessagesYet": {}, "alwaysUse24HourFormat": "falsk", "commandHint_googly": "Send noen googly-øyne", "commandHint_cuddle": "Send en kose", diff --git a/lib/pages/archive/archive.dart b/lib/pages/archive/archive.dart index c5bd5e6b0..550175505 100644 --- a/lib/pages/archive/archive.dart +++ b/lib/pages/archive/archive.dart @@ -58,8 +58,10 @@ class ArchiveController extends State { } await showFutureLoadingDialog( context: context, - future: () async { + futureWithProgress: (onProgress) async { + final count = archive.length; while (archive.isNotEmpty) { + onProgress(1 - (archive.length / count)); Logs().v('Forget room ${archive.last.getLocalizedDisplayname()}'); await archive.last.forget(); archive.removeLast(); diff --git a/lib/pages/chat/chat.dart b/lib/pages/chat/chat.dart index b455cc61b..ce14f3e24 100644 --- a/lib/pages/chat/chat.dart +++ b/lib/pages/chat/chat.dart @@ -1406,10 +1406,12 @@ class ChatController extends State } // Pangea# final reason = reasonInput.isEmpty ? null : reasonInput; - for (final event in selectedEvents) { - await showFutureLoadingDialog( - context: context, - future: () async { + await showFutureLoadingDialog( + context: context, + futureWithProgress: (onProgress) async { + final count = selectedEvents.length; + for (final (i, event) in selectedEvents.indexed) { + onProgress(i / count); if (event.status.isSent) { if (event.canRedact) { // #Pangea @@ -1439,9 +1441,9 @@ class ChatController extends State } else { await event.cancelSend(); } - }, - ); - } + } + }, + ); // #Pangea // setState(() { // showEmojiPicker = false; diff --git a/lib/widgets/future_loading_dialog.dart b/lib/widgets/future_loading_dialog.dart index 47aa5ad57..a5ac91272 100644 --- a/lib/widgets/future_loading_dialog.dart +++ b/lib/widgets/future_loading_dialog.dart @@ -14,7 +14,8 @@ import 'package:fluffychat/widgets/adaptive_dialogs/adaptive_dialog_action.dart' /// null. Future> showFutureLoadingDialog({ required BuildContext context, - required Future Function() future, + Future Function()? future, + Future Function(void Function(double?) setProgress)? futureWithProgress, String? title, String? backLabel, bool barrierDismissible = false, @@ -28,7 +29,10 @@ Future> showFutureLoadingDialog({ VoidCallback? onDismiss, // Pangea# }) async { - final futureExec = future(); + assert(future != null || futureWithProgress != null); + final onProgressStream = StreamController(); + final futureExec = + futureWithProgress?.call(onProgressStream.add) ?? future!(); final resultFuture = ResultFuture(futureExec); if (delay) { @@ -44,38 +48,28 @@ Future> showFutureLoadingDialog({ } } - // #Pangea - if (context.mounted) { - // Pangea# - final result = await showAdaptiveDialog>( - context: context, - barrierDismissible: barrierDismissible, - builder: (BuildContext context) => LoadingDialog( - future: futureExec, - title: title, - backLabel: backLabel, - exceptionContext: exceptionContext, - // #Pangea - showError: showError, - onError: onError, - onDismiss: onDismiss, - onSuccess: onSuccess, - // Pangea# - ), - ); - return result ?? - Result.error( - Exception('FutureDialog canceled'), - StackTrace.current, - ); - } - - // #Pangea - return Result.error( - Exception('FutureDialog canceled'), - StackTrace.current, + final result = await showAdaptiveDialog>( + context: context, + barrierDismissible: barrierDismissible, + builder: (BuildContext context) => LoadingDialog( + future: futureExec, + title: title, + backLabel: backLabel, + exceptionContext: exceptionContext, + onProgressStream: onProgressStream.stream, + // #Pangea + showError: showError, + onError: onError, + onDismiss: onDismiss, + onSuccess: onSuccess, + // Pangea# + ), ); - // Pangea# + return result ?? + Result.error( + Exception('FutureDialog canceled'), + StackTrace.current, + ); } class LoadingDialog extends StatefulWidget { @@ -83,6 +77,7 @@ class LoadingDialog extends StatefulWidget { final String? backLabel; final Future future; final ExceptionContext? exceptionContext; + final Stream onProgressStream; // #Pangea final bool Function(Object)? showError; final Object? Function(Object, StackTrace?)? onError; @@ -96,6 +91,7 @@ class LoadingDialog extends StatefulWidget { this.title, this.backLabel, this.exceptionContext, + required this.onProgressStream, // #Pangea this.showError, this.onError, @@ -187,7 +183,13 @@ class LoadingDialogState extends State { // if (exception == null) ...[ if (exception == null && _successMessage == null) ...[ // Pangea# - const CircularProgressIndicator.adaptive(), + StreamBuilder( + stream: widget.onProgressStream, + builder: (context, snapshot) => + CircularProgressIndicator.adaptive( + value: snapshot.data, + ), + ), const SizedBox(width: 20), ], Expanded(