> 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-web/componentes/selphid-documentos/resultados.md).

# Resultados

En esta página explicaremos las diferentes posibilidades para finalizar el proceso de captura del widget.

Cada detalle de cada evento (atributos, datos...) ha sido especificado en la página de ([eventos](/sdks/sdk-web/componentes/selphid-documentos/eventos.md)).

## Casos de éxito

### Captura y extracción satisfactoria

En el momento en que la captura del documento tiene éxito, los resultados extraídos se ofrecerán en el evento `extractionFinish` ([enlace](/sdks/sdk-web/componentes/selphid-documentos/eventos/extractionfinish.md)).

{% hint style="info" %}
Una vez que este evento es emitido, se debe implementar la lógica para cargar la siguiente vista o widget, adaptándose al contexto de la aplicación.
{% endhint %}

Aquí hay un ejemplo:

```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 error

Se recomienda controlar los posibles errores que puedan ocurrir al procesar los datos obtenidos para evitar fallos internos, un uso incorrecto del widget o ataques de fuerza bruta.

### Códigos de error

El widget lanzará una excepción si ocurre cualquier error de uso o interno.

Las excepciones podrán ser de dos tipos:

* Excepción terminal: Error que se lanzará cuando el widget no puede continuar con su ejecución. Estos errores pueden darse en entornos o configuraciones erróneas.
* Excepción de extracción: Error que se lanzará durante el flujo de captura o extracción. Estos errores permiten reintentar el flujo del widget, ya que se deben a un uso incorrecto del widget por parte del usuario.

<table><thead><tr><th width="254.75390625">Error</th><th width="97.01171875">Código</th><th>Descripción</th></tr></thead><tbody><tr><td><strong>Excepciones terminales</strong></td><td></td><td></td></tr><tr><td>AndroidWebViewBehaviour</td><td>SPD_318</td><td>Error producido tras la ejecución del componente en un WebView en un entorno android.</td></tr><tr><td>UnknownInternalError</td><td>SPD_329</td><td>Error interno en el widget. Si el error persiste será necesario contactar con el equipo de soporte de Facephi</td></tr><tr><td>CameraHardwareError</td><td>SPD_305</td><td>Error producido durante el acceso a cámaras del dispositivo.</td></tr><tr><td>PermissionsDenied</td><td>SPD_332</td><td>Error generado al no permitir los permisos necesarios para la ejecución del widget.</td></tr><tr><td>CameraPermissionDenied</td><td>SPD_301</td><td>Error al no conceder los permisos para utilizar la(s) cámara(s) del dispositivo.</td></tr><tr><td>MicrophonePermissionDenied</td><td>SPD_319</td><td>Error al no conceder los permisos para utilizar el(los) micrófono(s) del dispositivo.</td></tr><tr><td>SettingsError</td><td>SPD_320</td><td>Error producido por una configuración incorrecta.</td></tr><tr><td>BrowserApiNotCompatible</td><td>SPD_321</td><td>Error producido por un navegador no compatible.</td></tr><tr><td><strong>Excepciones de extracción</strong></td><td></td><td></td></tr><tr><td>ErrorTimeout</td><td>SPD_001</td><td>Error generado al haber superado el límite de tiempo establecido para la extracción.</td></tr></tbody></table>

***

### Límite de tiempo excedido durante la captura del documento

Con los eventos `extractionTimeout`([enlace](/sdks/sdk-web/componentes/selphid-documentos/eventos/extractiontimeout.md)) y `timeoutErrorButtonClick`([enlace](/sdks/sdk-web/componentes/selphid-documentos/eventos/timeouterrorbuttonclick.md)) es posible controlar cuándo el usuario excede el tiempo establecido o los intentos utilizados.

Aquí hay un ejemplo:

```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++;
}
```

***

### Intentos de captura agotados

Como alternativa al recuento manual del apartado anterior, la propiedad [maxAttempts](/sdks/sdk-web/componentes/selphid-documentos/propiedades/maxattempts.md) delega el límite de intentos en el propio widget. Cuando se agotan, el widget deja de reintentar y emite `maxAttemptsExceeded` ([enlace](/sdks/sdk-web/componentes/selphid-documentos/eventos/maxattemptsexceeded.md)).

Aquí hay un ejemplo:

```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();
}
```

***

### El usuario cierra el widget antes de la captura del documento

Este evento se emite cuando el usuario hace clic en el icono de salida del widget para cancelar el proceso de extracción. Una vez que se presiona el botón, el widget se cerrará.

Ejemplo 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();
}
```

***

### Excepciones terminales durante el ciclo de vida del Widget

Este evento se emite cuando se detecta un fallo del sistema. Puede ser utilizado para identificar y filtrar diferentes tipos de errores encontrados durante el proceso de captura.

Ejemplo 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);
}
```

***
