123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130 |
- // 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.runes.any((int rune) {
- var character = String.fromCharCode(rune);
- return character.toUpperCase() == character &&
- character.toLowerCase() != character;
- });
- }
- }
- class LowercaseValidationRule extends ValidationRule {
- @override
- String get name => translate('lowercase');
- @override
- bool validate(String value) {
- return value.runes.any((int rune) {
- var character = String.fromCharCode(rune);
- return character.toLowerCase() == character &&
- character.toUpperCase() != character;
- });
- }
- }
- 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;
- }
- }
- }
|