# Changelog

Todos los cambios que le importan a alguien que integra este widget.

El formato sigue [Keep a Changelog](https://keepachangelog.com/es-ES/1.1.0/) y el
versionado es [SemVer](https://semver.org/lang/es/).

**Cómo leer cada entrada.** Acá conviven dos cosas que se distribuyen distinto, y
cada entrada dice cuál es:

- **SDK** · corre en tu página. Lo servís vos, desde npm o desde el CDN. Un
  cambio acá te llega cuando vos lo traés.
- **Widget** · es el iframe del checkout, y lo hosteamos nosotros. Un cambio acá
  ya lo tenés la próxima vez que un pagador abre el checkout, sin que hagas nada.

Por eso cada entrada cierra contestando una sola pregunta: **¿tengo que hacer
algo?**

## [1.5.0] - 2026-10-15

### Added

- **SDK 1.5.0** · Modo link: `init({ linkToken })` como alternativa a la
  publishable key, y `checkoutLink()` para montar el checkout a partir del token
  de un cobro. Es para la página de pago de Chytapay a la que llega el pagador
  desde el recordatorio de WhatsApp, no para integradores.
  **No tenés que hacer nada**: `init({ pk })` y `checkout()` no cambian.
- **Widget** · Pantalla nueva para elegir desde qué cuenta se transfiere cuando
  el cobro ya tiene contactos pagadores. Cada opción se muestra con el nombre y
  el documento COMPLETOS (decisión de producto del 2026-10-12): quien tiene el
  link ve esos datos de hasta cinco personas antes de identificarse, y se asumió
  ese costo porque con un documento enmascarado el pagador no puede saber cuál
  de las opciones es su cuenta. Solo aparece en modo link.
  **No tenés que hacer nada**: en el checkout de integradores no se muestra.
- **Widget** · Esa misma pantalla dice qué va a pasar después: con una sola
  cuenta afirma "Vamos a esperar tu transferencia desde esta cuenta:" en lugar de
  preguntar, y debajo de las opciones aclara que la transferencia tiene que salir
  de una cuenta cuyo titular tenga ese documento, con la consecuencia de no
  hacerlo. Antes el pagador se enteraba de esa regla recién en la pantalla del
  CVU, ya después de elegir. Solo aparece en modo link.
  **No tenés que hacer nada.**

### Changed

- **SDK 1.5.0** · `ChytaPayConfig` y `WidgetPayerInput` dejaron de ser
  `interface` y ahora son uniones discriminadas: la config lleva `pk` **o**
  `linkToken` (nunca los dos), y el body del pagador lleva `taxDocument` **o**
  `payerOptionId`. Es un cambio de la API pública de tipos.
  **Si usás JavaScript no tenés que hacer nada.** En TypeScript, un objeto que
  mezclaba las dos mitades (o que se tipaba a mano con los dos campos) ahora no
  compila — pasale una sola credencial y una sola forma de pagador.

### Fixed

- **Widget** · Para un CUIL de persona física, el resumen del pagador mostraba
  el CUIL de 11 dígitos; ahora muestra el DNI, que es el documento que el pagador
  reconoce como suyo.
  **No tenés que hacer nada.**

## [1.4.0]

### Changed

- **Widget** · La pantalla del documento ahora dice de quién es: el campo tiene
  el título fijo "DNI del titular de la cuenta" y, debajo, siempre, la frase
  "Ingresá el DNI del titular de la cuenta desde la que vas a transferir." Antes
  solo había un texto dentro del campo, que desaparecía al tipear, y quien
  pagaba la cuota de un hijo cargaba el DNI del hijo: ese pago no concilia. Para
  una empresa el campo pide el CUIT y no muestra esa ayuda. ¿Tengo que hacer
  algo? No.
- **Widget** · La pantalla del CVU dice de qué cuenta tiene que salir la
  transferencia, justo antes de la cuenta que recibe el pago: "La transferencia
  debe salir de una cuenta a nombre de", el nombre, el documento y "Cambiar
  documento". Si no hay nombre, nombra el documento sin inventar uno. El CVU de
  22 dígitos se ve completo en celulares angostos (el botón Copiar baja debajo),
  la espera queda abajo y chica, y los accesos a la billetera quedan después del
  bloque de origen. La pantalla de pago parcial también muestra el CVU completo y
  baja Copiar debajo. Al cambiar el documento, el campo conserva lo que se había
  tipeado. No hay pasos ni confirmaciones nuevas. ¿Tengo que hacer algo? No.
- **Widget** · Cuando un cobro vence o se cancela, la pantalla lo dice con
  claridad: «Este cobro venció» (con la salida «Si ya transferiste, consultá al
  comercio. Si todavía no pagaste, pedile un nuevo cobro.») o «Este cobro fue
  cancelado» (con «Consultá al comercio para saber cómo seguir.»). Un error
  real mantiene su mensaje. Si el plazo para transferir se agota en el widget
  pero el cobro sigue pendiente, la pantalla del CVU pasa a «El tiempo para
  transferir terminó» con la consulta del estado, y deja de ofrecer copiar el
  CVU, abrir la billetera o cambiar el documento. Un pago parcial que vence
  también deja de pedir transferir: «El cobro venció con un pago parcial»
  conserva Recibido, Pendiente y Total, retira el CVU y orienta al comercio
  («Consultá al comercio cómo completar el importe pendiente.»), con «Ver el
  estado del cobro». Si solo se agotó el plazo del widget, dice «El tiempo para
  completar el pago terminó». En lo que respecta al vencimiento, mientras el
  plazo está vigente el pago parcial no cambia. ¿Tengo que hacer algo? No.
- **Widget** · El selector DNI o CUIT ya no está. El campo arranca en DNI y
  debajo queda el link "Pago desde una cuenta de empresa", que lo cambia a
  CUIT. Pagar con CUIT sigue siendo posible. ¿Tengo que hacer algo? No.

### Added

- **SDK** · El SDK le pasa al widget un interruptor nuevo del resumen del
  cobro, `minorDniNotice`. Con el interruptor prendido para tu integración,
  si el pagador tipea un DNI que por su número parece de un menor, el widget le
  avisa en el campo que tiene que ser el del titular de la cuenta desde la que
  transfiere. El interruptor gobierna solo ese aviso: la ayuda bajo el campo ya
  no depende de él. El aviso no bloquea. Nace apagado y lo prendemos nosotros,
  pensado para clubes y colegios. **Requiere actualizar** solo si te prendemos
  el aviso: con un SDK anterior a 1.4.0 el interruptor no llega al widget y el
  aviso no aparece. ¿Tengo que hacer algo? No, salvo que nos pidas el aviso.

## [1.3.0]

### Changed

- **SDK** · `ChytaPay.init({ pk })` ahora elige la API y el iframe según el
  prefijo de la clave. Una `pk_test_...` apunta sola a
  `integration-api.test.chytapay.com.ar` y a `widget-test.chytapay.com.ar`, y
  una `pk_live_...` sigue apuntando a producción, igual que antes. Antes una
  `pk_test_` sin opciones le pegaba a producción y fallaba, porque esa clave no
  existe ahí. Si pasás `apiBaseUrl` o `iframeUrl`, cada uno sigue pisando al
  derivado. Un prefijo desconocido cae a producción y deja un warning en la
  consola. ¿Tengo que hacer algo? No, salvo que hoy pases las URLs de test a
  mano: ya podés sacarlas. Con `pk_live_` no cambia nada.

## [1.2.0]

### Changed

- **SDK** · El botón **Abrir en Mercado Pago** ahora abre la app desde tu
  página y no desde adentro del iframe del widget. Al tocar, el widget le pide
  al SDK que abra el link de la billetera, y el SDK lo abre desde un frame
  oculto propio: tu página no navega ni recibe `beforeunload`. El SDK solo
  acepta links de Mercado Pago, cualquier otra dirección se descarta.
  En Safari de iPhone el frame no sirve (Safari no lanza una app desde un
  frame, probado en un iPhone), así que ahí el SDK navega tu página al link de
  la billetera: la página no se va, toma el control la app. En los demás
  navegadores de iOS que no son Chrome el widget sigue abriendo el link por su
  cuenta.
  **Requiere actualizar.** Con un SDK anterior el botón sigue funcionando como
  hasta ahora, abriendo el link desde el iframe. Si tu página manda una
  Content Security Policy con `frame-src`, sumale `mercadopago:` e `intent:`:
  sin eso el navegador bloquea ese frame y el pagador ve el aviso de que la app
  no abrió.

### Added

- **Widget** · Si después de tocar **Abrir en Mercado Pago** la app no abre en
  2,5 segundos, el widget lo dice: "No pudimos abrir Mercado Pago. Copiamos el
  CVU: pegalo en tu app", arriba del CVU y de su botón de copiar. Antes el
  pagador tocaba y no pasaba nada. En Android, donde el botón deja copiado el
  monto, al fallar se copia el CVU en su lugar.
  **No tenés que hacer nada.**
- **Widget** · Al tocar **Abrir en Mercado Pago** el botón pasa a "Abriendo
  Mercado Pago…" con un spinner y no acepta otro toque hasta que la app abre o
  aparece el aviso.
  **No tenés que hacer nada.**
- **SDK** · `onWalletOpen` en `checkout()`: te avisa de cada toque en el botón
  de la billetera, con si la app abrió, el sistema y la familia del navegador
  (`{ wallet, opened, os, browser, via }`). No incluye el user agent ni ningún
  dato del pagador.
  **Requiere actualizar** para recibirlo. Es opcional.

## [1.1.0]

### Changed

- **SDK** · El widget se entera del pago solo. Antes empezaba a preguntar recién
  cuando el pagador tocaba "Listo, ya realicé la transferencia": el que volvía
  de la app del banco sin tocarlo veía la pantalla del CVU quieta aunque la plata
  ya estuviera acreditada. Ahora pregunta desde que el CVU está en pantalla, cada
  5 segundos mientras el pagador transfiere, y apenas vuelve a la página consulta
  en el momento y pasa a `pollSchedule`. `pollSchedule` se sigue respetando, y
  ahora cuenta desde esa vuelta.
  **Requiere actualizar.**
- **SDK** · Un corte de red ya no termina el cobro. Antes cuatro consultas
  fallidas seguidas mostraban "Se perdió la conexión con el pago" y disparaban
  `onError`, y es justo lo que pasa cuando el celular vuelve de segundo plano con
  la conexión todavía dormida. Ahora se reintenta con espera creciente hasta que
  vence el cobro, sin `onError`. `onError` queda para lo que no se arregla
  reintentando, como un pago que no existe o una key rechazada.
  **Requiere actualizar.** Si usabas `onError` para detectar cortes de red, ya no
  llega por eso.

- **Widget** · El checkout pasa a la marca nueva de ChytaPay (isologo, paleta,
  Quicksand y Roboto) y se rediseñó para el celular. Botones y campos de al menos
  44px, el CVU de corrido con "Copiar" al lado en la misma línea, teclado
  numérico para el documento, y Mercado Pago como acción principal con su logo
  oficial. Mientras carga, la chyta corre; en la pantalla del CVU, una línea
  avisa que estamos esperando la transferencia, así el pagador que vuelve del
  banco sabe que no tiene que tocar nada.
  **No tenés que hacer nada.**
- **Widget** · Cada pestaña del documento valida lo suyo: la de CUIT exige 11
  dígitos con el verificador y avisa "Ingresá un CUIT válido."; antes aceptaba
  un DNI de 8 dígitos y lo mandaba como CUIT.
  **No tenés que hacer nada.**
- **Widget** · `theme` acepta solo cuatro claves: `--chytapay-primary`,
  `--chytapay-accent`, `--chytapay-header-bg` y `--chytapay-radius`. Cada color se
  valida contra el texto que lleva encima, y si no llega a WCAG AA se usa el de
  ChytaPay en lugar de mostrar algo ilegible.
  **Revisá tu `theme` si mandabas otras claves** (`--chytapay-fg`,
  `--chytapay-font`, ...): ahora se ignoran. El detalle está en el README.
- **SDK** · Al abrir el checkout, el SDK muestra al instante una hoja de carga
  con el header de ChytaPay y el loader, en lugar del fondo oscuro vacío que se
  veía hasta que llegaba el widget. Cuando el widget ya tiene el pago cargado la
  reemplaza, sin saltos. La cruz ya cierra desde ese momento. `init` precarga el
  loader, así que llamalo al cargar la página y no en el clic del botón de pago.
  **Requiere actualizar.**
- **SDK** · En el celular (hasta 640px de ancho) el overlay se abre como bottom
  sheet a todo el ancho, en lugar de un modal chico centrado. No pasa del alto
  visible, se corre por encima del teclado y bloquea el scroll de tu página
  mientras está abierto. Con `container` no cambia nada.
  **Requiere actualizar.**

### Fixed

- **Widget** · Un `--chytapay-header-gradient` con un color plano dejaba el header
  transparente sin avisar: se aplicaba como imagen de fondo y un color no lo es.
  Ahora acepta color o gradiente, con ese nombre o con `--chytapay-header-bg`.
  **No tenés que hacer nada.**
- **SDK** · El botón "Actualizar estado" consulta siempre. Si el poller ya se
  había detenido, el botón no hacía nada.
  **Requiere actualizar.**
- **Widget** · La pantalla del CVU decía "CVU único para esta operación", y en
  los cobros donde el CVU se comparte entre operaciones eso no era cierto. Ahora
  dice "Datos para transferir".
  **No tenés que hacer nada.**

### Added

- **Widget** · Cuando el pagador vuelve a la página del checkout, el widget pide
  una consulta en el momento. Con un SDK anterior a 1.1.0 eso también arranca el
  poller, así que tus pagadores ya ven el pago al volver aunque no actualices.
  **No tenés que hacer nada.**
- **Widget** · En el celular, la pantalla del CVU suma un botón **Abrir Mercado
  Pago** que abre la app con el CVU de la operación ya puesto. Sigue abajo el
  CVU copiable de siempre: el botón es un atajo, no un reemplazo, y si la app no
  está instalada no pasa nada y el pagador transfiere como hasta ahora.
  En iPhone el monto también viene cargado. En Android no: la app deja ese campo
  en cero, así que se lo copiamos al portapapeles para que lo pegue. En escritorio el botón no aparece, porque ese atajo solo existe dentro
  de la app.
  **No tenés que hacer nada.** El widget lo hosteamos nosotros, así que tus
  pagadores lo ven la próxima vez que abren el checkout.

## [1.0.0] - 2026-09-08

Primera versión estable. A partir de acá la superficie pública del SDK está
congelada bajo semver: podés integrar contra `@1` y recibir arreglos y agregados
sin que nada que rompa te entre solo.

```html
<script src="https://unpkg.com/@chytapay/integration-widget@1"></script>
```

### Changed

- **SDK** · La API pública queda congelada bajo semver. Mientras sigas en `@1`,
  lo que rompe compatibilidad no te puede llegar sin que cambies ese número a
  mano.
  **Te conviene actualizar** la URL del CDN de `@0.2.0` a `@1`: pasás a recibir
  los arreglos en vez de quedarte clavado en una versión que ya no cambia.

### Fixed

- **SDK** · Cuando el comercio se queda sin cuentas libres para asignar, el
  pagador vuelve al formulario en lugar de terminar en una pantalla sin salida.
  Antes el SDK no reconocía ese caso, lo trataba como un fallo definitivo y
  mostraba "No se pudo registrar el documento": el cobro quedaba muerto en
  pantalla aunque no tuviera nada roto, y `onError` se disparaba por algo que se
  destraba solo en unos minutos.
  **Requiere actualizar.**

### Removed

- **SDK** · Se sacaron las opciones `cvu` y `alias` de `checkout()`.
  Habían entrado como puente hasta que la API devolviera esos datos. El `cvu` lo
  devuelve la API desde la 0.2.0, así que el que pasabas vos ya no se usaba; el
  `alias` nunca llegó a mostrarse en ninguna pantalla del checkout.
  **Casi seguro que no tenés que hacer nada**: ninguna de las dos estaba
  documentada. Si las pasabas, sacalas de la llamada. Por CDN se ignoran en
  silencio; con un bundler te lo va a marcar TypeScript.

## [0.2.0] - 2026-09-05

### Fixed

- **SDK** · El checkout ahora muestra el CVU apenas se adjunta el pagador.
  En 0.1.0 el SDK descartaba el CVU que venía en la respuesta del attach, y como
  el checkout empieza a consultar el estado recién cuando el pagador toca "Ya
  transferí", quedaba trabado: necesitaba el CVU para transferir y el CVU le
  aparecía después de avisar que ya había transferido.
  **Requiere actualizar** si fijaste la versión.

- **Widget** · Se agregó una pantalla de preparación mientras se asigna la
  cuenta, para que el pagador no vea un checkout vacío en ese intervalo.
  **Ya lo tenés**: el iframe lo servimos nosotros.

## [0.1.0] - 2026-09-03

### Added

- **SDK** · `pollSchedule` en `checkout()`, para elegir cada cuánto se consulta
  el estado del pago: un intervalo fijo en ms, o una función del tiempo
  transcurrido. Se exportan `DEFAULT_POLL_SCHEDULE`, `DEFAULT_POLL_LIFETIME_MS` y
  el tipo `PollSchedule`.
  **Opcional**: si no lo pasás, la cadencia por defecto es la de siempre.

- **SDK** · `demo: true` en `checkout()`, que reproduce un flujo completo sin
  tocar la red ni necesitar un cobro real. Es para landings y demos, no para
  cobrar.
  **Opcional.**

### Changed

- **SDK** · La URL por defecto del iframe pasó a `.../checkout/`. Es transparente
  si no pasás `iframeUrl`, que es el caso normal.
  **Solo tenés que mirarlo si pasabas un `iframeUrl` propio**: la barra final
  dejó de recortarse, porque ahí es donde vive el documento del checkout.

### Fixed

- **SDK** · El attach dejó de fallar cuando el pagador no tiene nombre cargado.
  **Requiere actualizar** si fijaste la versión.

- **Widget** · El temporizador avisa antes de vencer, el checkout sale solo
  cuando el cobro expira, y el logo del encabezado contrasta contra el fondo.
  **Ya lo tenés**: el iframe lo servimos nosotros.

## [0.0.1] - 2026-07-27

Primera publicación en npm. No hay una versión anterior contra la cual comparar,
así que no hay cambios que listar.

[Unreleased]: https://github.com/agilpay/chytapay-integration-widget/compare/v1.5.0...HEAD
[1.5.0]: https://github.com/agilpay/chytapay-integration-widget/compare/v1.4.0...v1.5.0
[1.4.0]: https://github.com/agilpay/chytapay-integration-widget/compare/v1.3.0...v1.4.0
[1.3.0]: https://github.com/agilpay/chytapay-integration-widget/compare/v1.2.0...v1.3.0
[1.2.0]: https://github.com/agilpay/chytapay-integration-widget/compare/v1.1.0...v1.2.0
[1.1.0]: https://github.com/agilpay/chytapay-integration-widget/compare/v1.0.0...v1.1.0
[1.0.0]: https://github.com/agilpay/chytapay-integration-widget/compare/c1e007b...v1.0.0
[0.2.0]: https://github.com/agilpay/chytapay-integration-widget/compare/v0.1.0...c1e007b
[0.1.0]: https://github.com/agilpay/chytapay-integration-widget/compare/v0.0.1...v0.1.0
[0.0.1]: https://github.com/agilpay/chytapay-integration-widget/releases/tag/v0.0.1
