122 lines
		
	
	
		
			3.0 KiB
		
	
	
	
		
			Dart
		
	
	
	
	
	
		
		
			
		
	
	
			122 lines
		
	
	
		
			3.0 KiB
		
	
	
	
		
			Dart
		
	
	
	
	
	
| 
								 | 
							
								// https://github.com/rodrigobastosv/fancy_password_field
							 | 
						||
| 
								 | 
							
								import 'package:flutter/material.dart';
							 | 
						||
| 
								 | 
							
								import 'package:flutter_hbb/common.dart';
							 | 
						||
| 
								 | 
							
								import 'package:get/get.dart';
							 | 
						||
| 
								 | 
							
								import 'package:password_strength/password_strength.dart';
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								abstract class ValidationRule {
							 | 
						||
| 
								 | 
							
								  String get name;
							 | 
						||
| 
								 | 
							
								  bool validate(String value);
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								class UppercaseValidationRule extends ValidationRule {
							 | 
						||
| 
								 | 
							
								  @override
							 | 
						||
| 
								 | 
							
								  String get name => translate('uppercase');
							 | 
						||
| 
								 | 
							
								  @override
							 | 
						||
| 
								 | 
							
								  bool validate(String value) {
							 | 
						||
| 
								 | 
							
								    return value.contains(RegExp(r'[A-Z]'));
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								class LowercaseValidationRule extends ValidationRule {
							 | 
						||
| 
								 | 
							
								  @override
							 | 
						||
| 
								 | 
							
								  String get name => translate('lowercase');
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  @override
							 | 
						||
| 
								 | 
							
								  bool validate(String value) {
							 | 
						||
| 
								 | 
							
								    return value.contains(RegExp(r'[a-z]'));
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								class DigitValidationRule extends ValidationRule {
							 | 
						||
| 
								 | 
							
								  @override
							 | 
						||
| 
								 | 
							
								  String get name => translate('digit');
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  @override
							 | 
						||
| 
								 | 
							
								  bool validate(String value) {
							 | 
						||
| 
								 | 
							
								    return value.contains(RegExp(r'[0-9]'));
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								class SpecialCharacterValidationRule extends ValidationRule {
							 | 
						||
| 
								 | 
							
								  @override
							 | 
						||
| 
								 | 
							
								  String get name => translate('special character');
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  @override
							 | 
						||
| 
								 | 
							
								  bool validate(String value) {
							 | 
						||
| 
								 | 
							
								    return value.contains(RegExp(r'[!@#$%^&*(),.?":{}|<>]'));
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								class MinCharactersValidationRule extends ValidationRule {
							 | 
						||
| 
								 | 
							
								  final int _numberOfCharacters;
							 | 
						||
| 
								 | 
							
								  MinCharactersValidationRule(this._numberOfCharacters);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  @override
							 | 
						||
| 
								 | 
							
								  String get name => translate('length>=$_numberOfCharacters');
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  @override
							 | 
						||
| 
								 | 
							
								  bool validate(String value) {
							 | 
						||
| 
								 | 
							
								    return value.length >= _numberOfCharacters;
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								class PasswordStrengthIndicator extends StatelessWidget {
							 | 
						||
| 
								 | 
							
								  final RxString password;
							 | 
						||
| 
								 | 
							
								  final double weakMedium = 0.33;
							 | 
						||
| 
								 | 
							
								  final double mediumStrong = 0.67;
							 | 
						||
| 
								 | 
							
								  const PasswordStrengthIndicator({Key? key, required this.password})
							 | 
						||
| 
								 | 
							
								      : super(key: key);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  @override
							 | 
						||
| 
								 | 
							
								  Widget build(BuildContext context) {
							 | 
						||
| 
								 | 
							
								    return Obx(() {
							 | 
						||
| 
								 | 
							
								      var strength = estimatePasswordStrength(password.value);
							 | 
						||
| 
								 | 
							
								      return Row(
							 | 
						||
| 
								 | 
							
								        children: [
							 | 
						||
| 
								 | 
							
								          Expanded(
							 | 
						||
| 
								 | 
							
								              child: _indicator(
							 | 
						||
| 
								 | 
							
								                  password.isEmpty ? Colors.grey : _getColor(strength))),
							 | 
						||
| 
								 | 
							
								          Expanded(
							 | 
						||
| 
								 | 
							
								              child: _indicator(password.isEmpty || strength < weakMedium
							 | 
						||
| 
								 | 
							
								                  ? Colors.grey
							 | 
						||
| 
								 | 
							
								                  : _getColor(strength))),
							 | 
						||
| 
								 | 
							
								          Expanded(
							 | 
						||
| 
								 | 
							
								              child: _indicator(password.isEmpty || strength < mediumStrong
							 | 
						||
| 
								 | 
							
								                  ? Colors.grey
							 | 
						||
| 
								 | 
							
								                  : _getColor(strength))),
							 | 
						||
| 
								 | 
							
								          Text(password.isEmpty ? '' : translate(_getLabel(strength)))
							 | 
						||
| 
								 | 
							
								              .marginOnly(left: password.isEmpty ? 0 : 8),
							 | 
						||
| 
								 | 
							
								        ],
							 | 
						||
| 
								 | 
							
								      );
							 | 
						||
| 
								 | 
							
								    });
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  Widget _indicator(Color color) {
							 | 
						||
| 
								 | 
							
								    return Container(
							 | 
						||
| 
								 | 
							
								      height: 8,
							 | 
						||
| 
								 | 
							
								      color: color,
							 | 
						||
| 
								 | 
							
								    );
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  String _getLabel(double strength) {
							 | 
						||
| 
								 | 
							
								    if (strength < weakMedium) {
							 | 
						||
| 
								 | 
							
								      return 'Weak';
							 | 
						||
| 
								 | 
							
								    } else if (strength < mediumStrong) {
							 | 
						||
| 
								 | 
							
								      return 'Medium';
							 | 
						||
| 
								 | 
							
								    } else {
							 | 
						||
| 
								 | 
							
								      return 'Strong';
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  Color _getColor(double strength) {
							 | 
						||
| 
								 | 
							
								    if (strength < weakMedium) {
							 | 
						||
| 
								 | 
							
								      return Colors.yellow;
							 | 
						||
| 
								 | 
							
								    } else if (strength < mediumStrong) {
							 | 
						||
| 
								 | 
							
								      return Colors.blue;
							 | 
						||
| 
								 | 
							
								    } else {
							 | 
						||
| 
								 | 
							
								      return Colors.green;
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								}
							 |