formSubmitDialog<T> function

Future<T?> formSubmitDialog<T>({
  1. required BuildContext context,
  2. required Future<T> future,
  3. bool? fullDialog = false,
  4. String? errorMessage = "An unexpected error occurred and the request failed, please try again",
  5. String prompt = "Processing My Request",
  6. String? successMessage,
  7. VoidCallback? action,
  8. bool forceErrorMessage = false,
})

Implementation

Future<T?> formSubmitDialog<T>({
  required BuildContext context,
  required Future<T> future,
  bool? fullDialog = false,
  String? errorMessage =
      "An unexpected error occurred and the request failed, please try again",
  String prompt = "Processing My Request",
  String? successMessage,
  VoidCallback? action,
  bool forceErrorMessage = false,
}) async {
  ValueNotifier<FutureState> isResolved = ValueNotifier(
    FutureState.loading,
  );
  final T? result = await showGeneralDialog<T>(
    context: context,
    barrierDismissible: false,
    pageBuilder: (context, ____, _______) {
      return PopScope(
        child: ValueListenableBuilder(
          valueListenable: isResolved,
          builder: (context, FutureState val, _) {
            return CredioDialogScaffold(
              future: future,
              padded: !fullDialog!,
              showClose: isResolved.value != FutureState.loading,
              child: FutureBuilder(
                future: future,
                builder: (context, res) {
                  if (res.hasData) {
                    WidgetsBinding.instance.addPostFrameCallback(
                      (_) {
                        Timer(
                          Duration(
                              milliseconds:
                                  successMessage == null ? 500 : 3000),
                          () {
                            Navigator.of(context).pop(res.data);
                          },
                        );
                      },
                    );
                    if (successMessage == null) {
                      return DialogMessage(
                        message: "",
                        fullDialog: fullDialog,
                        messageType: MessageType.Pending,
                      );
                    }
                    return DialogMessage(
                      message: successMessage,
                      messageType: MessageType.Success,
                    );
                  }

                  if (res.hasError) {
                    if (res.error is Map &&
                        (res.error! as Map)["statusCode"] == 301) {
                      WidgetsBinding.instance.addPostFrameCallback(
                        (_) {
                          isResolved.value = FutureState.complete;
                        },
                      );

                      return DialogMessage.action(
                        message: parseError(res.error, errorMessage),
                        messageType: MessageType.Warning,
                        route: "",
                        action: action ?? () {},
                      );
                    }
                    WidgetsBinding.instance.addPostFrameCallback(
                      (_) {
                        isResolved.value = FutureState.complete;
                      },
                    );

                    return DialogMessage(
                      message: parseError(res.error, errorMessage),
                      messageType: MessageType.Error,
                    );
                  }
                  return DialogMessage(
                    message: prompt,
                    messageType: MessageType.Pending,
                  );
                },
              ),
            );
          },
        ),
        onPopInvoked: (value) async => isResolved.value == FutureState.complete,
      );
    },
  );
  return result;
}