# Componente principal

A instalação do **Core** **Plugin** é obrigatória, independentemente dos produtos que sejam necessários utilizar e do caso de uso que tenha sido definido. Contém funcionalidades básicas para o funcionamento da SDK, além de outras funcionalidades transversais e necessárias para os plugins auxiliares.

## Dependências <a href="#id-2-dependencia" id="id-2-dependencia"></a>

### Capacitor:

```bash
npm i @facephi/sdk-core-capacitor@<versão>
npm run build
npx cap sync
```

### 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 disponíveis

Este componente contém vários métodos que executam 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>Descrição</strong></td></tr><tr><td>initSession</td><td>Controlador principal do componente, que é responsável por validar as licenças, entre outras coisas.</td></tr><tr><td>initOperation</td><td>Método que é responsável por gerar uma nova operação. O id da mesma é recuperado no objeto de resultado, parâmetro data.</td></tr><tr><td>getExtraData</td><td>O método getExtraData permite gerar os identificadores necessários para uma operação que deva continuar no <em>Serviço de Validações de Facephi</em> (Backend).</td></tr><tr><td>closeSession</td><td>Antes que a aplicação seja destruída, a sessão da SDK deverá ser encerrada para avisar a plataforma sobre sua finalização.</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 qualquer componente, a sessão da SDK deverá ser inicializada. Essa inicialização deve ser feita o mais cedo possível, preferencialmente no início da aplicação. Ao mesmo tempo, uma vez terminadas todas as operações com a SDK Mobile, a sessão também deverá ser encerrada.

O componente atual pode ser inicializado de duas formas, dependendo de como você deseja injetar a licença.

O novo método de licenciamento permite gerenciar as licenças de forma transparente para o integrador. A licença pode ser injetada de duas maneiras:

* a. Obtendo a Licença por meio de um serviço via uma URL e API-KEY
* b. Injetando a Licença diretamente como String

Em ambos os casos, o resultado será retornado por meio de uma Promise, a qual contém um objeto da classe **CoreResult**.

```javascript
initSession(configuration: InitSessionConfiguration): Promise<CoreResult>;
```

## Configuração básica <a href="#id-5-configuracion-basica" id="id-5-configuracion-basica"></a>

Para lançar o componente atual, deverá ser criado um objeto ***InitSessionConfiguration*** que será a configuração do controlador do componente.

A configuração básica necessária para ele é a seguinte:

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

### Configuração avançada do componente

A seguir, são detalhados todos os campos que fazem parte desta classe.

{% content-ref url="/pages/03cb56bdf3e20441fdb5f45be73ac546bf090d72" %}
[Configuração Init Session](/docs.facephi-pt-br/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>

Ao iniciar um processo ou fluxo, **sempre** a chamada ao método launchInitOperation deverá ser realizada

```javascript
initOperation(configuration: InitOperationConfiguration): Promise<CoreResult>;
```

## Configuração básica <a href="#id-5-configuracion-basica" id="id-5-configuracion-basica"></a>

Para lançar o componente atual, deverá ser criado um objeto ***InitOperationConfiguration*** que será a configuração do controlador do componente.

A configuração básica necessária para ele é a seguinte:

```typescript
export interface InitOperationConfiguration {
    type: SdkOperationType;
    steps?: string[];
    customerId: string;
}
```

### Configuração avançada do componente

A seguir, são detalhados todos os campos que fazem parte desta classe.

{% content-ref url="/pages/102fd5577a5f062acf9f2589d10f09751e946e78" %}
[Configuração Init Operation](/docs.facephi-pt-br/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 que a aplicação seja destruída, a sessão da SDK deverá ser encerrada para avisar a plataforma sobre sua finalização. Para isso, executa-se o seguinte trecho de código:

```javascript
closeSession(): Promise<CoreResult>;
```

***

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

O método getExtraData permite gerar os identificadores necessários para uma operação que deva continuar no *Serviço de Validações de Facephi* (Backend). Essa situação costuma ocorrer em casos nos quais, uma vez obtida a informação necessária na aplicação do cliente, essa informação deve ser enviada a um determinado serviço para sua posterior validação ou análise. Caso os resultados desses processos precisem ser rastreados na Plataforma, ela deverá ser capaz de unificar a primeira parte do processo realizada no cliente com a última realizada no serviço, já que no final fazem parte da mesma operação.

```javascript
getExtraData(): Promise<CoreResult>;
```

## Lançamento de IDV <a href="#lanzamiento-de-idv" id="lanzamiento-de-idv"></a>

O processo de IDV lança um fluxo configurado na plataforma a partir do seu ID (flowID). Para isso, será necessário invocar dois métodos: **initFlow + startFlow**.

### launchInitFlow

Neste método será definida a configuração necessária. O ID do fluxo configurado na plataforma (flowID) e o ID do cliente (customerID). Veja o código:

```dart
initFlow = async (): Promise<CoreResult> => 
{
  const widgetConfig: InitFlowConfiguration = {
    flow: "f40c098c-a878-4976-aef1-xxxxxxx",
    customerId: CUSTOMER_ID
  };
  return SdkCore.initFlow(widgetConfig);
};
```

```typescript
startFlow = async (): Promise<CoreResult> => 
{
  console.log('Launching startFlow...');
  return SdkCore.startFlow();
};
```

Para configurar o controlador de fluxos, será criada uma lista dos controladores dos componentes que vão participar do processo, o que permite inicializá-los corretamente. A ordem em que são definidos não é importante; será o próprio fluxo que indicará a ordem em que serão executados. Por exemplo:

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

Código para o lançamento:

```javascript
/* Os resultados são escutados implementando um addListener, com a key 'core.flow' */
listener: any = SdkCore.addListener('core.flow', (response: any) => 
{
  console.log("core.flow:", response);
});

await this.coreService.initFlow().then(async (result: CoreResult) => 
{
  if (result.finishStatus == SdkFinishStatus.Ok)
  {
    await this.selphiFaceService.setSelphiFlow()
      .then((res: SelphiFaceResult) => console.log("setSelphiFlow res", res))
      .catch((err) => console.log("setSelphiFlow err", err));
      
    await this.selphidService.setSelphidFlow()
      .then((res: SelphIDResult) => console.log("setSelphidFlow res", res))
      .catch((err) => console.log("setSelphidFlow err", err));


    await this.coreService.startFlow()
      .then((res: CoreResult) => console.log("startFlow res", res))
      .catch((err) => console.log("startFlow err", err));
  }
}, 
(err: any) => console.log(err));
```

## Recebimento do resultado <a href="#id-6-recepcion-del-resultado" id="id-6-recepcion-del-resultado"></a>

O lançamento de ***TODOS*** os métodos retornará a informação em formato CoreResult. Podendo diferenciar entre um lançamento correto e um incorreto:

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

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


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://docs.facephi.com/docs.facephi-pt-br/sdks/sdk-mobile/framework-plugins/capacitor/componentes/componente-principal.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
