> 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/selphi-biometria-facial/resultados.md).

# Resultados

Resultados oferecidos pelo componente Selphi Widget.

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 ([Eventos](/docs.facephi-pt-br/sdks/sdk-web/componentes/selphi-biometria-facial/eventos.md)).

## Casos de sucesso

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

No momento em que a captura do Template Biométrico é concluída, os resultados extraídos serão oferecidos no evento `extractionFinish` ([link](/docs.facephi-pt-br/sdks/sdk-web/componentes/selphi-biometria-facial/eventos/extractionfinish.md)).

{% hint style="info" %}
Assim que este evento é emitido, a lógica para carregar a próxima view ou Widget deve ser implementada adequando-se ao contexto da aplicação.
{% endhint %}

Há um exemplo:

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

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

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

  // Processar os resultados no backend
  saveResults(result.extractionData.bestImage, result.extractionData.templateRaw);

  // Carregar o próximo widget ou view
  loadNextView();
}
```

***

## Casos de erro

Recomenda-se controlar os possíveis erros que possam ocorrer ao processar os dados obtidos para evitar mau funcionamento interno, 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 com 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, já que se devem a um uso incorreto do Widget por parte do usuário.

<table><thead><tr><th width="266.15625">Erro</th><th width="87.30078125">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>SPI_227</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>SPI_235</td><td>Erro interno no Widget. Se o erro persistir será necessário contatar a equipe de suporte da Facephi</td></tr><tr><td>CameraHardwareError</td><td>SPI_204</td><td>Erro produzido durante o acesso às câmeras do dispositivo.</td></tr><tr><td>PermissionsDenied</td><td>SPI_242</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>SPI_201</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>SPI_218</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>SPI_219</td><td>Erro produzido por uma configuração incorreta.</td></tr><tr><td>BrowserApiNotCompatible</td><td>SPI_220</td><td>Erro produzido por um navegador não compatível.</td></tr><tr><td>SpoofingDetected</td><td>SPI_221</td><td>Erro gerado ao detectar um ataque de injeção no Widget.</td></tr><tr><td>ActiveLivenessError</td><td>SPI_205</td><td>Erro gerado ao falhar o teste de vida ativa na execução do Widget.</td></tr><tr><td><strong>Exceções de extração</strong></td><td></td><td></td></tr><tr><td>ErrorTimeout</td><td>SPI_001</td><td>Erro gerado ao ter excedido o limite de tempo estabelecido para a extração.</td></tr><tr><td>FaceNotFound</td><td>SPI_222</td><td>Erro gerado ao não encontrar um rosto durante o processo de captura.</td></tr><tr><td>EyesNotFound</td><td>SPI_223</td><td>Erro gerado ao não detectar os olhos no processo de captura.</td></tr><tr><td>OccludedEyes</td><td>SPI_237</td><td>Erro gerado ao reconhecer os olhos cobertos no processo de captura.</td></tr><tr><td>OccludedMouth</td><td>SPI_238</td><td>Erro gerado ao reconhecer a boca coberta no processo de captura.</td></tr><tr><td>DarkLightError</td><td>SPI_224</td><td>Erro gerado ao detectar pouca iluminação no processo de captura.</td></tr><tr><td>AngleExceeded</td><td>SPI_225</td><td>Erro gerado ao detectar um ângulo excessivo do rosto do usuário no processo de captura.</td></tr><tr><td>TooManyFaces</td><td>SPI_226</td><td>Erro gerado ao detectar vários rostos no processo de captura.</td></tr><tr><td>NotStabilizedSunGlasses</td><td>SPI_223</td><td>Erro gerado ao detectar óculos de sol no usuário no processo de captura.</td></tr><tr><td>NotStabilizedNoColor</td><td>SPI_224</td><td>Erro gerado ao não detectar cor no processo de captura.</td></tr></tbody></table>

***

### Tempo limite excedido durante a captura do Template Biométrico

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

Há um exemplo:

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

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

// O usuário não concluiu a extração do padrão facial dentro do tempo permitido
const onExtractionTimeout = (event: CustomEvent<ExtractionTimeoutEvent>) => {
  if (userRetries >= 3) {
    // Redirecionar o usuário para uma view de erro
    showRetriesExceededView();
  }
}

// O usuário clicou no botão para tentar novamente a extração na view de tempo limite do 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/selphi-biometria-facial/propiedades/maxattempts.md) delega o limite de tentativas ao próprio Widget. Quando elas se esgotam, o Widget para de tentar novamente e emite `maxAttemptsExceeded` ([link](/docs.facephi-pt-br/sdks/sdk-web/componentes/selphi-biometria-facial/eventos/maxattemptsexceeded.md)).

Há um exemplo:

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

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

// O usuário consumiu todas as tentativas de captura permitidas
function onMaxAttemptsExceeded(event: CustomEvent<MaxAttemptsExceededEvent>) {
  const detail = event.detail.detail;
  console.log('maxAttemptsExceeded:', detail.message);

  // Redirecionar o usuário para uma view de erro
  showRetriesExceededView();
}
```

***

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

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

Exemplo de código

```typescript
import { type UserCancelEvent } from "@facephi/selphi-web-component";
  
const selphiWidget = document.querySelector('facephi-selphi-widget');
selphiWidget.addEventListener('userCancel', handleUserCancel);

// O usuário clicou no ícone de sair do Widget para cancelar o processo de extração
function handleUserCancel(event: CustomEvent<UserCancelEvent>) {
  // Redirecionar o usuário para a página principal do site
  goLandingPage();
}
```

***

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

Este evento é emitido quando é detectado um mau funcionamento do sistema. Ele pode ser usado 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/selphi-web-component";

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

// É detectado um mau funcionamento e o Widget foi interrompido
function handleExceptionCaptured(event: CustomEvent<ExceptionCapturedEvent>) {
  const exceptionDetail = event.detail.detail;
  console.error('Widget Exception:', exceptionDetail.exceptionType);
}

// Foi alcançado o tempo estabelecido na propriedade `errorTimeout`
function handleErrorTimeout(event: CustomEvent<ErrorTimeoutEvent>) {
  const errorTimeoutDetail = event.detail.detail;
  // Redirecionar o usuário para uma view de erro
  showErrorView(errorTimeoutDetail.exceptionType);
}
```

***
