> For the complete documentation index, see [llms.txt](https://docs.facephi.com/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.facephi.com/sdks/sdk-mobile/framework-plugins/react-native/componentes/componente-principal.md).

# Componente principal

La instalación del **Core Plugin** es obligatoria, independientemente de los productos que se requieran utilizar y del caso de uso que se haya definido. Contiene funcionalidades básicas para el funcionamiento de la SDK, además de otras funcionalidades transversales y necesarias para los plugins auxiliares.

## Dependencias <a href="#id-2-dependencia" id="id-2-dependencia"></a>

### React Native:

```bash
npm i @facephi/sdk-core-react-native@<versión>
```

### Android - Gradle:

```kotlin
api "com.facephi.androidsdk:sdk:$version"
api "com.facephi.androidsdk:core:$version"
implementation "com.facephi.androidsdk:tracking_component:$version"
```

### iOS - Cocoapods:

```swift
s.dependency 'FPHISDKMainComponent', '~> $version'
s.dependency 'FPHISDKTrackingComponent', '~> $version'
s.dependency 'FPHISDKLicensingComponent', '~> $version'
s.dependency 'FPHISDKTokenizeComponent', '~> $version'
s.dependency 'FPHISDKStatusComponent', '~> $version'
```

## Métodos disponibles

Este componente contiene varios métodos que ejecutan diferentes funcionalidades:

<table data-header-hidden><thead><tr><th width="233.64453125"></th><th></th></tr></thead><tbody><tr><td><strong>Método</strong></td><td><strong>Descripción</strong></td></tr><tr><td>initSession</td><td>Controlador principal del componente, que se encarga de validar las licencias entre otras cosas.</td></tr><tr><td>initOperation</td><td>Método que se encarga de generar una nueva operación. El id de la misma se recupera en el objeto de resultado, parámetro data.</td></tr><tr><td>getExtraData</td><td>El método getExtraData permite generar los identificadores necesarios para una operación que deba continuar en el <em>Servicio de Validaciones de Facephi</em> (Backend).</td></tr><tr><td>closeSession</td><td>Antes de que la aplicación se vaya a destruir, se deberá cerrar la sesión de la SDK para así avisar a la plataforma de su finalización.</td></tr></tbody></table>

### initSession <a href="#id-2-inicializacion-de-la-sesion" id="id-2-inicializacion-de-la-sesion"></a>

Antes de poder utilizar cualquier componente, se deberá inicializar la sesión de la SDK. Esta inicialización se debe hacer lo más pronto posible, preferentemente al inicio de la aplicación. Al mismo tiempo, una vez terminadas todas las operaciones con la SDK Mobile, deberá cerrarse igualmente la sesión.

Se puede inicializar el componente actual de dos formas, dependiendo de cómo desees inyectar la licencia.

El nuevo método de licenciamiento permite gestionar las licencias de forma transparente para el integrador. La licencia se puede inyectar de dos maneras:

* a. Obteniendo la licencia a través de un servicio mediante una URL y API-KEY
* b. Inyectando la licencia directamente como String

En ambos casos, el resultado se devolverá por medio de una Promise, la cual contiene un objeto de la clase **CoreResult**.

```javascript
export function initSession(config: InitSessionConfiguration): Promise<CoreResult> {
  return SdkCore.initSession(config);
}
```

## Configuración básica <a href="#id-5-configuracion-basica" id="id-5-configuracion-basica"></a>

Para lanzar el componente actual, se deberá crear un objeto ***InitSessionConfiguration*** que será la configuración del controlador del componente.

La configuración básica necesaria para es la siguiente:

```typescript
export interface InitSessionConfiguration {
    license?: string;
    licenseUrl?: string;
    licenseApiKey?: string;
    enableTracking?: boolean;
    internalOptions?: Record<String, String>;
    enableDebugMode?: boolean;
    locale?: string;
}
```

### Configuración avanzada del componente

A continuación se detallan todos los campos que forman parte de esta clase.

{% content-ref url="/pages/ZiEkZXjLq8M6NL0zUogw" %}
[Init Session Configuración](/sdks/sdk-mobile/framework-plugins/extras/core/init-session-configuracion.md)
{% endcontent-ref %}

***

### initOperation <a href="#id-3-inicializacion-de-la-operacion" id="id-3-inicializacion-de-la-operacion"></a>

Al iniciar un proceso o flujo, **siempre** se deberá realizar la llamada al método launchInitOperation

```javascript
export function initOperation(config: InitOperationConfiguration): Promise<CoreResult> {
  return SdkCore.initOperation(config);
}
```

## Configuración básica <a href="#id-5-configuracion-basica" id="id-5-configuracion-basica"></a>

Para lanzar el componente actual, se deberá crear un objeto ***InitOperationConfiguration*** que será la configuración del controlador del componente.

La configuración básica necesaria para es la siguiente:

```typescript
export interface InitOperationConfiguration {
    type: SdkOperationType;
    customerId: string;
}
```

### Configuración avanzada del componente

A continuación se detallan todos los campos que forman parte de esta clase.

{% content-ref url="/pages/TDD3HgSYFGVXXpt1Tp9O" %}
[Init Operation Configuración](/sdks/sdk-mobile/framework-plugins/extras/core/init-operation-configuracion.md)
{% endcontent-ref %}

***

### closeSession <a href="#id-6-cierre-de-sesion" id="id-6-cierre-de-sesion"></a>

Antes de que la aplicación se vaya a destruir, se deberá cerrar la sesión de la SDK para así avisar a la plataforma de su finalización. Para ello, se ejecuta el siguiente fragmento de código:

```javascript
export function closeSession(): Promise<CoreResult> {
  return SdkCore.closeSession();
}
```

***

### getExtraData <a href="#id-7-metodo-extradata" id="id-7-metodo-extradata"></a>

El método getExtraData permite generar los identificadores necesarios para una operación que deba continuar en el *Servicio de Validaciones de Facephi* (Backend). Esta situación suele darse en casos en los que, una vez obtenida la información necesaria en la aplicación del cliente, se deba enviar esa información a un determinado servicio para su posterior validación o análisis. En caso de que deban trackearse los resultados de esos procesos en la Plataforma, ésta deberá ser capaz de unificar la primera parte del proceso realizada en cliente con la última realizada en el servicio, ya que al final forman parte de la misma operación.

```javascript
export function getExtraData(): Promise<CoreResult> {
  return SdkCore.getExtraData();
}
```

## Lanzamiento de IDV <a href="#lanzamiento-de-idv" id="lanzamiento-de-idv"></a>

El proceso de IDV lanza un flujo configurado en la plataforma a partir de su ID (flowID). Para ello se necesitará invocar dos métodos: **initFlow + startFlow**.

### launchInitFlow

En éste método se seteará la configuración necesaria. El ID del flujo configurado en la plataforma (flowID) y el ID del cliente (customerID). Véase código:

```dart
export function initFlow(config: FlowConfiguration): Promise<CoreResult> {
  return SdkCore.initFlow(config);
}
```

Para configurar el controlador de flujos, se creará un listado de los controladores de los componentes que van a participar en el proceso, lo cual permite inicializarlos correctamente. El orden en el que se definan no es importante, será el propio flujo el que indique el orden en el que se ejecutarán. Por ejemplo:

* **setSelphiFlow**: Captura facial
* **setSelphidFlow**: Captura de documentos

Código para el lanzamiento:

```javascript
/* Los resultados se escuchan implementando un addListener, con el key 'core.flow' */
let flowListener = flowEmitter.addListener(
  "core.flow",
  (res: any) => console.log("FLOW_LISTENER", res)
);

const getFlowConfiguration = () => 
{
    const sdkConfiguration: FlowConfiguration = {
      flow: "f40c098c-a878-4976-aef1-xxxxxxx",
      customerId: CUSTOMER_ID,
    };
    return sdkConfiguration;
};
    
await initFlow(getFlowConfiguration())
.then(async (result: CoreResult) => 
{
  console.log("initFlow result", result);
  if (result.errorType == SdkErrorType.NoError) 
  {
    await setSelphiFlow().then((result: SelphiResult) => 
    {
      console.log("setSelphiFlow", result);
    });
    await setSelphidFlow().then((result: SelphidResult) => 
    {
      console.log("setSelphidFlow", result);
    });

    await startFlow()
    .then((result: CoreResult) => 
    {
      console.log("startFlow result", result);
    })
    .finally(()=> 
    {
      console.log("End startFlow...");
    });
  }
})
.finally(()=> {
  console.log("End launchFlow...");
});
```

## Recepción del resultado <a href="#id-6-recepcion-del-resultado" id="id-6-recepcion-del-resultado"></a>

El lanzamiento de ***TODOS*** los métodos devolverá la información en formato CoreResult. Pudiendo diferenciarse entre un lanzamiento correcto y uno incorrecto:

```dart
export interface CoreResult {
    finishStatus: number;
    finishStatusDescription?: string;
    errorType: string;
    errorMessage?: string;
    data?: string;
}
```

{% content-ref url="/pages/OfulgTvj6HOIQTMcT4M1" %}
[Core Resultado](/sdks/sdk-mobile/framework-plugins/extras/core/core-resultado.md)
{% endcontent-ref %}
