submit<T> method

Future<void> submit<T>([
  1. T? pModel
])

Submits the form with optional model data.

  • pModel: Optional model data to submit.

Implementation

Future<void> submit<T>([T? pModel]) async {
  if ((state as AbstractFormBaseState).isSubmitting) {
    return;
  }

  final model =
      pModel ??
      (state is AbstractFormBasicState
          ? (state as AbstractFormBasicState).model
          : null);
  final isValid = state is AbstractFormState
      ? (state as AbstractFormState).modelValidator?.validate(model) ?? false
      : true;

  if (!isValid) {
    (state as AbstractFormState).autovalidate = true;
    updateStatus(FormResultStatus.validationError);
    await Future.delayed(const Duration(milliseconds: 100));
    updateStatus(FormResultStatus.initialized);
  } else {
    state.formResultStatus = FormResultStatus.submitting;
    if (state is AbstractFormBasicState) {
      (state as AbstractFormBasicState).model = model;
    }
    updateState(state.copyWith());

    final result = model != null
        ? await onSubmit(model)
        : await onSubmitEmpty();

    if (result.isSuccess) {
      await onSubmitSuccess(result);
      success();
    } else {
      if (result.isConnectionError) {
        try {
          final localResult = model != null
              ? await onSubmitLocal(model)
              : await onSubmitEmptyLocal();

          if (localResult.isLocalSuccess) {
            await onSubmitLocalSuccess(result);
          } else {
            await onSubmitLocalError(result);
          }
        } catch (e) {
          model != null
              ? await onConnectionSubmitError(result, model)
              : await onConnectionSubmitEmptyError(result);
        }
      } else {
        await onSubmitError(result);
      }
    }
  }
}