formatter method

Implementation

List<TextInputFormatter>? formatter(OwlnextInputState state) {
  List<TextInputFormatter> arr = [];

  if (state.widget.type == TextInputSubType.amount) {
    arr = [
      FilteringTextInputFormatter.allow(RegExp(r"[0-9,.-]")),
      TextInputFormatter.withFunction((oldValue, newValue) {
        try {
          String text = newValue.text;

          if (text.contains(',') == true) {
            text = text.replaceAll(',', '.');
          }

          if (text.isNotEmpty && state.widget.amountMaxLimit != null && double.parse(text) > state.widget.amountMaxLimit!) {
            return oldValue;
          }

          int limit = 2;

          if (state.widget.decimalsMaxLimit != null) {
            limit = state.widget.decimalsMaxLimit!;
          }

          List<String> splitted = text.split('.');

          if (splitted.length >= 2 && splitted[1].length > limit) {
            return oldValue;
          }

          if (text.isNotEmpty && text[0] != "-") {
            double.parse(text);
          }

          if (text.contains('.')) {
            TextEditingValue finalController = newValue.copyWith(
              text: newValue.text.replaceAll('.', ',')
            );

            return finalController;
          }
          return newValue;
        } catch (e) {
          log(e.toString());
        }
        return oldValue;
      }),
    ];
  }

  if (state.widget.type == TextInputSubType.numbers) {
    arr = [
      FilteringTextInputFormatter.allow(RegExp(r"[0-9]")),
      TextInputFormatter.withFunction((oldValue, newValue) {
        try {
          final text = newValue.text;

          if (text.isNotEmpty) {
            int.parse(text);
          } else {
            return newValue;
          }

          if (state.widget.numberMaxLimit != null && int.parse(newValue.text) > int.parse(state.widget.numberMaxLimit.toString())) {
            return oldValue;
          }

          if (state.widget.numberMinLimit != null && int.parse(newValue.text) < int.parse(state.widget.numberMinLimit.toString())) {
            return oldValue;
          }

          return newValue;
        } catch (e) {
          log(e.toString());
        }
        return oldValue;
      }),
    ];
  }

  if (state.widget.type == TextInputSubType.date) {
    List<TextInputFormatter> temp = [];

    try {
      temp = [
        FilteringTextInputFormatter.allow(RegExp(r"[0-9/]")),
        LengthLimitingTextInputFormatter(10),
        DateFormatter(),
      ];
    } catch (e) {
      temp = [
        FilteringTextInputFormatter.allow(RegExp(r"[0-9/]")),
        LengthLimitingTextInputFormatter(10)
      ];
    }

    arr = temp;
  }

  if (state.widget.type == TextInputSubType.shortDate) {
    List<TextInputFormatter> temp = [];

    try {
      temp = [
        FilteringTextInputFormatter.allow(RegExp(r"[0-9/]")),
        LengthLimitingTextInputFormatter(5),
        ShortDateFormatter(),
      ];
    } catch (e) {
      temp = [
        FilteringTextInputFormatter.allow(RegExp(r"[0-9/]")),
        LengthLimitingTextInputFormatter(5)
      ];
    }

    arr = temp;
  }

  if (state.widget.type == TextInputSubType.hours) {
    List<TextInputFormatter> temp = [];

    try {
      temp = [
        FilteringTextInputFormatter.allow(RegExp(r"[0-9:]")),
        LengthLimitingTextInputFormatter(10),
        HoursFormatter(),
      ];
    } catch (e) {
      temp = [
        FilteringTextInputFormatter.allow(RegExp(r"[0-9:]")),
        LengthLimitingTextInputFormatter(10)
      ];
    }

    arr = temp;
  }

  if (state.widget.charsLimit != null) {
    arr.add(
      LengthLimitingTextInputFormatter(state.widget.charsLimit)
    );
  }

  if (state.widget.customRegex != null) {
    arr = [
      FilteringTextInputFormatter.allow(state.widget.customRegex!)
    ];
  }

  return arr;
}