/* 
 * This file is part of Stack Wallet.
 * 
 * Copyright (c) 2023 Cypher Stack
 * All Rights Reserved.
 * The code is distributed under GPLv3 license, see LICENSE file for details.
 * Generated by Cypher Stack on 2023-05-26
 *
 */

import 'dart:async';

import 'package:flutter/material.dart';
import 'package:stackwallet/themes/stack_colors.dart';
import 'package:stackwallet/utilities/logger.dart';
import 'package:stackwallet/widgets/custom_loading_overlay.dart';

Future<T?> showLoading<T>({
  required Future<T> whileFuture,
  required BuildContext context,
  required String message,
  String? subMessage,
  bool isDesktop = false,
  bool opaqueBG = false,
  void Function(Exception)? onException,
}) async {
  unawaited(
    showDialog<void>(
      context: context,
      barrierDismissible: false,
      builder: (_) => WillPopScope(
        onWillPop: () async => false,
        child: Container(
          color: Theme.of(context)
              .extension<StackColors>()!
              .overlay
              .withOpacity(opaqueBG ? 1.0 : 0.6),
          child: CustomLoadingOverlay(
            message: message,
            subMessage: subMessage,
            eventBus: null,
          ),
        ),
      ),
    ),
  );

  Exception? ex;
  T? result;

  try {
    result = await whileFuture;
  } catch (e, s) {
    Logging.instance.log(
      "showLoading caught: $e\n$s",
      level: LogLevel.Warning,
    );
    ex = e is Exception ? e : Exception(e.toString());
  }

  if (context.mounted) {
    Navigator.of(context, rootNavigator: isDesktop).pop();
    if (ex != null) {
      onException?.call(ex);
    }
  }

  return result;
}