1import { UnavailabilityError } from '@unimodules/core';
2import invariant from 'invariant';
3
4import ExpoLocalAuthentication from './ExpoLocalAuthentication';
5import {
6  LocalAuthenticationOptions,
7  AuthenticationType,
8  LocalAuthenticationResult,
9  SecurityLevel,
10} from './LocalAuthentication.types';
11
12export { LocalAuthenticationOptions, AuthenticationType, LocalAuthenticationResult, SecurityLevel };
13
14export async function hasHardwareAsync(): Promise<boolean> {
15  if (!ExpoLocalAuthentication.hasHardwareAsync) {
16    throw new UnavailabilityError('expo-local-authentication', 'hasHardwareAsync');
17  }
18  return await ExpoLocalAuthentication.hasHardwareAsync();
19}
20
21export async function supportedAuthenticationTypesAsync(): Promise<AuthenticationType[]> {
22  if (!ExpoLocalAuthentication.supportedAuthenticationTypesAsync) {
23    throw new UnavailabilityError('expo-local-authentication', 'supportedAuthenticationTypesAsync');
24  }
25  return await ExpoLocalAuthentication.supportedAuthenticationTypesAsync();
26}
27
28export async function isEnrolledAsync(): Promise<boolean> {
29  if (!ExpoLocalAuthentication.isEnrolledAsync) {
30    throw new UnavailabilityError('expo-local-authentication', 'isEnrolledAsync');
31  }
32  return await ExpoLocalAuthentication.isEnrolledAsync();
33}
34
35export async function getEnrolledLevelAsync(): Promise<SecurityLevel> {
36  if (!ExpoLocalAuthentication.getEnrolledLevelAsync) {
37    throw new UnavailabilityError('expo-local-authentication', 'getEnrolledLevelAsync');
38  }
39  return await ExpoLocalAuthentication.getEnrolledLevelAsync();
40}
41
42export async function authenticateAsync(
43  options: LocalAuthenticationOptions = {}
44): Promise<LocalAuthenticationResult> {
45  if (!ExpoLocalAuthentication.authenticateAsync) {
46    throw new UnavailabilityError('expo-local-authentication', 'authenticateAsync');
47  }
48
49  if (options.hasOwnProperty('promptMessage')) {
50    invariant(
51      typeof options.promptMessage === 'string' && options.promptMessage.length,
52      'LocalAuthentication.authenticateAsync : `options.promptMessage` must be a non-empty string.'
53    );
54  }
55
56  const promptMessage = options.promptMessage || 'Authenticate';
57  const result = await ExpoLocalAuthentication.authenticateAsync({ ...options, promptMessage });
58
59  if (result.warning) {
60    console.warn(result.warning);
61  }
62  return result;
63}
64
65export async function cancelAuthenticate(): Promise<void> {
66  if (!ExpoLocalAuthentication.cancelAuthenticate) {
67    throw new UnavailabilityError('expo-local-authentication', 'cancelAuthenticate');
68  }
69  await ExpoLocalAuthentication.cancelAuthenticate();
70}
71