# react-native-bureauid-fraud-sdk

A React Native plugin for Bureau's One-Tap Login product. This SDK enables seamless authentication using mobile network operator verification.

## Installation

```sh
npm install react-native-bureauid-fraud-sdk
```

### iOS Setup

After installing, navigate to the iOS directory and install pods:

```sh
cd ios && pod install && cd ..
```

## API Reference

### `authenticate()`

Authenticates a user using Bureau's One-Tap Login.

**Parameters:**

- `clientId` (string): Bureau client ID
- `sessionId` (string): Unique session/correlation ID (UUID)
- `msisdn` (string): Mobile number with country code
- `env` (string): Environment - `'Production'` or `'Sandbox'` (default: `'Production'`)
- `timeOutInMs` (number): Timeout in milliseconds (default: `15000`)
- `pspCallbacks` (string[], optional): PSP callback keys for Initiate (**iOS** BureauSMV 1.2.1+). Ignored on Android

**Returns:** `Promise<AuthenticationResult>`

**AuthenticationResult Interface:**

```typescript
interface AuthenticationResult {
  readonly status: AuthenticationStatus; // Enum case name from SDK
  readonly message: string; // Associated value from enum
}
```

**AuthenticationStatus Enum:**

```typescript
type AuthenticationStatus =
  | 'networkAndOperatorMismatch'
  | 'authFailure'
  | 'networkNotSupported'
  | 'operatorNotSupported'
  | 'operatorAndNetworkNotSupported'
  | 'awaitingProviderAck'
  | 'authValidationError'
  | 'duplicateCorrelationId'
  | 'integrationFailure'
  | 'authStateExpired'
  | 'unauthorized'
  | 'countryNotSupported'
  | 'rateLimitExceeded'
  | 'internalServerError'
  | 'networkUnavailable'
  | 'wifiDetectedAndNoDataNetwork'
  | 'completed'
  | 'unknown';
```

## Usage Examples

### One-Tap Login (Production) - Synchronous

```javascript
import { authenticate } from 'react-native-bureauid-fraud-sdk';
import { v4 as uuidv4 } from 'uuid';

// Generate unique session ID
const sessionId = uuidv4();

// Authenticate user
authenticate(
  'your-client-id',
  sessionId,
  '919876543210', // Phone number with country code
  'Production',
  60000 // Timeout in milliseconds (60 seconds)
)
  .then((result) => {
    console.log('Status:', result.status); // e.g., "completed", "authFailure"
    console.log('Message:', result.message); // Associated value from enum
  })
  .catch((error) => {
    console.error('Authentication failed:', error);
  });
```

### One-Tap Login (Sandbox)

```javascript
import { authenticate } from 'react-native-bureauid-fraud-sdk';
import { v4 as uuidv4 } from 'uuid';

const sessionId = uuidv4();

authenticate('your-client-id', sessionId, '919876543210', 'Sandbox', 60000)
  .then((result) => {
    if (result.status === 'completed') {
      // Authentication completed successfully
      console.log('Authentication successful:', result.message);
    } else {
      // Authentication failed
      console.log('Authentication failed:', result.status, result.message);
    }
  })
  .catch((error) => {
    console.error('Error:', error);
  });
```

## Response Handling

### Authentication Result

The `authenticate()` function returns an `AuthenticationResult` object:

```javascript
{
  status: "completed",     // Enum case name from SDK
  message: "Completed"     // Associated value from enum
}
```

**Success Case:**

- `status: "completed"` - Authentication completed successfully
- `message: "Completed"` - Success message from SDK

**Error Cases:**

- `status: "authFailure"` - Authentication failed
- `status: "networkUnavailable"` - Network unavailable
- `status: "operatorNotSupported"` - Operator not supported
- `message: <error_message>` - Error message from SDK

All possible `status` values are defined in the `AuthenticationStatus` enum type.

## Notes

- **Session ID**: Always generate a unique session ID (UUID) for each authentication request
- **Phone Number**: Include country code (e.g., `919876543210` for India)
- **Timeout**: Timeout is specified in milliseconds (e.g., `60000` for 60 seconds)
- **Environment**: Use `'Sandbox'` for testing and `'Production'` for live environment
- **Error Handling**: Always handle both success and error cases in your promise chains

## Example App

See the `example/` directory for a complete working example app demonstrating One-Tap Login features.
