showAsyncProgressKDialog<T> function

Future<T?> showAsyncProgressKDialog<T>(
  1. BuildContext context, {
  2. Future<void> validateBeforeProcess()?,
  3. required Future<T> doProcess(),
  4. void onSuccess(
    1. T value
    )?,
  5. void onError(
    1. String errMessage
    )?,
  6. bool retryable = false,
  7. bool confirmationRequired = false,
  8. String? confirmationTitle,
  9. String? confirmationMessage,
  10. bool showSuccessSnackBar = false,
  11. String? successMessage,
  12. String? errorAcceptText,
  13. String? errorRetryText,
  14. String? loadingMessage,
  15. String? bottomErrorAlertTitle,
  16. String? validationErrorTitle,
  17. String? validationConfirmText,
  18. String? validationCancelText,
})

Implementation

Future<T?> showAsyncProgressKDialog<T>(
  BuildContext context, {
  Future<void> Function()? validateBeforeProcess,
  required Future<T> Function() doProcess,
  void Function(T value)? onSuccess,
  void Function(String errMessage)? onError,
  bool retryable = false,
  bool confirmationRequired = false,
  String? confirmationTitle,
  String? confirmationMessage,
  bool showSuccessSnackBar = false,
  String? successMessage,
  String? errorAcceptText,
  String? errorRetryText,
  String? loadingMessage,
  String? bottomErrorAlertTitle,
  String? validationErrorTitle,
  String? validationConfirmText,
  String? validationCancelText,
}) async {
  confirmationMessage ??= strings.confirmationMessage;
  errorAcceptText ??= strings.acceptButtonText;
  errorRetryText ??= strings.errorRetryText;
  validationConfirmText ??= strings.confirmButtonText;
  validationCancelText ??= strings.cancelButtonText;

  if (confirmationRequired) {
    final confirmed = await showConfirmationKDialog(
      context,
      title: confirmationTitle,
      message: confirmationMessage,
    );
    if (!confirmed) return null;
  }

  if (validateBeforeProcess != null) {
    if (!context.mounted) return null;

    final closeloader = await _showLoading(
      context,
      loadingMessage: loadingMessage,
    );

    Object? validationError;
    try {
      await validateBeforeProcess();
    } catch (err) {
      validationError = err;
    } finally {
      closeloader();
    }

    if (validationError != null) {
      if (!context.mounted) return null;

      final confirmed = await showConfirmationKDialog(
        context,
        title: validationErrorTitle,
        message: validationError.toString(),
        acceptText: validationConfirmText,
        cancelText: validationCancelText,
      );
      if (!confirmed) return null;
    }
  }

  if (context.mounted) {
    final closeloader = await _showLoading(
      context,
      loadingMessage: loadingMessage,
    );
    T? results;
    Object? processError;
    try {
      results = await doProcess();
    } catch (err) {
      processError = err;
    } finally {
      closeloader();
    }

    if (processError == null) {
      if (onSuccess != null && results != null) onSuccess(results);

      if (context.mounted && (showSuccessSnackBar || successMessage != null)) {
        ScaffoldMessenger.of(context)
            .showSnackBar(_snackBar(message: successMessage));
      }
    } else {
      bool? retry;
      if (context.mounted) {
        retry = await showBottomAlertKDialog(
          title: bottomErrorAlertTitle,
          context,
          message: processError.toString(),
          retryable: retryable,
          acceptText: errorAcceptText,
          retryText: errorRetryText,
          errorSound: true,
        );
      }

      if ((retry ?? false) && context.mounted) {
        return await showAsyncProgressKDialog(
          context,
          doProcess: doProcess,
          onError: onError,
          onSuccess: onSuccess,
          retryable: retryable,
          showSuccessSnackBar: showSuccessSnackBar,
          successMessage: successMessage,
          errorAcceptText: errorAcceptText,
          errorRetryText: errorRetryText,
          loadingMessage: loadingMessage,
          bottomErrorAlertTitle: bottomErrorAlertTitle,
        );
      }

      if (onError != null) onError(processError.toString());
    }
    return results;
  }

  return null;
}