Skip to content

Commit f1a54b9

Browse files
committed
feat: implement input secure mode
1 parent e27e606 commit f1a54b9

File tree

1 file changed

+19
-5
lines changed

1 file changed

+19
-5
lines changed

lib/src/components/input.dart

Lines changed: 19 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ import 'package:commander_ui/src/result.dart';
1111
class Input with Tools implements Component<Result<String>> {
1212
final String answer;
1313
final String? placeholder;
14+
final bool secure;
1415
late final String exitMessage;
1516
String value = '';
1617
String? errorMessage;
@@ -21,10 +22,12 @@ class Input with Tools implements Component<Result<String>> {
2122
Input({
2223
required this.answer,
2324
this.placeholder,
25+
this.secure = false,
2426
Result Function(String value)? validate,
2527
String? exitMessage,
2628
}) {
27-
this.exitMessage = exitMessage ?? '${AsciiColors.red('✘')} Operation canceled by user';
29+
this.exitMessage =
30+
exitMessage ?? '${AsciiColors.red('✘')} Operation canceled by user';
2831
this.validate = validate ?? (value) => Ok(null);
2932
}
3033

@@ -53,13 +56,19 @@ class Input with Tools implements Component<Result<String>> {
5356
return;
5457
}
5558

56-
restoreCursorPosition();
59+
saveCursorPosition();
5760
clearFromCursorToEnd();
61+
restoreCursorPosition();
5862
showInput();
5963

6064
dispose();
6165

62-
stdout.writeln('${AsciiColors.green('✔')} $answer · ${AsciiColors.lightGreen(value)}');
66+
final computedValue = secure
67+
? AsciiColors.dim(generateValue())
68+
: AsciiColors.lightGreen(generateValue());
69+
70+
stdout.writeln('${AsciiColors.green('✔')} $answer · $computedValue}');
71+
6372
saveCursorPosition();
6473
_completer.complete(Ok(value));
6574
}
@@ -79,7 +88,8 @@ class Input with Tools implements Component<Result<String>> {
7988
errorMessage = null;
8089
if (RegExp(r'^[\p{L}\p{N}\p{P}\s\x7F]*$', unicode: true).hasMatch(key)) {
8190
if (key == '\x7F' && value.isNotEmpty) {
82-
value = value.substring(0, value.length - 1); // Supprimer le dernier caractère
91+
value = value.substring(
92+
0, value.length - 1); // Supprimer le dernier caractère
8393
} else if (key != '\x7F') {
8494
value = value + key; // Ajouter le caractère tapé
8595
}
@@ -88,10 +98,14 @@ class Input with Tools implements Component<Result<String>> {
8898
}
8999
}
90100

101+
String generateValue() =>
102+
secure ? value.replaceAll(RegExp(r'.'), '*') : value;
103+
91104
void render() async {
92105
final buffer = StringBuffer();
93106

94-
buffer.writeln('${AsciiColors.yellow('?')} $answer : ${AsciiColors.dim(value)}');
107+
buffer.writeln(
108+
'${AsciiColors.yellow('?')} $answer : ${AsciiColors.dim(generateValue())}');
95109
if (errorMessage != null) {
96110
buffer.writeln(AsciiColors.lightRed(errorMessage!));
97111
}

0 commit comments

Comments
 (0)