> 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/docs.facephi-pt-br/sdks/sdk-web/componentes/selphid-documentos/resultados.md).

# Resultados

Nesta página explicaremos as diferentes possibilidades para finalizar o processo de captura do Widget.

Cada detalhe de cada evento (atributos, dados...) foi especificado na página de ([eventos](/docs.facephi-pt-br/sdks/sdk-web/componentes/selphid-documentos/eventos.md)).

## Casos de sucesso

### Captura e extração bem-sucedidas

No momento em que a captura do documento for bem-sucedida, os resultados extraídos serão disponibilizados no evento `extractionFinish` ([link](/docs.facephi-pt-br/sdks/sdk-web/componentes/selphid-documentos/eventos/extractionfinish.md)).

{% hint style="info" %}
Uma vez que este evento é emitido, deve-se implementar a lógica para carregar a próxima tela ou Widget, adaptando-se ao contexto da aplicação.
{% endhint %}

Aqui está um exemplo:

```typescript
import { type ExtractionFinishEvent } from "@facephi/selphid-web-component"

const selphidWidget = document.querySelector('facephi-selphid-widget');
selphidWidget.addEventListener('extractionFinish', onExtractionFinish);

function onExtractionFinish(event: CustomEvent<ExtractionFinishEvent>) {
  const extractionFinishDetail = event.detail.detail;
  console.log('extractionFinish:', extractionFinishDetail);

  // Procesar resultados en el backend
  saveResults(extractionFinishDetail.result.images.frontDocument, extractionFinishDetail.result.images.backDocument);

  // Cargar el siguiente widget o vista
  loadSelphiWidget();
}
```

***

## Casos de erro

Recomenda-se controlar os possíveis erros que possam ocorrer ao processar os dados obtidos para evitar falhas internas, uso incorreto do Widget ou ataques de força bruta.

### Códigos de erro

O Widget lançará uma exceção se ocorrer qualquer erro de uso ou interno.

As exceções poderão ser de dois tipos:

* Exceção terminal: Erro que será lançado quando o Widget não puder continuar sua execução. Esses erros podem ocorrer em ambientes ou configurações incorretas.
* Exceção de extração: Erro que será lançado durante o fluxo de captura ou extração. Esses erros permitem tentar novamente o fluxo do Widget, pois se devem a um uso incorreto do Widget por parte do usuário.

<table><thead><tr><th width="254.75390625">Erro</th><th width="97.01171875">Código</th><th>Descrição</th></tr></thead><tbody><tr><td><strong>Exceções terminais</strong></td><td></td><td></td></tr><tr><td>AndroidWebViewBehaviour</td><td>SPD_318</td><td>Erro produzido após a execução do componente em um WebView em um ambiente Android.</td></tr><tr><td>UnknownInternalError</td><td>SPD_329</td><td>Erro interno no Widget. Se o erro persistir, será necessário entrar em contato com a equipe de suporte da Facephi</td></tr><tr><td>CameraHardwareError</td><td>SPD_305</td><td>Erro produzido durante o acesso às câmeras do dispositivo.</td></tr><tr><td>PermissionsDenied</td><td>SPD_332</td><td>Erro gerado ao não permitir as permissões necessárias para a execução do Widget.</td></tr><tr><td>CameraPermissionDenied</td><td>SPD_301</td><td>Erro ao não conceder as permissões para utilizar a(s) câmera(s) do dispositivo.</td></tr><tr><td>MicrophonePermissionDenied</td><td>SPD_319</td><td>Erro ao não conceder as permissões para utilizar o(s) microfone(s) do dispositivo.</td></tr><tr><td>SettingsError</td><td>SPD_320</td><td>Erro produzido por uma configuração incorreta.</td></tr><tr><td>BrowserApiNotCompatible</td><td>SPD_321</td><td>Erro produzido por um navegador não compatível.</td></tr><tr><td><strong>Exceções de extração</strong></td><td></td><td></td></tr><tr><td>ErrorTimeout</td><td>SPD_001</td><td>Erro gerado ao ter excedido o limite de tempo estabelecido para a extração.</td></tr></tbody></table>

***

### Limite de tempo excedido durante a captura do documento

