Skip to content

Commit

Permalink
refactor: Input formatter types are reduced to basic types (deny-allo…
Browse files Browse the repository at this point in the history
…w) and updated example jsons
  • Loading branch information
i-asimkhan committed Apr 13, 2023
1 parent 3f4853c commit 36ab66c
Show file tree
Hide file tree
Showing 6 changed files with 20 additions and 102 deletions.
8 changes: 4 additions & 4 deletions examples/mirai_gallery/assets/json/text_field_example.json
Original file line number Diff line number Diff line change
Expand Up @@ -83,7 +83,8 @@
},
"inputFormatters": [
{
"type": "digitsOnly"
"type": "deny",
"rule": "[a-zA-Z]"
}
],
"readOnly": false,
Expand Down Expand Up @@ -144,9 +145,8 @@
},
"inputFormatters": [
{
"type": "masked",
"rule": "XXXX-XXXX-XXXX-XXXX",
"value": "-"
"type": "deny",
"rule": "[a-zA-Z]"
}
],
"readOnly": false,
Expand Down

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
import 'package:flutter/material.dart';
import 'package:mirai/src/framework/framework.dart';
import 'package:mirai/src/parsers/mirai_input_decoration/mirai_input_decoration.dart';
import 'package:mirai/src/parsers/mirai_input_formatters/mirai_input_formatter.dart';
import 'package:mirai/src/parsers/mirai_text_field/mirai_text_field.dart';
import 'package:mirai/src/parsers/mirai_text_style/mirai_text_style.dart';
import 'package:mirai/src/utils/color_utils.dart';
import 'package:mirai/src/utils/input_formatters.dart';
import 'package:mirai/src/utils/widget_type.dart';

class MiraiTextFieldParser extends MiraiParser<MiraiTextField> {
Expand Down Expand Up @@ -52,9 +52,10 @@ class MiraiTextFieldParser extends MiraiParser<MiraiTextField> {
cursorColor: model.cursorColor?.toColor,
style: model.style?.parse,
decoration: model.decoration?.parse(context),
inputFormatters: model.inputFormatters.map((formatter) {
return InputFormatters.format(formatter);
}).toList(),
inputFormatters: model.inputFormatters
.map((MiraiInputFormatter formatter) =>
formatter.type.format(formatter.rule ?? ""))
.toList(),
);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,10 +2,10 @@ import 'package:flutter/material.dart';
import 'package:mirai/src/framework/framework.dart';
import 'package:mirai/src/parsers/mirai_edge_insets/mirai_edge_insets.dart';
import 'package:mirai/src/parsers/mirai_input_decoration/mirai_input_decoration.dart';
import 'package:mirai/src/parsers/mirai_input_formatters/mirai_input_formatter.dart';
import 'package:mirai/src/parsers/mirai_text_form_field/mirai_text_form_field.dart';
import 'package:mirai/src/parsers/mirai_text_style/mirai_text_style.dart';
import 'package:mirai/src/utils/color_utils.dart';
import 'package:mirai/src/utils/input_formatters.dart';
import 'package:mirai/src/utils/widget_type.dart';

class MiraiTextFormFieldParser extends MiraiParser<MiraiTextFormField> {
Expand Down Expand Up @@ -60,9 +60,10 @@ class MiraiTextFormFieldParser extends MiraiParser<MiraiTextFormField> {
cursorColor: model.cursorColor?.toColor,
style: model.style?.parse,
decoration: model.decoration.parse(context),
inputFormatters: model.inputFormatters.map((formatter) {
return InputFormatters.format(formatter);
}).toList(),
inputFormatters: model.inputFormatters
.map((MiraiInputFormatter formatter) =>
formatter.type.format(formatter.rule ?? ""))
.toList(),
);
}
}
1 change: 1 addition & 0 deletions packages/mirai/lib/src/parsers/parsers.dart
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@ export 'package:mirai/src/parsers/mirai_icon/mirai_icon.dart';
export 'package:mirai/src/parsers/mirai_icon_button/mirai_icon_button.dart';
export 'package:mirai/src/parsers/mirai_image/mirai_image.dart';
export 'package:mirai/src/parsers/mirai_input_decoration/mirai_input_decoration.dart';
export 'package:mirai/src/parsers/mirai_input_formatters/mirai_input_formatter.dart';
export 'package:mirai/src/parsers/mirai_list_tile/mirai_list_tile.dart';
export 'package:mirai/src/parsers/mirai_list_view/mirai_list_view.dart';
export 'package:mirai/src/parsers/mirai_navigation_bar_item/mirai_bottom_navigation_bar_item.dart';
Expand Down
92 changes: 5 additions & 87 deletions packages/mirai/lib/src/utils/input_formatters.dart
Original file line number Diff line number Diff line change
@@ -1,102 +1,20 @@
import 'package:flutter/services.dart';
import 'package:mirai/src/parsers/mirai_input_formatters/mirai_input_formatter.dart';

enum InputFormatterType {
digitsOnly,
singleLineFormatter,
allow,
deny,
masked,
}
deny;

class InputFormatters {
static TextInputFormatter format(MiraiInputFormatter inputFormatter) {
TextInputFormatter format(String rule) {
try {
switch (inputFormatter.type) {
case InputFormatterType.digitsOnly:
return FilteringTextInputFormatter.digitsOnly;

case InputFormatterType.singleLineFormatter:
return FilteringTextInputFormatter.singleLineFormatter;

switch (this) {
case InputFormatterType.allow:
return FilteringTextInputFormatter.allow(
RegExp(inputFormatter.rule ?? ""));
return FilteringTextInputFormatter.allow(RegExp(rule));

case InputFormatterType.deny:
return FilteringTextInputFormatter.allow(
RegExp(inputFormatter.rule ?? ""));

case InputFormatterType.masked:
return MaskedTextInputFormatter(
mask: inputFormatter.rule ?? "",
separator: inputFormatter.value ?? "-",
);
return FilteringTextInputFormatter.deny(RegExp(rule));
}
} catch (_) {
return FilteringTextInputFormatter.allow(RegExp(''));
}
}
}

class CardNumberFormatter extends TextInputFormatter {
@override
TextEditingValue formatEditUpdate(
TextEditingValue oldValue,
TextEditingValue newValue,
) {
var inputText = newValue.text;

if (newValue.selection.baseOffset == 0) {
return newValue;
}

var bufferString = StringBuffer();
for (int i = 0; i < inputText.length; i++) {
bufferString.write(inputText[i]);
var nonZeroIndexValue = i + 1;
if (nonZeroIndexValue % 4 == 0 && nonZeroIndexValue != inputText.length) {
bufferString.write(' ');
}
}

var string = bufferString.toString();
return newValue.copyWith(
text: string,
selection: TextSelection.collapsed(
offset: string.length,
),
);
}
}

class MaskedTextInputFormatter extends TextInputFormatter {
final String mask;
final String separator;

MaskedTextInputFormatter({
required this.mask,
required this.separator,
});

@override
TextEditingValue formatEditUpdate(
TextEditingValue oldValue, TextEditingValue newValue) {
if (newValue.text.isNotEmpty) {
if (newValue.text.length > oldValue.text.length) {
if (newValue.text.length > mask.length) return oldValue;
if (newValue.text.length < mask.length &&
mask[newValue.text.length - 1] == separator) {
return TextEditingValue(
text:
'${oldValue.text}$separator${newValue.text.substring(newValue.text.length - 1)}',
selection: TextSelection.collapsed(
offset: newValue.selection.end + 1,
),
);
}
}
}
return newValue;
}
}

0 comments on commit 36ab66c

Please sign in to comment.