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; | ||
|  |     } | ||
|  |   } | ||
|  | } |