Com os eventos `extractionTimeout`([link](/docs.facephi-pt-br/sdks/sdk-web/componentes/selphid-documentos/eventos/extractiontimeout.md)) e `timeoutErrorButtonClick`([link](/docs.facephi-pt-br/sdks/sdk-web/componentes/selphid-documentos/eventos/timeouterrorbuttonclick.md)) é possível controlar quando o usuário excede o tempo definido ou as tentativas utilizadas.

Aqui está um exemplo:

```typescript
import { type ExtractionTimeoutEvent, type TimeoutButtonClickEvent } from "@facephi/selphid-web-component";

const selphidWidget = document.querySelector('facephi-selphid-widget');
selphidWidget.addEventListener('extractionTimeout', onErrorTimeout);
selphidWidget.addEventListener('timeoutErrorButtonClick', onTimeoutButtonClick);
let userRetries = 0;

// El usuario no ha completado la extracción dentro del tiempo permitido
const onExtractionTimeout = (event: CustomEvent<ExtractionTimeoutEvent>) => {
  if (userRetries >= 3) {
    // Redirigir al usuario a una vista de error
    showRetriesExceededView();
  }
}

// El usuario ha hecho clic en el botón para reintentar la extracción en la vista de tiempo de espera del widget
const onTimeoutButtonClick = (event: CustomEvent<TimeoutButtonClickEvent>) => {
  userRetries++;
}
```

***

### Tentativas de captura esgotadas

Como alternativa à contagem manual da seção anterior, a propriedade [maxAttempts](/docs.facephi-pt-br/sdks/sdk-web/componentes/selphid-documentos/propiedades/maxattempts.md) delega o limite de tentativas ao próprio Widget. Quando se esgotam, o Widget para de tentar novamente e emite `maxAttemptsExceeded` ([link](/docs.facephi-pt-br/sdks/sdk-web/componentes/selphid-documentos/eventos/maxattemptsexceeded.md)).

Aqui está um exemplo:

```typescript
import { type MaxAttemptsExceededEvent } from "@facephi/selphid-web-component";

const selphidWidget = document.querySelector('facephi-selphid-widget');
selphidWidget.maxAttempts = 3;
selphidWidget.addEventListener('maxAttemptsExceeded', onMaxAttemptsExceeded);

// El usuario ha consumido todos los intentos de captura permitidos
function onMaxAttemptsExceeded(event: CustomEvent<MaxAttemptsExceededEvent>) {
  const detail = event.detail.detail;
  console.log('maxAttemptsExceeded:', detail.message);

  // Redirigir al usuario a una vista de error
  showRetriesExceededView();
}
```

***

### O usuário fecha o Widget antes da captura do documento

Este evento é emitido quando o usuário clica no ícone de saída do Widget para cancelar o processo de extração. Uma vez que o botão é pressionado, o Widget será fechado.

Exemplo de código

```typescript
import { type UserCancelEvent } from "@facephi/selphid-web-component";

const selphidWidget = document.querySelector('facephi-selphid-widget');
selphidWidget.addEventListener('userCancel', handleUserCancel);

// El usuario ha hecho clic en el icono de salida del widget para cancelar el proceso de extracción
function handleUserCancel(event: CustomEvent<UserCancelEvent>) {
  // Redirigir al usuario a la página principal del sitio web
  goLandingPage();
}
```

***

### Exceções terminais durante o ciclo de vida do Widget

Este evento é emitido quando uma falha do sistema é detectada. Pode ser utilizado para identificar e filtrar diferentes tipos de erros encontrados durante o processo de captura.

Exemplo de código:

```typescript
import { type ExceptionCapturedEvent, type ErrorTimeoutEvent } from "@facephi/selphid-web-component";

const selphidWidget = document.querySelector('facephi-selphid-widget');
selphidWidget.addEventListener('exceptionCaptured', handleExceptionCaptured);
selphidWidget.addEventListener('errorTimeout', handleErrorTimeout);

// Se detecta un mal funcionamiento y el widget se ha detenido
function handleExceptionCaptured(event: CustomEvent<ExceptionCapturedEvent>) {
  const exceptionDetail = event.detail.detail;
  console.error('Widget Exception:', exceptionDetail.exceptionType);
}

// Se ha alcanzado el tiempo establecido en la propiedad `errorTimeout`
function handleErrorTimeout(event: CustomEvent<ErrorTimeoutEvent>) {
  const errorTimeoutDetail = event.detail.detail;
  // Redirigir al usuario a una vista de error
  showErrorView(errorTimeoutDetail.exceptionType);
}
```

***
