biometrics function

Future<bool> biometrics(
  1. BuildContext context,
  2. {required bool redirect}
)

Implementation

Future<bool> biometrics(BuildContext context, {required bool redirect}) async {
  bool didAuthenticate = false;

  final LocalAuthentication localAuthentication = LocalAuthentication();

  didAuthenticate = await localAuthentication.canCheckBiometrics;

  final List<BiometricType> availableBiometrics =
      await localAuthentication.getAvailableBiometrics();

  try {
    didAuthenticate = await localAuthentication.authenticate(
      localizedReason: 'Por favor, autentícate para acceder a la aplicación',
      stickyAuth: true,
      biometricOnly: availableBiometrics.isNotEmpty,
      iOSAuthStrings: const IOSAuthMessages(
        cancelButton: 'Cancelar',
        goToSettingsButton: 'Ajustes',
        goToSettingsDescription:
            'La autenticación biométrica no está configurada en su dispositivo. Habilite Touch ID o Face ID en su teléfono.',
        lockOut:
            'La autenticación biométrica está deshabilitada. Bloquee y desbloquee su pantalla para habilitarla.',
      ),
      androidAuthStrings: const AndroidAuthMessages(
        biometricHint: 'Verifique su identidad',
        biometricNotRecognized: 'Huella no reconocida, intente de nuevo',
        biometricRequiredTitle: 'Biométrico requerido',
        biometricSuccess: 'Éxito',
        cancelButton: 'Cancelar',
        deviceCredentialsRequiredTitle:
            'Se requieren las credenciales del dispositivo',
        deviceCredentialsSetupDescription:
            'Se requieren las credenciales del dispositivo',
        goToSettingsButton: 'Ajustes',
        goToSettingsDescription:
            'La autenticación biométrica no está configurada en su dispositivo. Vaya a \'Configuración > Seguridad\' para agregar autenticación biométrica.',
        signInTitle: 'Autenticación requerida',
      ),
    );

    if (didAuthenticate && redirect) {
      Transitions(
        context: context,
        child: const HomePage(),
        removeUntil: true,
      );
    } else {
      if (redirect) {
        await showErrorDialog(
          context: context,
          text: const <String>[
            'No se pudo autenticar, por seguridad deberá iniciar sesión con correo y contraseña',
          ],
        );
      }
    }
  } on PlatformException catch (platformException) {
    switch (platformException.code) {
      case auth_error.lockedOut:
        //Indicates the API lock out due to too many attempts.
        await showErrorDialog(
          context: context,
          text: const <String>[
            'Se bloqueo esta función debido a que sobrepaso los intentos permitidos, por seguridad deberá iniciar sesión con correo y contraseña',
          ],
        );
        break;
      case auth_error.notAvailable:
        // Indicates the device does not have a Touch ID/fingerprint scanner.
        await showErrorDialog(
          context: context,
          text: const <String>[
            'Las funciones de seguridad no están habilitadas en su dispositivo',
          ],
        );
        break;
      case auth_error.notEnrolled:
        // Indicates the user has not enrolled any fingerprints on the device.
        await showErrorDialog(
          context: context,
          text: const <String>[
            'No hay datos biométricos registrados en este dispositivo',
          ],
        );
        break;
      case auth_error.otherOperatingSystem:
        //Indicates the device operating system is not iOS or Android.
        await showErrorDialog(
          context: context,
          text: const <String>[
            'El sistema operativo de su dispositivo no es compatible',
          ],
        );
        break;
      case auth_error.passcodeNotSet:
        //Indicates that the user has not yet configured a passcode (iOS) or PIN/pattern/password (Android) on the device.
        await showErrorDialog(
          context: context,
          text: const <String>[
            'Usted aún no configuro un PIN, patrón o contraseña de desbloqueo en su dispositivo',
            'Por motivos de seguridad, sus datos biométricos deben estar respaldados por uno de esos 3 métodos',
          ],
        );
        break;
      case auth_error.permanentlyLockedOut:
        //Indicates the API being disabled due to too many lock outs. Strong authentication like PIN/Pattern/Password is required to unlock.
        await showErrorDialog(
          context: context,
          text: const <String>[
            'Demasiados intentos desactivaron la autenticación con datos biométricos',
            'La autenticación fuerte es requerida mediante PIN, patrón o contraseña',
          ],
        );

        break;
      default:
        localAuthentication.stopAuthentication();

        await showErrorDialog(
          context: context,
          iconColor: ApplicationTheme.orange,
          text: <String>[
            'Se interrumpió el proceso de autenticación, por favor vuelva a intentarlo',
          ],
          buttonText: 'Reintentar',
          onTap: () {
            biometrics(
              context,
              redirect: true,
            );
            Navigator.pop(context);
          },
        );
    }
  }

  return didAuthenticate;
}