@npmtapi/embed 1.4.0 → 1.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -108,6 +108,10 @@ Se requiere `identifier` + **uno de** `organization` o `companyCode`. Si se pasa
108
108
  | `onAutopayActivated` | `(data) => void` | No | — | (Vista autopay) Callback cuando una nueva domiciliación queda activa (una sola vez por adhesión nueva) |
109
109
  | `onAutopayRemoved` | `(data) => void` | No | — | (Vista autopay) Callback cuando el usuario desadhiere un medio con éxito |
110
110
  | `onAutopayError` | `(data) => void` | No | — | (Vista autopay) Callback ante un error de carga o de desadhesión |
111
+ | `onDomiciliationBankSelected` | `(data) => void` | No | — | (Vista autopay) El usuario eligió su banco en el alta de domiciliación |
112
+ | `onDomiciliationFormCompleted` | `(data) => void` | No | — | (Vista autopay) Los datos de cuenta pasaron la validación del backend. Dispara al confirmar el método de verificación, no al salir del formulario |
113
+ | `onDomiciliationVerificationCompleted` | `(data) => void` | No | — | (Vista autopay) La verificación llegó a un desenlace. Solo emite al outcome final: un intento fallido con reintentos disponibles no dispara el evento |
114
+ | `onDomiciliationConfirmed` | `() => void` | No | — | (Vista autopay) El usuario confirmó la domiciliación. **No** significa que quedó registrada — la confirmación real llega por `onAutopayActivated` |
111
115
  | `className` | `string` | No | — | Clases CSS del contenedor |
112
116
  | `style` | `CSSProperties` | No | — | Estilos inline del contenedor |
113
117
 
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/loader.ts"],"sourcesContent":["export { loadTapipay } from \"./loader\";\nexport type {\n\tLoadTapipayOptions,\n\tTapipayAutopayActivatedEvent,\n\tTapipayAutopayAdhesionSummary,\n\tTapipayAutopayErrorEvent,\n\tTapipayAutopayLoadedEvent,\n\tTapipayAutopayMediaType,\n\tTapipayAutopayRemovedEvent,\n\tTapipayEnvironment,\n\tTapipayInstance,\n\tTapipayOptions,\n\tTapipayPaymentCancelledEvent,\n\tTapipayPaymentSubmittedEvent,\n\tTapipayPaymentWindowOpenedEvent,\n\tTapipayView,\n} from \"./types\";\n","import type {\n\tLoadTapipayOptions,\n\tTapipayEnvironment,\n\tTapipayInstance,\n} from \"./types\";\n\nconst SDK_URLS: Record<TapipayEnvironment, string> = {\n\tproduction: \"https://app.tapipay.la/embed.js\",\n\thomo: \"https://homo.tapipay.la/embed.js\",\n};\n\n// Idempotencia por entorno\nconst loadPromises = new Map<TapipayEnvironment, Promise<TapipayInstance>>();\n\n/**\n * Carga el SDK de TapiPay de forma asíncrona inyectando el script en el DOM.\n *\n * - Idempotente por entorno: múltiples llamadas con el mismo `environment` retornan la misma Promise.\n * - Si window.tapipay ya existe (script cargado sync), resuelve inmediatamente.\n * - Compatible con React Strict Mode (doble mount/unmount).\n *\n * @example\n * // Producción (default)\n * const tapipay = await loadTapipay();\n *\n * // Homologación\n * const tapipay = await loadTapipay({ environment: 'homo' });\n *\n * // Se requiere UNO de { organization, companyCode } (companyCode tiene prioridad).\n * tapipay.initialize({ container: \"#widget\", organization: \"acme\", identifier: \"CLI-001\" });\n * tapipay.initialize({ container: \"#widget\", companyCode: \"acme-mx\", identifier: \"CLI-001\" });\n */\nexport function loadTapipay(\n\toptions?: LoadTapipayOptions,\n): Promise<TapipayInstance> {\n\tconst env: TapipayEnvironment = options?.environment ?? \"production\";\n\tconst SDK_URL = SDK_URLS[env];\n\tconst SCRIPT_ID = `tapipay-embed-sdk-${env}`;\n\n\t// SSR guard\n\tif (typeof window === \"undefined\") {\n\t\treturn Promise.reject(\n\t\t\tnew Error(\"[TapiPay] loadTapipay() requires a browser environment.\"),\n\t\t);\n\t}\n\n\t// Ya cargado de forma síncrona (script tag directo)\n\tif (window.tapipay && !window.tapipay._q) {\n\t\treturn Promise.resolve(window.tapipay);\n\t}\n\n\t// Reutilizar promise existente (idempotencia por entorno)\n\tconst existing = loadPromises.get(env);\n\tif (existing) return existing;\n\n\tconst promise = new Promise<TapipayInstance>((resolve, reject) => {\n\t\t// Si ya hay un script inyectado, esperar a que cargue\n\t\tconst existingScript = document.getElementById(\n\t\t\tSCRIPT_ID,\n\t\t) as HTMLScriptElement | null;\n\n\t\tconst onLoad = () => {\n\t\t\tif (window.tapipay) {\n\t\t\t\tresolve(window.tapipay);\n\t\t\t} else {\n\t\t\t\treject(\n\t\t\t\t\tnew Error(\n\t\t\t\t\t\t\"[TapiPay] El script cargó pero window.tapipay no está definido.\",\n\t\t\t\t\t),\n\t\t\t\t);\n\t\t\t}\n\t\t};\n\n\t\tconst onError = () => {\n\t\t\tloadPromises.delete(env);\n\t\t\treject(new Error(`[TapiPay] Error al cargar el SDK desde ${SDK_URL}`));\n\t\t};\n\n\t\tif (existingScript) {\n\t\t\texistingScript.addEventListener(\"load\", onLoad);\n\t\t\texistingScript.addEventListener(\"error\", onError);\n\t\t\treturn;\n\t\t}\n\n\t\tconst script = document.createElement(\"script\");\n\t\tscript.id = SCRIPT_ID;\n\t\tscript.src = SDK_URL;\n\t\tscript.async = true;\n\t\tscript.addEventListener(\"load\", onLoad);\n\t\tscript.addEventListener(\"error\", onError);\n\t\tdocument.head.appendChild(script);\n\t});\n\n\tloadPromises.set(env, promise);\n\treturn promise;\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACMA,IAAM,WAA+C;AAAA,EACpD,YAAY;AAAA,EACZ,MAAM;AACP;AAGA,IAAM,eAAe,oBAAI,IAAkD;AAoBpE,SAAS,YACf,SAC2B;AAlC5B;AAmCC,QAAM,OAA0B,wCAAS,gBAAT,YAAwB;AACxD,QAAM,UAAU,SAAS,GAAG;AAC5B,QAAM,YAAY,qBAAqB,GAAG;AAG1C,MAAI,OAAO,WAAW,aAAa;AAClC,WAAO,QAAQ;AAAA,MACd,IAAI,MAAM,yDAAyD;AAAA,IACpE;AAAA,EACD;AAGA,MAAI,OAAO,WAAW,CAAC,OAAO,QAAQ,IAAI;AACzC,WAAO,QAAQ,QAAQ,OAAO,OAAO;AAAA,EACtC;AAGA,QAAM,WAAW,aAAa,IAAI,GAAG;AACrC,MAAI,SAAU,QAAO;AAErB,QAAM,UAAU,IAAI,QAAyB,CAAC,SAAS,WAAW;AAEjE,UAAM,iBAAiB,SAAS;AAAA,MAC/B;AAAA,IACD;AAEA,UAAM,SAAS,MAAM;AACpB,UAAI,OAAO,SAAS;AACnB,gBAAQ,OAAO,OAAO;AAAA,MACvB,OAAO;AACN;AAAA,UACC,IAAI;AAAA,YACH;AAAA,UACD;AAAA,QACD;AAAA,MACD;AAAA,IACD;AAEA,UAAM,UAAU,MAAM;AACrB,mBAAa,OAAO,GAAG;AACvB,aAAO,IAAI,MAAM,0CAA0C,OAAO,EAAE,CAAC;AAAA,IACtE;AAEA,QAAI,gBAAgB;AACnB,qBAAe,iBAAiB,QAAQ,MAAM;AAC9C,qBAAe,iBAAiB,SAAS,OAAO;AAChD;AAAA,IACD;AAEA,UAAM,SAAS,SAAS,cAAc,QAAQ;AAC9C,WAAO,KAAK;AACZ,WAAO,MAAM;AACb,WAAO,QAAQ;AACf,WAAO,iBAAiB,QAAQ,MAAM;AACtC,WAAO,iBAAiB,SAAS,OAAO;AACxC,aAAS,KAAK,YAAY,MAAM;AAAA,EACjC,CAAC;AAED,eAAa,IAAI,KAAK,OAAO;AAC7B,SAAO;AACR;","names":[]}
1
+ {"version":3,"sources":["../src/index.ts","../src/loader.ts"],"sourcesContent":["export { loadTapipay } from \"./loader\";\nexport type {\n\tLoadTapipayOptions,\n\tTapipayAutopayActivatedEvent,\n\tTapipayAutopayAdhesionSummary,\n\tTapipayAutopayErrorEvent,\n\tTapipayAutopayLoadedEvent,\n\tTapipayAutopayMediaType,\n\tTapipayAutopayRemovedEvent,\n\tTapipayDomiciliationAccountType,\n\tTapipayDomiciliationBankSelectedEvent,\n\tTapipayDomiciliationConfirmedEvent,\n\tTapipayDomiciliationFormCompletedEvent,\n\tTapipayDomiciliationVerificationCompletedEvent,\n\tTapipayDomiciliationVerificationMethod,\n\tTapipayEnvironment,\n\tTapipayInstance,\n\tTapipayOptions,\n\tTapipayPaymentCancelledEvent,\n\tTapipayPaymentSubmittedEvent,\n\tTapipayPaymentWindowOpenedEvent,\n\tTapipayView,\n} from \"./types\";\n","import type {\n\tLoadTapipayOptions,\n\tTapipayEnvironment,\n\tTapipayInstance,\n} from \"./types\";\n\nconst SDK_URLS: Record<TapipayEnvironment, string> = {\n\tproduction: \"https://app.tapipay.la/embed.js\",\n\thomo: \"https://homo.tapipay.la/embed.js\",\n};\n\n// Idempotencia por entorno\nconst loadPromises = new Map<TapipayEnvironment, Promise<TapipayInstance>>();\n\n/**\n * Carga el SDK de TapiPay de forma asíncrona inyectando el script en el DOM.\n *\n * - Idempotente por entorno: múltiples llamadas con el mismo `environment` retornan la misma Promise.\n * - Si window.tapipay ya existe (script cargado sync), resuelve inmediatamente.\n * - Compatible con React Strict Mode (doble mount/unmount).\n *\n * @example\n * // Producción (default)\n * const tapipay = await loadTapipay();\n *\n * // Homologación\n * const tapipay = await loadTapipay({ environment: 'homo' });\n *\n * // Se requiere UNO de { organization, companyCode } (companyCode tiene prioridad).\n * tapipay.initialize({ container: \"#widget\", organization: \"acme\", identifier: \"CLI-001\" });\n * tapipay.initialize({ container: \"#widget\", companyCode: \"acme-mx\", identifier: \"CLI-001\" });\n */\nexport function loadTapipay(\n\toptions?: LoadTapipayOptions,\n): Promise<TapipayInstance> {\n\tconst env: TapipayEnvironment = options?.environment ?? \"production\";\n\tconst SDK_URL = SDK_URLS[env];\n\tconst SCRIPT_ID = `tapipay-embed-sdk-${env}`;\n\n\t// SSR guard\n\tif (typeof window === \"undefined\") {\n\t\treturn Promise.reject(\n\t\t\tnew Error(\"[TapiPay] loadTapipay() requires a browser environment.\"),\n\t\t);\n\t}\n\n\t// Ya cargado de forma síncrona (script tag directo)\n\tif (window.tapipay && !window.tapipay._q) {\n\t\treturn Promise.resolve(window.tapipay);\n\t}\n\n\t// Reutilizar promise existente (idempotencia por entorno)\n\tconst existing = loadPromises.get(env);\n\tif (existing) return existing;\n\n\tconst promise = new Promise<TapipayInstance>((resolve, reject) => {\n\t\t// Si ya hay un script inyectado, esperar a que cargue\n\t\tconst existingScript = document.getElementById(\n\t\t\tSCRIPT_ID,\n\t\t) as HTMLScriptElement | null;\n\n\t\tconst onLoad = () => {\n\t\t\tif (window.tapipay) {\n\t\t\t\tresolve(window.tapipay);\n\t\t\t} else {\n\t\t\t\treject(\n\t\t\t\t\tnew Error(\n\t\t\t\t\t\t\"[TapiPay] El script cargó pero window.tapipay no está definido.\",\n\t\t\t\t\t),\n\t\t\t\t);\n\t\t\t}\n\t\t};\n\n\t\tconst onError = () => {\n\t\t\tloadPromises.delete(env);\n\t\t\treject(new Error(`[TapiPay] Error al cargar el SDK desde ${SDK_URL}`));\n\t\t};\n\n\t\tif (existingScript) {\n\t\t\texistingScript.addEventListener(\"load\", onLoad);\n\t\t\texistingScript.addEventListener(\"error\", onError);\n\t\t\treturn;\n\t\t}\n\n\t\tconst script = document.createElement(\"script\");\n\t\tscript.id = SCRIPT_ID;\n\t\tscript.src = SDK_URL;\n\t\tscript.async = true;\n\t\tscript.addEventListener(\"load\", onLoad);\n\t\tscript.addEventListener(\"error\", onError);\n\t\tdocument.head.appendChild(script);\n\t});\n\n\tloadPromises.set(env, promise);\n\treturn promise;\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACMA,IAAM,WAA+C;AAAA,EACpD,YAAY;AAAA,EACZ,MAAM;AACP;AAGA,IAAM,eAAe,oBAAI,IAAkD;AAoBpE,SAAS,YACf,SAC2B;AAlC5B;AAmCC,QAAM,OAA0B,wCAAS,gBAAT,YAAwB;AACxD,QAAM,UAAU,SAAS,GAAG;AAC5B,QAAM,YAAY,qBAAqB,GAAG;AAG1C,MAAI,OAAO,WAAW,aAAa;AAClC,WAAO,QAAQ;AAAA,MACd,IAAI,MAAM,yDAAyD;AAAA,IACpE;AAAA,EACD;AAGA,MAAI,OAAO,WAAW,CAAC,OAAO,QAAQ,IAAI;AACzC,WAAO,QAAQ,QAAQ,OAAO,OAAO;AAAA,EACtC;AAGA,QAAM,WAAW,aAAa,IAAI,GAAG;AACrC,MAAI,SAAU,QAAO;AAErB,QAAM,UAAU,IAAI,QAAyB,CAAC,SAAS,WAAW;AAEjE,UAAM,iBAAiB,SAAS;AAAA,MAC/B;AAAA,IACD;AAEA,UAAM,SAAS,MAAM;AACpB,UAAI,OAAO,SAAS;AACnB,gBAAQ,OAAO,OAAO;AAAA,MACvB,OAAO;AACN;AAAA,UACC,IAAI;AAAA,YACH;AAAA,UACD;AAAA,QACD;AAAA,MACD;AAAA,IACD;AAEA,UAAM,UAAU,MAAM;AACrB,mBAAa,OAAO,GAAG;AACvB,aAAO,IAAI,MAAM,0CAA0C,OAAO,EAAE,CAAC;AAAA,IACtE;AAEA,QAAI,gBAAgB;AACnB,qBAAe,iBAAiB,QAAQ,MAAM;AAC9C,qBAAe,iBAAiB,SAAS,OAAO;AAChD;AAAA,IACD;AAEA,UAAM,SAAS,SAAS,cAAc,QAAQ;AAC9C,WAAO,KAAK;AACZ,WAAO,MAAM;AACb,WAAO,QAAQ;AACf,WAAO,iBAAiB,QAAQ,MAAM;AACtC,WAAO,iBAAiB,SAAS,OAAO;AACxC,aAAS,KAAK,YAAY,MAAM;AAAA,EACjC,CAAC;AAED,eAAa,IAAI,KAAK,OAAO;AAC7B,SAAO;AACR;","names":[]}
package/dist/index.d.cts CHANGED
@@ -1,5 +1,5 @@
1
- import { L as LoadTapipayOptions, T as TapipayInstance } from './types-BPz2Gtxx.cjs';
2
- export { a as TapipayAutopayActivatedEvent, b as TapipayAutopayAdhesionSummary, c as TapipayAutopayErrorEvent, d as TapipayAutopayLoadedEvent, e as TapipayAutopayMediaType, f as TapipayAutopayRemovedEvent, g as TapipayEnvironment, h as TapipayOptions, i as TapipayPaymentCancelledEvent, j as TapipayPaymentSubmittedEvent, k as TapipayPaymentWindowOpenedEvent, l as TapipayView } from './types-BPz2Gtxx.cjs';
1
+ import { L as LoadTapipayOptions, T as TapipayInstance } from './types-CJRvC3_b.cjs';
2
+ export { a as TapipayAutopayActivatedEvent, b as TapipayAutopayAdhesionSummary, c as TapipayAutopayErrorEvent, d as TapipayAutopayLoadedEvent, e as TapipayAutopayMediaType, f as TapipayAutopayRemovedEvent, g as TapipayDomiciliationAccountType, h as TapipayDomiciliationBankSelectedEvent, i as TapipayDomiciliationConfirmedEvent, j as TapipayDomiciliationFormCompletedEvent, k as TapipayDomiciliationVerificationCompletedEvent, l as TapipayDomiciliationVerificationMethod, m as TapipayEnvironment, n as TapipayOptions, o as TapipayPaymentCancelledEvent, p as TapipayPaymentSubmittedEvent, q as TapipayPaymentWindowOpenedEvent, r as TapipayView } from './types-CJRvC3_b.cjs';
3
3
 
4
4
  /**
5
5
  * Carga el SDK de TapiPay de forma asíncrona inyectando el script en el DOM.
package/dist/index.d.ts CHANGED
@@ -1,5 +1,5 @@
1
- import { L as LoadTapipayOptions, T as TapipayInstance } from './types-BPz2Gtxx.js';
2
- export { a as TapipayAutopayActivatedEvent, b as TapipayAutopayAdhesionSummary, c as TapipayAutopayErrorEvent, d as TapipayAutopayLoadedEvent, e as TapipayAutopayMediaType, f as TapipayAutopayRemovedEvent, g as TapipayEnvironment, h as TapipayOptions, i as TapipayPaymentCancelledEvent, j as TapipayPaymentSubmittedEvent, k as TapipayPaymentWindowOpenedEvent, l as TapipayView } from './types-BPz2Gtxx.js';
1
+ import { L as LoadTapipayOptions, T as TapipayInstance } from './types-CJRvC3_b.js';
2
+ export { a as TapipayAutopayActivatedEvent, b as TapipayAutopayAdhesionSummary, c as TapipayAutopayErrorEvent, d as TapipayAutopayLoadedEvent, e as TapipayAutopayMediaType, f as TapipayAutopayRemovedEvent, g as TapipayDomiciliationAccountType, h as TapipayDomiciliationBankSelectedEvent, i as TapipayDomiciliationConfirmedEvent, j as TapipayDomiciliationFormCompletedEvent, k as TapipayDomiciliationVerificationCompletedEvent, l as TapipayDomiciliationVerificationMethod, m as TapipayEnvironment, n as TapipayOptions, o as TapipayPaymentCancelledEvent, p as TapipayPaymentSubmittedEvent, q as TapipayPaymentWindowOpenedEvent, r as TapipayView } from './types-CJRvC3_b.js';
3
3
 
4
4
  /**
5
5
  * Carga el SDK de TapiPay de forma asíncrona inyectando el script en el DOM.
package/dist/react.cjs CHANGED
@@ -117,6 +117,10 @@ function TapipayWidget({
117
117
  onAutopayActivated,
118
118
  onAutopayRemoved,
119
119
  onAutopayError,
120
+ onDomiciliationBankSelected,
121
+ onDomiciliationFormCompleted,
122
+ onDomiciliationVerificationCompleted,
123
+ onDomiciliationConfirmed,
120
124
  className,
121
125
  style
122
126
  }) {
@@ -128,6 +132,12 @@ function TapipayWidget({
128
132
  const onAutopayActivatedRef = (0, import_react.useRef)(onAutopayActivated);
129
133
  const onAutopayRemovedRef = (0, import_react.useRef)(onAutopayRemoved);
130
134
  const onAutopayErrorRef = (0, import_react.useRef)(onAutopayError);
135
+ const onDomiciliationBankSelectedRef = (0, import_react.useRef)(onDomiciliationBankSelected);
136
+ const onDomiciliationFormCompletedRef = (0, import_react.useRef)(onDomiciliationFormCompleted);
137
+ const onDomiciliationVerificationCompletedRef = (0, import_react.useRef)(
138
+ onDomiciliationVerificationCompleted
139
+ );
140
+ const onDomiciliationConfirmedRef = (0, import_react.useRef)(onDomiciliationConfirmed);
131
141
  (0, import_react.useEffect)(() => {
132
142
  onPaymentWindowOpenedRef.current = onPaymentWindowOpened;
133
143
  }, [onPaymentWindowOpened]);
@@ -149,6 +159,18 @@ function TapipayWidget({
149
159
  (0, import_react.useEffect)(() => {
150
160
  onAutopayErrorRef.current = onAutopayError;
151
161
  }, [onAutopayError]);
162
+ (0, import_react.useEffect)(() => {
163
+ onDomiciliationBankSelectedRef.current = onDomiciliationBankSelected;
164
+ }, [onDomiciliationBankSelected]);
165
+ (0, import_react.useEffect)(() => {
166
+ onDomiciliationFormCompletedRef.current = onDomiciliationFormCompleted;
167
+ }, [onDomiciliationFormCompleted]);
168
+ (0, import_react.useEffect)(() => {
169
+ onDomiciliationVerificationCompletedRef.current = onDomiciliationVerificationCompleted;
170
+ }, [onDomiciliationVerificationCompleted]);
171
+ (0, import_react.useEffect)(() => {
172
+ onDomiciliationConfirmedRef.current = onDomiciliationConfirmed;
173
+ }, [onDomiciliationConfirmed]);
152
174
  (0, import_react.useEffect)(() => {
153
175
  if (!containerRef.current) return;
154
176
  const container = containerRef.current;
@@ -182,6 +204,22 @@ function TapipayWidget({
182
204
  var _a;
183
205
  (_a = onAutopayErrorRef.current) == null ? void 0 : _a.call(onAutopayErrorRef, data);
184
206
  };
207
+ const handleDomiciliationBankSelected = (data) => {
208
+ var _a;
209
+ (_a = onDomiciliationBankSelectedRef.current) == null ? void 0 : _a.call(onDomiciliationBankSelectedRef, data);
210
+ };
211
+ const handleDomiciliationFormCompleted = (data) => {
212
+ var _a;
213
+ (_a = onDomiciliationFormCompletedRef.current) == null ? void 0 : _a.call(onDomiciliationFormCompletedRef, data);
214
+ };
215
+ const handleDomiciliationVerificationCompleted = (data) => {
216
+ var _a;
217
+ (_a = onDomiciliationVerificationCompletedRef.current) == null ? void 0 : _a.call(onDomiciliationVerificationCompletedRef, data);
218
+ };
219
+ const handleDomiciliationConfirmed = (data) => {
220
+ var _a;
221
+ (_a = onDomiciliationConfirmedRef.current) == null ? void 0 : _a.call(onDomiciliationConfirmedRef, data);
222
+ };
185
223
  loadTapipay({ environment }).then((instance) => {
186
224
  if (cancelled) return;
187
225
  tapipayInstance = instance;
@@ -192,6 +230,16 @@ function TapipayWidget({
192
230
  instance.on("autopayActivated", handleAutopayActivated);
193
231
  instance.on("autopayRemoved", handleAutopayRemoved);
194
232
  instance.on("autopayError", handleAutopayError);
233
+ instance.on("domiciliationBankSelected", handleDomiciliationBankSelected);
234
+ instance.on(
235
+ "domiciliationFormCompleted",
236
+ handleDomiciliationFormCompleted
237
+ );
238
+ instance.on(
239
+ "domiciliationVerificationCompleted",
240
+ handleDomiciliationVerificationCompleted
241
+ );
242
+ instance.on("domiciliationConfirmed", handleDomiciliationConfirmed);
195
243
  instance.initialize({
196
244
  container,
197
245
  organization,
@@ -212,6 +260,22 @@ function TapipayWidget({
212
260
  tapipayInstance.off("autopayActivated", handleAutopayActivated);
213
261
  tapipayInstance.off("autopayRemoved", handleAutopayRemoved);
214
262
  tapipayInstance.off("autopayError", handleAutopayError);
263
+ tapipayInstance.off(
264
+ "domiciliationBankSelected",
265
+ handleDomiciliationBankSelected
266
+ );
267
+ tapipayInstance.off(
268
+ "domiciliationFormCompleted",
269
+ handleDomiciliationFormCompleted
270
+ );
271
+ tapipayInstance.off(
272
+ "domiciliationVerificationCompleted",
273
+ handleDomiciliationVerificationCompleted
274
+ );
275
+ tapipayInstance.off(
276
+ "domiciliationConfirmed",
277
+ handleDomiciliationConfirmed
278
+ );
215
279
  tapipayInstance.destroy(container);
216
280
  }
217
281
  };
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/react.tsx","../src/loader.ts"],"sourcesContent":["import { useEffect, useRef, useState } from \"react\";\nimport { loadTapipay } from \"./loader\";\nimport type {\n\tLoadTapipayOptions,\n\tTapipayAutopayActivatedEvent,\n\tTapipayAutopayErrorEvent,\n\tTapipayAutopayLoadedEvent,\n\tTapipayAutopayRemovedEvent,\n\tTapipayEnvironment,\n\tTapipayInstance,\n\tTapipayOptions,\n\tTapipayPaymentCancelledEvent,\n\tTapipayPaymentSubmittedEvent,\n\tTapipayPaymentWindowOpenedEvent,\n} from \"./types\";\n\n// ─── useTapipay hook ──────────────────────────────────────────────────────────\n\n/**\n * Hook de bajo nivel que carga el SDK y retorna la instancia.\n * Útil cuando necesitas control manual sobre initialize/destroy.\n *\n * @example\n * const { tapipay, error } = useTapipay();\n * const { tapipay, error } = useTapipay({ environment: 'homo' });\n */\nexport function useTapipay(options?: LoadTapipayOptions): {\n\ttapipay: TapipayInstance | null;\n\terror: Error | null;\n} {\n\tconst [tapipay, setTapipay] = useState<TapipayInstance | null>(null);\n\tconst [error, setError] = useState<Error | null>(null);\n\tconst environment = options?.environment;\n\n\tuseEffect(() => {\n\t\tlet cancelled = false;\n\t\tloadTapipay({ environment })\n\t\t\t.then((instance) => {\n\t\t\t\tif (!cancelled) setTapipay(instance);\n\t\t\t})\n\t\t\t.catch((err: Error) => {\n\t\t\t\tif (!cancelled) setError(err);\n\t\t\t});\n\t\treturn () => {\n\t\t\tcancelled = true;\n\t\t};\n\t}, [environment]);\n\n\treturn { tapipay, error };\n}\n\n// ─── TapipayWidget component ──────────────────────────────────────────────────\n\nexport interface TapipayWidgetProps extends Omit<TapipayOptions, \"container\"> {\n\t/** Entorno del SDK a cargar. Por defecto `'production'`. Usar `'homo'` para homologación. */\n\tenvironment?: TapipayEnvironment;\n\t/** Callback invocado cuando el popup de Yuno se abre exitosamente. */\n\tonPaymentWindowOpened?: (data: TapipayPaymentWindowOpenedEvent) => void;\n\t/** Callback invocado cuando el usuario completó el formulario de Yuno y fue redirigido al callback. */\n\tonPaymentSubmitted?: (data: TapipayPaymentSubmittedEvent) => void;\n\t/** Callback invocado cuando el usuario cierra el popup sin completar el pago. */\n\tonCancelled?: (data: TapipayPaymentCancelledEvent) => void;\n\t/** (Vista autopay) Callback con el conjunto de adhesiones activas; se reinvoca cuando la lista cambia. */\n\tonAutopayLoaded?: (data: TapipayAutopayLoadedEvent) => void;\n\t/** (Vista autopay) Callback cuando una nueva adhesión queda activa (una sola vez por adhesión nueva). */\n\tonAutopayActivated?: (data: TapipayAutopayActivatedEvent) => void;\n\t/** (Vista autopay) Callback cuando el usuario desadhiere un medio con éxito. */\n\tonAutopayRemoved?: (data: TapipayAutopayRemovedEvent) => void;\n\t/** (Vista autopay) Callback ante un error de carga de adhesiones o de desadhesión. */\n\tonAutopayError?: (data: TapipayAutopayErrorEvent) => void;\n\t/** Clases CSS adicionales para el contenedor del widget. */\n\tclassName?: string;\n\t/** Estilos inline adicionales para el contenedor del widget. */\n\tstyle?: React.CSSProperties;\n}\n\n/**\n * Componente React que encapsula el widget de pago TapiPay.\n *\n * Maneja internamente la carga del SDK, el ciclo de vida del widget\n * y el cleanup al desmontar. Compatible con React Strict Mode.\n *\n * Se requiere `identifier` + UNO de `{ organization, companyCode }`.\n * Si se pasan ambos, `companyCode` tiene prioridad.\n *\n * @example\n * // Vista de pagos (default)\n * <TapipayWidget\n * organization=\"acme\"\n * identifier=\"CLI-001\"\n * externalRequestId=\"FAC-2024-001\"\n * onPaymentSubmitted={(data) => console.log(\"Pago enviado\", data)}\n * onCancelled={() => console.log(\"Pago cancelado por el usuario\")}\n * />\n *\n * @example\n * // Usando companyCode en lugar de organization\n * <TapipayWidget companyCode=\"acme-mx\" identifier=\"CLI-001\" />\n *\n * @example\n * // Vista de gestión de adhesiones de autopay\n * <TapipayWidget\n * organization=\"acme\"\n * identifier=\"CLI-001\"\n * view=\"autopay\"\n * onAutopayLoaded={(data) => console.log(\"Adhesiones\", data.count)}\n * onAutopayActivated={(data) => console.log(\"Adhesión activada\", data.id)}\n * onAutopayRemoved={(data) => console.log(\"Adhesión eliminada\", data.id)}\n * />\n */\nexport function TapipayWidget({\n\torganization,\n\tcompanyCode,\n\tidentifier,\n\texternalRequestId,\n\tselectionStrategy,\n\tview,\n\tenvironment,\n\tonPaymentWindowOpened,\n\tonPaymentSubmitted,\n\tonCancelled,\n\tonAutopayLoaded,\n\tonAutopayActivated,\n\tonAutopayRemoved,\n\tonAutopayError,\n\tclassName,\n\tstyle,\n}: TapipayWidgetProps) {\n\tconst containerRef = useRef<HTMLDivElement>(null);\n\t// Refs para evitar re-renders innecesarios y closures estáticos en useEffect\n\tconst onPaymentWindowOpenedRef = useRef(onPaymentWindowOpened);\n\tconst onPaymentSubmittedRef = useRef(onPaymentSubmitted);\n\tconst onCancelledRef = useRef(onCancelled);\n\tconst onAutopayLoadedRef = useRef(onAutopayLoaded);\n\tconst onAutopayActivatedRef = useRef(onAutopayActivated);\n\tconst onAutopayRemovedRef = useRef(onAutopayRemoved);\n\tconst onAutopayErrorRef = useRef(onAutopayError);\n\n\tuseEffect(() => {\n\t\tonPaymentWindowOpenedRef.current = onPaymentWindowOpened;\n\t}, [onPaymentWindowOpened]);\n\n\tuseEffect(() => {\n\t\tonPaymentSubmittedRef.current = onPaymentSubmitted;\n\t}, [onPaymentSubmitted]);\n\n\tuseEffect(() => {\n\t\tonCancelledRef.current = onCancelled;\n\t}, [onCancelled]);\n\n\tuseEffect(() => {\n\t\tonAutopayLoadedRef.current = onAutopayLoaded;\n\t}, [onAutopayLoaded]);\n\n\tuseEffect(() => {\n\t\tonAutopayActivatedRef.current = onAutopayActivated;\n\t}, [onAutopayActivated]);\n\n\tuseEffect(() => {\n\t\tonAutopayRemovedRef.current = onAutopayRemoved;\n\t}, [onAutopayRemoved]);\n\n\tuseEffect(() => {\n\t\tonAutopayErrorRef.current = onAutopayError;\n\t}, [onAutopayError]);\n\n\tuseEffect(() => {\n\t\tif (!containerRef.current) return;\n\t\tconst container = containerRef.current;\n\n\t\tlet tapipayInstance: TapipayInstance | null = null;\n\t\tlet cancelled = false;\n\n\t\tconst handlePaymentWindowOpened = (\n\t\t\tdata: TapipayPaymentWindowOpenedEvent,\n\t\t) => {\n\t\t\tonPaymentWindowOpenedRef.current?.(data);\n\t\t};\n\t\tconst handlePaymentSubmitted = (data: TapipayPaymentSubmittedEvent) => {\n\t\t\tonPaymentSubmittedRef.current?.(data);\n\t\t};\n\t\tconst handleCancelled = (data: TapipayPaymentCancelledEvent) => {\n\t\t\tonCancelledRef.current?.(data);\n\t\t};\n\t\tconst handleAutopayLoaded = (data: TapipayAutopayLoadedEvent) => {\n\t\t\tonAutopayLoadedRef.current?.(data);\n\t\t};\n\t\tconst handleAutopayActivated = (data: TapipayAutopayActivatedEvent) => {\n\t\t\tonAutopayActivatedRef.current?.(data);\n\t\t};\n\t\tconst handleAutopayRemoved = (data: TapipayAutopayRemovedEvent) => {\n\t\t\tonAutopayRemovedRef.current?.(data);\n\t\t};\n\t\tconst handleAutopayError = (data: TapipayAutopayErrorEvent) => {\n\t\t\tonAutopayErrorRef.current?.(data);\n\t\t};\n\n\t\tloadTapipay({ environment }).then((instance) => {\n\t\t\tif (cancelled) return;\n\t\t\ttapipayInstance = instance;\n\n\t\t\tinstance.on(\"paymentWindowOpened\", handlePaymentWindowOpened);\n\t\t\tinstance.on(\"paymentSubmitted\", handlePaymentSubmitted);\n\t\t\tinstance.on(\"paymentCancelled\", handleCancelled);\n\t\t\tinstance.on(\"autopayLoaded\", handleAutopayLoaded);\n\t\t\tinstance.on(\"autopayActivated\", handleAutopayActivated);\n\t\t\tinstance.on(\"autopayRemoved\", handleAutopayRemoved);\n\t\t\tinstance.on(\"autopayError\", handleAutopayError);\n\n\t\t\tinstance.initialize({\n\t\t\t\tcontainer,\n\t\t\t\torganization,\n\t\t\t\tcompanyCode,\n\t\t\t\tidentifier,\n\t\t\t\texternalRequestId,\n\t\t\t\tselectionStrategy,\n\t\t\t\tview,\n\t\t\t});\n\t\t});\n\n\t\treturn () => {\n\t\t\tcancelled = true;\n\t\t\tif (tapipayInstance) {\n\t\t\t\ttapipayInstance.off(\"paymentWindowOpened\", handlePaymentWindowOpened);\n\t\t\t\ttapipayInstance.off(\"paymentSubmitted\", handlePaymentSubmitted);\n\t\t\t\ttapipayInstance.off(\"paymentCancelled\", handleCancelled);\n\t\t\t\ttapipayInstance.off(\"autopayLoaded\", handleAutopayLoaded);\n\t\t\t\ttapipayInstance.off(\"autopayActivated\", handleAutopayActivated);\n\t\t\t\ttapipayInstance.off(\"autopayRemoved\", handleAutopayRemoved);\n\t\t\t\ttapipayInstance.off(\"autopayError\", handleAutopayError);\n\t\t\t\ttapipayInstance.destroy(container);\n\t\t\t}\n\t\t};\n\t\t// El widget se re-monta si cambian los parámetros de identificación o entorno\n\t\t// eslint-disable-next-line react-hooks/exhaustive-deps\n\t}, [\n\t\torganization,\n\t\tcompanyCode,\n\t\tidentifier,\n\t\texternalRequestId,\n\t\tselectionStrategy,\n\t\tview,\n\t\tenvironment,\n\t]);\n\n\treturn <div ref={containerRef} className={className} style={style} />;\n}\n","import type {\n\tLoadTapipayOptions,\n\tTapipayEnvironment,\n\tTapipayInstance,\n} from \"./types\";\n\nconst SDK_URLS: Record<TapipayEnvironment, string> = {\n\tproduction: \"https://app.tapipay.la/embed.js\",\n\thomo: \"https://homo.tapipay.la/embed.js\",\n};\n\n// Idempotencia por entorno\nconst loadPromises = new Map<TapipayEnvironment, Promise<TapipayInstance>>();\n\n/**\n * Carga el SDK de TapiPay de forma asíncrona inyectando el script en el DOM.\n *\n * - Idempotente por entorno: múltiples llamadas con el mismo `environment` retornan la misma Promise.\n * - Si window.tapipay ya existe (script cargado sync), resuelve inmediatamente.\n * - Compatible con React Strict Mode (doble mount/unmount).\n *\n * @example\n * // Producción (default)\n * const tapipay = await loadTapipay();\n *\n * // Homologación\n * const tapipay = await loadTapipay({ environment: 'homo' });\n *\n * // Se requiere UNO de { organization, companyCode } (companyCode tiene prioridad).\n * tapipay.initialize({ container: \"#widget\", organization: \"acme\", identifier: \"CLI-001\" });\n * tapipay.initialize({ container: \"#widget\", companyCode: \"acme-mx\", identifier: \"CLI-001\" });\n */\nexport function loadTapipay(\n\toptions?: LoadTapipayOptions,\n): Promise<TapipayInstance> {\n\tconst env: TapipayEnvironment = options?.environment ?? \"production\";\n\tconst SDK_URL = SDK_URLS[env];\n\tconst SCRIPT_ID = `tapipay-embed-sdk-${env}`;\n\n\t// SSR guard\n\tif (typeof window === \"undefined\") {\n\t\treturn Promise.reject(\n\t\t\tnew Error(\"[TapiPay] loadTapipay() requires a browser environment.\"),\n\t\t);\n\t}\n\n\t// Ya cargado de forma síncrona (script tag directo)\n\tif (window.tapipay && !window.tapipay._q) {\n\t\treturn Promise.resolve(window.tapipay);\n\t}\n\n\t// Reutilizar promise existente (idempotencia por entorno)\n\tconst existing = loadPromises.get(env);\n\tif (existing) return existing;\n\n\tconst promise = new Promise<TapipayInstance>((resolve, reject) => {\n\t\t// Si ya hay un script inyectado, esperar a que cargue\n\t\tconst existingScript = document.getElementById(\n\t\t\tSCRIPT_ID,\n\t\t) as HTMLScriptElement | null;\n\n\t\tconst onLoad = () => {\n\t\t\tif (window.tapipay) {\n\t\t\t\tresolve(window.tapipay);\n\t\t\t} else {\n\t\t\t\treject(\n\t\t\t\t\tnew Error(\n\t\t\t\t\t\t\"[TapiPay] El script cargó pero window.tapipay no está definido.\",\n\t\t\t\t\t),\n\t\t\t\t);\n\t\t\t}\n\t\t};\n\n\t\tconst onError = () => {\n\t\t\tloadPromises.delete(env);\n\t\t\treject(new Error(`[TapiPay] Error al cargar el SDK desde ${SDK_URL}`));\n\t\t};\n\n\t\tif (existingScript) {\n\t\t\texistingScript.addEventListener(\"load\", onLoad);\n\t\t\texistingScript.addEventListener(\"error\", onError);\n\t\t\treturn;\n\t\t}\n\n\t\tconst script = document.createElement(\"script\");\n\t\tscript.id = SCRIPT_ID;\n\t\tscript.src = SDK_URL;\n\t\tscript.async = true;\n\t\tscript.addEventListener(\"load\", onLoad);\n\t\tscript.addEventListener(\"error\", onError);\n\t\tdocument.head.appendChild(script);\n\t});\n\n\tloadPromises.set(env, promise);\n\treturn promise;\n}\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../src/react.tsx","../src/loader.ts"],"sourcesContent":["import { useEffect, useRef, useState } from \"react\";\nimport { loadTapipay } from \"./loader\";\nimport type {\n\tLoadTapipayOptions,\n\tTapipayAutopayActivatedEvent,\n\tTapipayAutopayErrorEvent,\n\tTapipayAutopayLoadedEvent,\n\tTapipayAutopayRemovedEvent,\n\tTapipayDomiciliationBankSelectedEvent,\n\tTapipayDomiciliationConfirmedEvent,\n\tTapipayDomiciliationFormCompletedEvent,\n\tTapipayDomiciliationVerificationCompletedEvent,\n\tTapipayEnvironment,\n\tTapipayInstance,\n\tTapipayOptions,\n\tTapipayPaymentCancelledEvent,\n\tTapipayPaymentSubmittedEvent,\n\tTapipayPaymentWindowOpenedEvent,\n} from \"./types\";\n\n// ─── useTapipay hook ──────────────────────────────────────────────────────────\n\n/**\n * Hook de bajo nivel que carga el SDK y retorna la instancia.\n * Útil cuando necesitas control manual sobre initialize/destroy.\n *\n * @example\n * const { tapipay, error } = useTapipay();\n * const { tapipay, error } = useTapipay({ environment: 'homo' });\n */\nexport function useTapipay(options?: LoadTapipayOptions): {\n\ttapipay: TapipayInstance | null;\n\terror: Error | null;\n} {\n\tconst [tapipay, setTapipay] = useState<TapipayInstance | null>(null);\n\tconst [error, setError] = useState<Error | null>(null);\n\tconst environment = options?.environment;\n\n\tuseEffect(() => {\n\t\tlet cancelled = false;\n\t\tloadTapipay({ environment })\n\t\t\t.then((instance) => {\n\t\t\t\tif (!cancelled) setTapipay(instance);\n\t\t\t})\n\t\t\t.catch((err: Error) => {\n\t\t\t\tif (!cancelled) setError(err);\n\t\t\t});\n\t\treturn () => {\n\t\t\tcancelled = true;\n\t\t};\n\t}, [environment]);\n\n\treturn { tapipay, error };\n}\n\n// ─── TapipayWidget component ──────────────────────────────────────────────────\n\nexport interface TapipayWidgetProps extends Omit<TapipayOptions, \"container\"> {\n\t/** Entorno del SDK a cargar. Por defecto `'production'`. Usar `'homo'` para homologación. */\n\tenvironment?: TapipayEnvironment;\n\t/** Callback invocado cuando el popup de Yuno se abre exitosamente. */\n\tonPaymentWindowOpened?: (data: TapipayPaymentWindowOpenedEvent) => void;\n\t/** Callback invocado cuando el usuario completó el formulario de Yuno y fue redirigido al callback. */\n\tonPaymentSubmitted?: (data: TapipayPaymentSubmittedEvent) => void;\n\t/** Callback invocado cuando el usuario cierra el popup sin completar el pago. */\n\tonCancelled?: (data: TapipayPaymentCancelledEvent) => void;\n\t/** (Vista autopay) Callback con el conjunto de adhesiones activas; se reinvoca cuando la lista cambia. */\n\tonAutopayLoaded?: (data: TapipayAutopayLoadedEvent) => void;\n\t/** (Vista autopay) Callback cuando una nueva adhesión queda activa (una sola vez por adhesión nueva). */\n\tonAutopayActivated?: (data: TapipayAutopayActivatedEvent) => void;\n\t/** (Vista autopay) Callback cuando el usuario desadhiere un medio con éxito. */\n\tonAutopayRemoved?: (data: TapipayAutopayRemovedEvent) => void;\n\t/** (Vista autopay) Callback ante un error de carga de adhesiones o de desadhesión. */\n\tonAutopayError?: (data: TapipayAutopayErrorEvent) => void;\n\t/** (Vista autopay) El usuario eligió su banco en el alta de domiciliación. Emite en cada cambio de selección. */\n\tonDomiciliationBankSelected?: (\n\t\tdata: TapipayDomiciliationBankSelectedEvent,\n\t) => void;\n\t/** (Vista autopay) Los datos de la cuenta pasaron la validación del backend. Ojo: dispara al confirmar el método de verificación, no al salir del formulario. */\n\tonDomiciliationFormCompleted?: (\n\t\tdata: TapipayDomiciliationFormCompletedEvent,\n\t) => void;\n\t/** (Vista autopay) La verificación llegó a un desenlace. Solo emite al outcome final: un intento fallido con reintentos disponibles NO dispara el evento. */\n\tonDomiciliationVerificationCompleted?: (\n\t\tdata: TapipayDomiciliationVerificationCompletedEvent,\n\t) => void;\n\t/** (Vista autopay) El usuario confirmó la domiciliación. NO significa que quedó registrada — la confirmación real llega por `onAutopayActivated`. */\n\tonDomiciliationConfirmed?: (data: TapipayDomiciliationConfirmedEvent) => void;\n\t/** Clases CSS adicionales para el contenedor del widget. */\n\tclassName?: string;\n\t/** Estilos inline adicionales para el contenedor del widget. */\n\tstyle?: React.CSSProperties;\n}\n\n/**\n * Componente React que encapsula el widget de pago TapiPay.\n *\n * Maneja internamente la carga del SDK, el ciclo de vida del widget\n * y el cleanup al desmontar. Compatible con React Strict Mode.\n *\n * Se requiere `identifier` + UNO de `{ organization, companyCode }`.\n * Si se pasan ambos, `companyCode` tiene prioridad.\n *\n * @example\n * // Vista de pagos (default)\n * <TapipayWidget\n * organization=\"acme\"\n * identifier=\"CLI-001\"\n * externalRequestId=\"FAC-2024-001\"\n * onPaymentSubmitted={(data) => console.log(\"Pago enviado\", data)}\n * onCancelled={() => console.log(\"Pago cancelado por el usuario\")}\n * />\n *\n * @example\n * // Usando companyCode en lugar de organization\n * <TapipayWidget companyCode=\"acme-mx\" identifier=\"CLI-001\" />\n *\n * @example\n * // Vista de gestión de adhesiones de autopay\n * <TapipayWidget\n * organization=\"acme\"\n * identifier=\"CLI-001\"\n * view=\"autopay\"\n * onAutopayLoaded={(data) => console.log(\"Adhesiones\", data.count)}\n * onAutopayActivated={(data) => console.log(\"Adhesión activada\", data.id)}\n * onAutopayRemoved={(data) => console.log(\"Adhesión eliminada\", data.id)}\n * onDomiciliationBankSelected={(data) => console.log(\"Banco\", data.name)}\n * onDomiciliationFormCompleted={(data) => console.log(\"Cuenta ****\" + data.lastFour)}\n * onDomiciliationVerificationCompleted={(data) => console.log(\"Verificación\", data.outcome)}\n * onDomiciliationConfirmed={() => console.log(\"Enviado — esperar onAutopayActivated\")}\n * />\n */\nexport function TapipayWidget({\n\torganization,\n\tcompanyCode,\n\tidentifier,\n\texternalRequestId,\n\tselectionStrategy,\n\tview,\n\tenvironment,\n\tonPaymentWindowOpened,\n\tonPaymentSubmitted,\n\tonCancelled,\n\tonAutopayLoaded,\n\tonAutopayActivated,\n\tonAutopayRemoved,\n\tonAutopayError,\n\tonDomiciliationBankSelected,\n\tonDomiciliationFormCompleted,\n\tonDomiciliationVerificationCompleted,\n\tonDomiciliationConfirmed,\n\tclassName,\n\tstyle,\n}: TapipayWidgetProps) {\n\tconst containerRef = useRef<HTMLDivElement>(null);\n\t// Refs para evitar re-renders innecesarios y closures estáticos en useEffect\n\tconst onPaymentWindowOpenedRef = useRef(onPaymentWindowOpened);\n\tconst onPaymentSubmittedRef = useRef(onPaymentSubmitted);\n\tconst onCancelledRef = useRef(onCancelled);\n\tconst onAutopayLoadedRef = useRef(onAutopayLoaded);\n\tconst onAutopayActivatedRef = useRef(onAutopayActivated);\n\tconst onAutopayRemovedRef = useRef(onAutopayRemoved);\n\tconst onAutopayErrorRef = useRef(onAutopayError);\n\tconst onDomiciliationBankSelectedRef = useRef(onDomiciliationBankSelected);\n\tconst onDomiciliationFormCompletedRef = useRef(onDomiciliationFormCompleted);\n\tconst onDomiciliationVerificationCompletedRef = useRef(\n\t\tonDomiciliationVerificationCompleted,\n\t);\n\tconst onDomiciliationConfirmedRef = useRef(onDomiciliationConfirmed);\n\n\tuseEffect(() => {\n\t\tonPaymentWindowOpenedRef.current = onPaymentWindowOpened;\n\t}, [onPaymentWindowOpened]);\n\n\tuseEffect(() => {\n\t\tonPaymentSubmittedRef.current = onPaymentSubmitted;\n\t}, [onPaymentSubmitted]);\n\n\tuseEffect(() => {\n\t\tonCancelledRef.current = onCancelled;\n\t}, [onCancelled]);\n\n\tuseEffect(() => {\n\t\tonAutopayLoadedRef.current = onAutopayLoaded;\n\t}, [onAutopayLoaded]);\n\n\tuseEffect(() => {\n\t\tonAutopayActivatedRef.current = onAutopayActivated;\n\t}, [onAutopayActivated]);\n\n\tuseEffect(() => {\n\t\tonAutopayRemovedRef.current = onAutopayRemoved;\n\t}, [onAutopayRemoved]);\n\n\tuseEffect(() => {\n\t\tonAutopayErrorRef.current = onAutopayError;\n\t}, [onAutopayError]);\n\n\tuseEffect(() => {\n\t\tonDomiciliationBankSelectedRef.current = onDomiciliationBankSelected;\n\t}, [onDomiciliationBankSelected]);\n\n\tuseEffect(() => {\n\t\tonDomiciliationFormCompletedRef.current = onDomiciliationFormCompleted;\n\t}, [onDomiciliationFormCompleted]);\n\n\tuseEffect(() => {\n\t\tonDomiciliationVerificationCompletedRef.current =\n\t\t\tonDomiciliationVerificationCompleted;\n\t}, [onDomiciliationVerificationCompleted]);\n\n\tuseEffect(() => {\n\t\tonDomiciliationConfirmedRef.current = onDomiciliationConfirmed;\n\t}, [onDomiciliationConfirmed]);\n\n\tuseEffect(() => {\n\t\tif (!containerRef.current) return;\n\t\tconst container = containerRef.current;\n\n\t\tlet tapipayInstance: TapipayInstance | null = null;\n\t\tlet cancelled = false;\n\n\t\tconst handlePaymentWindowOpened = (\n\t\t\tdata: TapipayPaymentWindowOpenedEvent,\n\t\t) => {\n\t\t\tonPaymentWindowOpenedRef.current?.(data);\n\t\t};\n\t\tconst handlePaymentSubmitted = (data: TapipayPaymentSubmittedEvent) => {\n\t\t\tonPaymentSubmittedRef.current?.(data);\n\t\t};\n\t\tconst handleCancelled = (data: TapipayPaymentCancelledEvent) => {\n\t\t\tonCancelledRef.current?.(data);\n\t\t};\n\t\tconst handleAutopayLoaded = (data: TapipayAutopayLoadedEvent) => {\n\t\t\tonAutopayLoadedRef.current?.(data);\n\t\t};\n\t\tconst handleAutopayActivated = (data: TapipayAutopayActivatedEvent) => {\n\t\t\tonAutopayActivatedRef.current?.(data);\n\t\t};\n\t\tconst handleAutopayRemoved = (data: TapipayAutopayRemovedEvent) => {\n\t\t\tonAutopayRemovedRef.current?.(data);\n\t\t};\n\t\tconst handleAutopayError = (data: TapipayAutopayErrorEvent) => {\n\t\t\tonAutopayErrorRef.current?.(data);\n\t\t};\n\t\tconst handleDomiciliationBankSelected = (\n\t\t\tdata: TapipayDomiciliationBankSelectedEvent,\n\t\t) => {\n\t\t\tonDomiciliationBankSelectedRef.current?.(data);\n\t\t};\n\t\tconst handleDomiciliationFormCompleted = (\n\t\t\tdata: TapipayDomiciliationFormCompletedEvent,\n\t\t) => {\n\t\t\tonDomiciliationFormCompletedRef.current?.(data);\n\t\t};\n\t\tconst handleDomiciliationVerificationCompleted = (\n\t\t\tdata: TapipayDomiciliationVerificationCompletedEvent,\n\t\t) => {\n\t\t\tonDomiciliationVerificationCompletedRef.current?.(data);\n\t\t};\n\t\tconst handleDomiciliationConfirmed = (\n\t\t\tdata: TapipayDomiciliationConfirmedEvent,\n\t\t) => {\n\t\t\tonDomiciliationConfirmedRef.current?.(data);\n\t\t};\n\n\t\tloadTapipay({ environment }).then((instance) => {\n\t\t\tif (cancelled) return;\n\t\t\ttapipayInstance = instance;\n\n\t\t\tinstance.on(\"paymentWindowOpened\", handlePaymentWindowOpened);\n\t\t\tinstance.on(\"paymentSubmitted\", handlePaymentSubmitted);\n\t\t\tinstance.on(\"paymentCancelled\", handleCancelled);\n\t\t\tinstance.on(\"autopayLoaded\", handleAutopayLoaded);\n\t\t\tinstance.on(\"autopayActivated\", handleAutopayActivated);\n\t\t\tinstance.on(\"autopayRemoved\", handleAutopayRemoved);\n\t\t\tinstance.on(\"autopayError\", handleAutopayError);\n\t\t\tinstance.on(\"domiciliationBankSelected\", handleDomiciliationBankSelected);\n\t\t\tinstance.on(\n\t\t\t\t\"domiciliationFormCompleted\",\n\t\t\t\thandleDomiciliationFormCompleted,\n\t\t\t);\n\t\t\tinstance.on(\n\t\t\t\t\"domiciliationVerificationCompleted\",\n\t\t\t\thandleDomiciliationVerificationCompleted,\n\t\t\t);\n\t\t\tinstance.on(\"domiciliationConfirmed\", handleDomiciliationConfirmed);\n\n\t\t\tinstance.initialize({\n\t\t\t\tcontainer,\n\t\t\t\torganization,\n\t\t\t\tcompanyCode,\n\t\t\t\tidentifier,\n\t\t\t\texternalRequestId,\n\t\t\t\tselectionStrategy,\n\t\t\t\tview,\n\t\t\t});\n\t\t});\n\n\t\treturn () => {\n\t\t\tcancelled = true;\n\t\t\tif (tapipayInstance) {\n\t\t\t\ttapipayInstance.off(\"paymentWindowOpened\", handlePaymentWindowOpened);\n\t\t\t\ttapipayInstance.off(\"paymentSubmitted\", handlePaymentSubmitted);\n\t\t\t\ttapipayInstance.off(\"paymentCancelled\", handleCancelled);\n\t\t\t\ttapipayInstance.off(\"autopayLoaded\", handleAutopayLoaded);\n\t\t\t\ttapipayInstance.off(\"autopayActivated\", handleAutopayActivated);\n\t\t\t\ttapipayInstance.off(\"autopayRemoved\", handleAutopayRemoved);\n\t\t\t\ttapipayInstance.off(\"autopayError\", handleAutopayError);\n\t\t\t\ttapipayInstance.off(\n\t\t\t\t\t\"domiciliationBankSelected\",\n\t\t\t\t\thandleDomiciliationBankSelected,\n\t\t\t\t);\n\t\t\t\ttapipayInstance.off(\n\t\t\t\t\t\"domiciliationFormCompleted\",\n\t\t\t\t\thandleDomiciliationFormCompleted,\n\t\t\t\t);\n\t\t\t\ttapipayInstance.off(\n\t\t\t\t\t\"domiciliationVerificationCompleted\",\n\t\t\t\t\thandleDomiciliationVerificationCompleted,\n\t\t\t\t);\n\t\t\t\ttapipayInstance.off(\n\t\t\t\t\t\"domiciliationConfirmed\",\n\t\t\t\t\thandleDomiciliationConfirmed,\n\t\t\t\t);\n\t\t\t\ttapipayInstance.destroy(container);\n\t\t\t}\n\t\t};\n\t\t// El widget se re-monta si cambian los parámetros de identificación o entorno\n\t\t// eslint-disable-next-line react-hooks/exhaustive-deps\n\t}, [\n\t\torganization,\n\t\tcompanyCode,\n\t\tidentifier,\n\t\texternalRequestId,\n\t\tselectionStrategy,\n\t\tview,\n\t\tenvironment,\n\t]);\n\n\treturn <div ref={containerRef} className={className} style={style} />;\n}\n","import type {\n\tLoadTapipayOptions,\n\tTapipayEnvironment,\n\tTapipayInstance,\n} from \"./types\";\n\nconst SDK_URLS: Record<TapipayEnvironment, string> = {\n\tproduction: \"https://app.tapipay.la/embed.js\",\n\thomo: \"https://homo.tapipay.la/embed.js\",\n};\n\n// Idempotencia por entorno\nconst loadPromises = new Map<TapipayEnvironment, Promise<TapipayInstance>>();\n\n/**\n * Carga el SDK de TapiPay de forma asíncrona inyectando el script en el DOM.\n *\n * - Idempotente por entorno: múltiples llamadas con el mismo `environment` retornan la misma Promise.\n * - Si window.tapipay ya existe (script cargado sync), resuelve inmediatamente.\n * - Compatible con React Strict Mode (doble mount/unmount).\n *\n * @example\n * // Producción (default)\n * const tapipay = await loadTapipay();\n *\n * // Homologación\n * const tapipay = await loadTapipay({ environment: 'homo' });\n *\n * // Se requiere UNO de { organization, companyCode } (companyCode tiene prioridad).\n * tapipay.initialize({ container: \"#widget\", organization: \"acme\", identifier: \"CLI-001\" });\n * tapipay.initialize({ container: \"#widget\", companyCode: \"acme-mx\", identifier: \"CLI-001\" });\n */\nexport function loadTapipay(\n\toptions?: LoadTapipayOptions,\n): Promise<TapipayInstance> {\n\tconst env: TapipayEnvironment = options?.environment ?? \"production\";\n\tconst SDK_URL = SDK_URLS[env];\n\tconst SCRIPT_ID = `tapipay-embed-sdk-${env}`;\n\n\t// SSR guard\n\tif (typeof window === \"undefined\") {\n\t\treturn Promise.reject(\n\t\t\tnew Error(\"[TapiPay] loadTapipay() requires a browser environment.\"),\n\t\t);\n\t}\n\n\t// Ya cargado de forma síncrona (script tag directo)\n\tif (window.tapipay && !window.tapipay._q) {\n\t\treturn Promise.resolve(window.tapipay);\n\t}\n\n\t// Reutilizar promise existente (idempotencia por entorno)\n\tconst existing = loadPromises.get(env);\n\tif (existing) return existing;\n\n\tconst promise = new Promise<TapipayInstance>((resolve, reject) => {\n\t\t// Si ya hay un script inyectado, esperar a que cargue\n\t\tconst existingScript = document.getElementById(\n\t\t\tSCRIPT_ID,\n\t\t) as HTMLScriptElement | null;\n\n\t\tconst onLoad = () => {\n\t\t\tif (window.tapipay) {\n\t\t\t\tresolve(window.tapipay);\n\t\t\t} else {\n\t\t\t\treject(\n\t\t\t\t\tnew Error(\n\t\t\t\t\t\t\"[TapiPay] El script cargó pero window.tapipay no está definido.\",\n\t\t\t\t\t),\n\t\t\t\t);\n\t\t\t}\n\t\t};\n\n\t\tconst onError = () => {\n\t\t\tloadPromises.delete(env);\n\t\t\treject(new Error(`[TapiPay] Error al cargar el SDK desde ${SDK_URL}`));\n\t\t};\n\n\t\tif (existingScript) {\n\t\t\texistingScript.addEventListener(\"load\", onLoad);\n\t\t\texistingScript.addEventListener(\"error\", onError);\n\t\t\treturn;\n\t\t}\n\n\t\tconst script = document.createElement(\"script\");\n\t\tscript.id = SCRIPT_ID;\n\t\tscript.src = SDK_URL;\n\t\tscript.async = true;\n\t\tscript.addEventListener(\"load\", onLoad);\n\t\tscript.addEventListener(\"error\", onError);\n\t\tdocument.head.appendChild(script);\n\t});\n\n\tloadPromises.set(env, promise);\n\treturn promise;\n}\n"],"mappings":"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","names":[]}
package/dist/react.d.cts CHANGED
@@ -1,5 +1,5 @@
1
1
  import * as react_jsx_runtime from 'react/jsx-runtime';
2
- import { h as TapipayOptions, g as TapipayEnvironment, k as TapipayPaymentWindowOpenedEvent, j as TapipayPaymentSubmittedEvent, i as TapipayPaymentCancelledEvent, d as TapipayAutopayLoadedEvent, a as TapipayAutopayActivatedEvent, f as TapipayAutopayRemovedEvent, c as TapipayAutopayErrorEvent, L as LoadTapipayOptions, T as TapipayInstance } from './types-BPz2Gtxx.cjs';
2
+ import { n as TapipayOptions, m as TapipayEnvironment, q as TapipayPaymentWindowOpenedEvent, p as TapipayPaymentSubmittedEvent, o as TapipayPaymentCancelledEvent, d as TapipayAutopayLoadedEvent, a as TapipayAutopayActivatedEvent, f as TapipayAutopayRemovedEvent, c as TapipayAutopayErrorEvent, h as TapipayDomiciliationBankSelectedEvent, j as TapipayDomiciliationFormCompletedEvent, k as TapipayDomiciliationVerificationCompletedEvent, i as TapipayDomiciliationConfirmedEvent, L as LoadTapipayOptions, T as TapipayInstance } from './types-CJRvC3_b.cjs';
3
3
 
4
4
  /**
5
5
  * Hook de bajo nivel que carga el SDK y retorna la instancia.
@@ -30,6 +30,14 @@ interface TapipayWidgetProps extends Omit<TapipayOptions, "container"> {
30
30
  onAutopayRemoved?: (data: TapipayAutopayRemovedEvent) => void;
31
31
  /** (Vista autopay) Callback ante un error de carga de adhesiones o de desadhesión. */
32
32
  onAutopayError?: (data: TapipayAutopayErrorEvent) => void;
33
+ /** (Vista autopay) El usuario eligió su banco en el alta de domiciliación. Emite en cada cambio de selección. */
34
+ onDomiciliationBankSelected?: (data: TapipayDomiciliationBankSelectedEvent) => void;
35
+ /** (Vista autopay) Los datos de la cuenta pasaron la validación del backend. Ojo: dispara al confirmar el método de verificación, no al salir del formulario. */
36
+ onDomiciliationFormCompleted?: (data: TapipayDomiciliationFormCompletedEvent) => void;
37
+ /** (Vista autopay) La verificación llegó a un desenlace. Solo emite al outcome final: un intento fallido con reintentos disponibles NO dispara el evento. */
38
+ onDomiciliationVerificationCompleted?: (data: TapipayDomiciliationVerificationCompletedEvent) => void;
39
+ /** (Vista autopay) El usuario confirmó la domiciliación. NO significa que quedó registrada — la confirmación real llega por `onAutopayActivated`. */
40
+ onDomiciliationConfirmed?: (data: TapipayDomiciliationConfirmedEvent) => void;
33
41
  /** Clases CSS adicionales para el contenedor del widget. */
34
42
  className?: string;
35
43
  /** Estilos inline adicionales para el contenedor del widget. */
@@ -67,8 +75,12 @@ interface TapipayWidgetProps extends Omit<TapipayOptions, "container"> {
67
75
  * onAutopayLoaded={(data) => console.log("Adhesiones", data.count)}
68
76
  * onAutopayActivated={(data) => console.log("Adhesión activada", data.id)}
69
77
  * onAutopayRemoved={(data) => console.log("Adhesión eliminada", data.id)}
78
+ * onDomiciliationBankSelected={(data) => console.log("Banco", data.name)}
79
+ * onDomiciliationFormCompleted={(data) => console.log("Cuenta ****" + data.lastFour)}
80
+ * onDomiciliationVerificationCompleted={(data) => console.log("Verificación", data.outcome)}
81
+ * onDomiciliationConfirmed={() => console.log("Enviado — esperar onAutopayActivated")}
70
82
  * />
71
83
  */
72
- declare function TapipayWidget({ organization, companyCode, identifier, externalRequestId, selectionStrategy, view, environment, onPaymentWindowOpened, onPaymentSubmitted, onCancelled, onAutopayLoaded, onAutopayActivated, onAutopayRemoved, onAutopayError, className, style, }: TapipayWidgetProps): react_jsx_runtime.JSX.Element;
84
+ declare function TapipayWidget({ organization, companyCode, identifier, externalRequestId, selectionStrategy, view, environment, onPaymentWindowOpened, onPaymentSubmitted, onCancelled, onAutopayLoaded, onAutopayActivated, onAutopayRemoved, onAutopayError, onDomiciliationBankSelected, onDomiciliationFormCompleted, onDomiciliationVerificationCompleted, onDomiciliationConfirmed, className, style, }: TapipayWidgetProps): react_jsx_runtime.JSX.Element;
73
85
 
74
86
  export { TapipayWidget, type TapipayWidgetProps, useTapipay };
package/dist/react.d.ts CHANGED
@@ -1,5 +1,5 @@
1
1
  import * as react_jsx_runtime from 'react/jsx-runtime';
2
- import { h as TapipayOptions, g as TapipayEnvironment, k as TapipayPaymentWindowOpenedEvent, j as TapipayPaymentSubmittedEvent, i as TapipayPaymentCancelledEvent, d as TapipayAutopayLoadedEvent, a as TapipayAutopayActivatedEvent, f as TapipayAutopayRemovedEvent, c as TapipayAutopayErrorEvent, L as LoadTapipayOptions, T as TapipayInstance } from './types-BPz2Gtxx.js';
2
+ import { n as TapipayOptions, m as TapipayEnvironment, q as TapipayPaymentWindowOpenedEvent, p as TapipayPaymentSubmittedEvent, o as TapipayPaymentCancelledEvent, d as TapipayAutopayLoadedEvent, a as TapipayAutopayActivatedEvent, f as TapipayAutopayRemovedEvent, c as TapipayAutopayErrorEvent, h as TapipayDomiciliationBankSelectedEvent, j as TapipayDomiciliationFormCompletedEvent, k as TapipayDomiciliationVerificationCompletedEvent, i as TapipayDomiciliationConfirmedEvent, L as LoadTapipayOptions, T as TapipayInstance } from './types-CJRvC3_b.js';
3
3
 
4
4
  /**
5
5
  * Hook de bajo nivel que carga el SDK y retorna la instancia.
@@ -30,6 +30,14 @@ interface TapipayWidgetProps extends Omit<TapipayOptions, "container"> {
30
30
  onAutopayRemoved?: (data: TapipayAutopayRemovedEvent) => void;
31
31
  /** (Vista autopay) Callback ante un error de carga de adhesiones o de desadhesión. */
32
32
  onAutopayError?: (data: TapipayAutopayErrorEvent) => void;
33
+ /** (Vista autopay) El usuario eligió su banco en el alta de domiciliación. Emite en cada cambio de selección. */
34
+ onDomiciliationBankSelected?: (data: TapipayDomiciliationBankSelectedEvent) => void;
35
+ /** (Vista autopay) Los datos de la cuenta pasaron la validación del backend. Ojo: dispara al confirmar el método de verificación, no al salir del formulario. */
36
+ onDomiciliationFormCompleted?: (data: TapipayDomiciliationFormCompletedEvent) => void;
37
+ /** (Vista autopay) La verificación llegó a un desenlace. Solo emite al outcome final: un intento fallido con reintentos disponibles NO dispara el evento. */
38
+ onDomiciliationVerificationCompleted?: (data: TapipayDomiciliationVerificationCompletedEvent) => void;
39
+ /** (Vista autopay) El usuario confirmó la domiciliación. NO significa que quedó registrada — la confirmación real llega por `onAutopayActivated`. */
40
+ onDomiciliationConfirmed?: (data: TapipayDomiciliationConfirmedEvent) => void;
33
41
  /** Clases CSS adicionales para el contenedor del widget. */
34
42
  className?: string;
35
43
  /** Estilos inline adicionales para el contenedor del widget. */
@@ -67,8 +75,12 @@ interface TapipayWidgetProps extends Omit<TapipayOptions, "container"> {
67
75
  * onAutopayLoaded={(data) => console.log("Adhesiones", data.count)}
68
76
  * onAutopayActivated={(data) => console.log("Adhesión activada", data.id)}
69
77
  * onAutopayRemoved={(data) => console.log("Adhesión eliminada", data.id)}
78
+ * onDomiciliationBankSelected={(data) => console.log("Banco", data.name)}
79
+ * onDomiciliationFormCompleted={(data) => console.log("Cuenta ****" + data.lastFour)}
80
+ * onDomiciliationVerificationCompleted={(data) => console.log("Verificación", data.outcome)}
81
+ * onDomiciliationConfirmed={() => console.log("Enviado — esperar onAutopayActivated")}
70
82
  * />
71
83
  */
72
- declare function TapipayWidget({ organization, companyCode, identifier, externalRequestId, selectionStrategy, view, environment, onPaymentWindowOpened, onPaymentSubmitted, onCancelled, onAutopayLoaded, onAutopayActivated, onAutopayRemoved, onAutopayError, className, style, }: TapipayWidgetProps): react_jsx_runtime.JSX.Element;
84
+ declare function TapipayWidget({ organization, companyCode, identifier, externalRequestId, selectionStrategy, view, environment, onPaymentWindowOpened, onPaymentSubmitted, onCancelled, onAutopayLoaded, onAutopayActivated, onAutopayRemoved, onAutopayError, onDomiciliationBankSelected, onDomiciliationFormCompleted, onDomiciliationVerificationCompleted, onDomiciliationConfirmed, className, style, }: TapipayWidgetProps): react_jsx_runtime.JSX.Element;
73
85
 
74
86
  export { TapipayWidget, type TapipayWidgetProps, useTapipay };
package/dist/react.js CHANGED
@@ -37,6 +37,10 @@ function TapipayWidget({
37
37
  onAutopayActivated,
38
38
  onAutopayRemoved,
39
39
  onAutopayError,
40
+ onDomiciliationBankSelected,
41
+ onDomiciliationFormCompleted,
42
+ onDomiciliationVerificationCompleted,
43
+ onDomiciliationConfirmed,
40
44
  className,
41
45
  style
42
46
  }) {
@@ -48,6 +52,12 @@ function TapipayWidget({
48
52
  const onAutopayActivatedRef = useRef(onAutopayActivated);
49
53
  const onAutopayRemovedRef = useRef(onAutopayRemoved);
50
54
  const onAutopayErrorRef = useRef(onAutopayError);
55
+ const onDomiciliationBankSelectedRef = useRef(onDomiciliationBankSelected);
56
+ const onDomiciliationFormCompletedRef = useRef(onDomiciliationFormCompleted);
57
+ const onDomiciliationVerificationCompletedRef = useRef(
58
+ onDomiciliationVerificationCompleted
59
+ );
60
+ const onDomiciliationConfirmedRef = useRef(onDomiciliationConfirmed);
51
61
  useEffect(() => {
52
62
  onPaymentWindowOpenedRef.current = onPaymentWindowOpened;
53
63
  }, [onPaymentWindowOpened]);
@@ -69,6 +79,18 @@ function TapipayWidget({
69
79
  useEffect(() => {
70
80
  onAutopayErrorRef.current = onAutopayError;
71
81
  }, [onAutopayError]);
82
+ useEffect(() => {
83
+ onDomiciliationBankSelectedRef.current = onDomiciliationBankSelected;
84
+ }, [onDomiciliationBankSelected]);
85
+ useEffect(() => {
86
+ onDomiciliationFormCompletedRef.current = onDomiciliationFormCompleted;
87
+ }, [onDomiciliationFormCompleted]);
88
+ useEffect(() => {
89
+ onDomiciliationVerificationCompletedRef.current = onDomiciliationVerificationCompleted;
90
+ }, [onDomiciliationVerificationCompleted]);
91
+ useEffect(() => {
92
+ onDomiciliationConfirmedRef.current = onDomiciliationConfirmed;
93
+ }, [onDomiciliationConfirmed]);
72
94
  useEffect(() => {
73
95
  if (!containerRef.current) return;
74
96
  const container = containerRef.current;
@@ -102,6 +124,22 @@ function TapipayWidget({
102
124
  var _a;
103
125
  (_a = onAutopayErrorRef.current) == null ? void 0 : _a.call(onAutopayErrorRef, data);
104
126
  };
127
+ const handleDomiciliationBankSelected = (data) => {
128
+ var _a;
129
+ (_a = onDomiciliationBankSelectedRef.current) == null ? void 0 : _a.call(onDomiciliationBankSelectedRef, data);
130
+ };
131
+ const handleDomiciliationFormCompleted = (data) => {
132
+ var _a;
133
+ (_a = onDomiciliationFormCompletedRef.current) == null ? void 0 : _a.call(onDomiciliationFormCompletedRef, data);
134
+ };
135
+ const handleDomiciliationVerificationCompleted = (data) => {
136
+ var _a;
137
+ (_a = onDomiciliationVerificationCompletedRef.current) == null ? void 0 : _a.call(onDomiciliationVerificationCompletedRef, data);
138
+ };
139
+ const handleDomiciliationConfirmed = (data) => {
140
+ var _a;
141
+ (_a = onDomiciliationConfirmedRef.current) == null ? void 0 : _a.call(onDomiciliationConfirmedRef, data);
142
+ };
105
143
  loadTapipay({ environment }).then((instance) => {
106
144
  if (cancelled) return;
107
145
  tapipayInstance = instance;
@@ -112,6 +150,16 @@ function TapipayWidget({
112
150
  instance.on("autopayActivated", handleAutopayActivated);
113
151
  instance.on("autopayRemoved", handleAutopayRemoved);
114
152
  instance.on("autopayError", handleAutopayError);
153
+ instance.on("domiciliationBankSelected", handleDomiciliationBankSelected);
154
+ instance.on(
155
+ "domiciliationFormCompleted",
156
+ handleDomiciliationFormCompleted
157
+ );
158
+ instance.on(
159
+ "domiciliationVerificationCompleted",
160
+ handleDomiciliationVerificationCompleted
161
+ );
162
+ instance.on("domiciliationConfirmed", handleDomiciliationConfirmed);
115
163
  instance.initialize({
116
164
  container,
117
165
  organization,
@@ -132,6 +180,22 @@ function TapipayWidget({
132
180
  tapipayInstance.off("autopayActivated", handleAutopayActivated);
133
181
  tapipayInstance.off("autopayRemoved", handleAutopayRemoved);
134
182
  tapipayInstance.off("autopayError", handleAutopayError);
183
+ tapipayInstance.off(
184
+ "domiciliationBankSelected",
185
+ handleDomiciliationBankSelected
186
+ );
187
+ tapipayInstance.off(
188
+ "domiciliationFormCompleted",
189
+ handleDomiciliationFormCompleted
190
+ );
191
+ tapipayInstance.off(
192
+ "domiciliationVerificationCompleted",
193
+ handleDomiciliationVerificationCompleted
194
+ );
195
+ tapipayInstance.off(
196
+ "domiciliationConfirmed",
197
+ handleDomiciliationConfirmed
198
+ );
135
199
  tapipayInstance.destroy(container);
136
200
  }
137
201
  };
package/dist/react.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/react.tsx"],"sourcesContent":["import { useEffect, useRef, useState } from \"react\";\nimport { loadTapipay } from \"./loader\";\nimport type {\n\tLoadTapipayOptions,\n\tTapipayAutopayActivatedEvent,\n\tTapipayAutopayErrorEvent,\n\tTapipayAutopayLoadedEvent,\n\tTapipayAutopayRemovedEvent,\n\tTapipayEnvironment,\n\tTapipayInstance,\n\tTapipayOptions,\n\tTapipayPaymentCancelledEvent,\n\tTapipayPaymentSubmittedEvent,\n\tTapipayPaymentWindowOpenedEvent,\n} from \"./types\";\n\n// ─── useTapipay hook ──────────────────────────────────────────────────────────\n\n/**\n * Hook de bajo nivel que carga el SDK y retorna la instancia.\n * Útil cuando necesitas control manual sobre initialize/destroy.\n *\n * @example\n * const { tapipay, error } = useTapipay();\n * const { tapipay, error } = useTapipay({ environment: 'homo' });\n */\nexport function useTapipay(options?: LoadTapipayOptions): {\n\ttapipay: TapipayInstance | null;\n\terror: Error | null;\n} {\n\tconst [tapipay, setTapipay] = useState<TapipayInstance | null>(null);\n\tconst [error, setError] = useState<Error | null>(null);\n\tconst environment = options?.environment;\n\n\tuseEffect(() => {\n\t\tlet cancelled = false;\n\t\tloadTapipay({ environment })\n\t\t\t.then((instance) => {\n\t\t\t\tif (!cancelled) setTapipay(instance);\n\t\t\t})\n\t\t\t.catch((err: Error) => {\n\t\t\t\tif (!cancelled) setError(err);\n\t\t\t});\n\t\treturn () => {\n\t\t\tcancelled = true;\n\t\t};\n\t}, [environment]);\n\n\treturn { tapipay, error };\n}\n\n// ─── TapipayWidget component ──────────────────────────────────────────────────\n\nexport interface TapipayWidgetProps extends Omit<TapipayOptions, \"container\"> {\n\t/** Entorno del SDK a cargar. Por defecto `'production'`. Usar `'homo'` para homologación. */\n\tenvironment?: TapipayEnvironment;\n\t/** Callback invocado cuando el popup de Yuno se abre exitosamente. */\n\tonPaymentWindowOpened?: (data: TapipayPaymentWindowOpenedEvent) => void;\n\t/** Callback invocado cuando el usuario completó el formulario de Yuno y fue redirigido al callback. */\n\tonPaymentSubmitted?: (data: TapipayPaymentSubmittedEvent) => void;\n\t/** Callback invocado cuando el usuario cierra el popup sin completar el pago. */\n\tonCancelled?: (data: TapipayPaymentCancelledEvent) => void;\n\t/** (Vista autopay) Callback con el conjunto de adhesiones activas; se reinvoca cuando la lista cambia. */\n\tonAutopayLoaded?: (data: TapipayAutopayLoadedEvent) => void;\n\t/** (Vista autopay) Callback cuando una nueva adhesión queda activa (una sola vez por adhesión nueva). */\n\tonAutopayActivated?: (data: TapipayAutopayActivatedEvent) => void;\n\t/** (Vista autopay) Callback cuando el usuario desadhiere un medio con éxito. */\n\tonAutopayRemoved?: (data: TapipayAutopayRemovedEvent) => void;\n\t/** (Vista autopay) Callback ante un error de carga de adhesiones o de desadhesión. */\n\tonAutopayError?: (data: TapipayAutopayErrorEvent) => void;\n\t/** Clases CSS adicionales para el contenedor del widget. */\n\tclassName?: string;\n\t/** Estilos inline adicionales para el contenedor del widget. */\n\tstyle?: React.CSSProperties;\n}\n\n/**\n * Componente React que encapsula el widget de pago TapiPay.\n *\n * Maneja internamente la carga del SDK, el ciclo de vida del widget\n * y el cleanup al desmontar. Compatible con React Strict Mode.\n *\n * Se requiere `identifier` + UNO de `{ organization, companyCode }`.\n * Si se pasan ambos, `companyCode` tiene prioridad.\n *\n * @example\n * // Vista de pagos (default)\n * <TapipayWidget\n * organization=\"acme\"\n * identifier=\"CLI-001\"\n * externalRequestId=\"FAC-2024-001\"\n * onPaymentSubmitted={(data) => console.log(\"Pago enviado\", data)}\n * onCancelled={() => console.log(\"Pago cancelado por el usuario\")}\n * />\n *\n * @example\n * // Usando companyCode en lugar de organization\n * <TapipayWidget companyCode=\"acme-mx\" identifier=\"CLI-001\" />\n *\n * @example\n * // Vista de gestión de adhesiones de autopay\n * <TapipayWidget\n * organization=\"acme\"\n * identifier=\"CLI-001\"\n * view=\"autopay\"\n * onAutopayLoaded={(data) => console.log(\"Adhesiones\", data.count)}\n * onAutopayActivated={(data) => console.log(\"Adhesión activada\", data.id)}\n * onAutopayRemoved={(data) => console.log(\"Adhesión eliminada\", data.id)}\n * />\n */\nexport function TapipayWidget({\n\torganization,\n\tcompanyCode,\n\tidentifier,\n\texternalRequestId,\n\tselectionStrategy,\n\tview,\n\tenvironment,\n\tonPaymentWindowOpened,\n\tonPaymentSubmitted,\n\tonCancelled,\n\tonAutopayLoaded,\n\tonAutopayActivated,\n\tonAutopayRemoved,\n\tonAutopayError,\n\tclassName,\n\tstyle,\n}: TapipayWidgetProps) {\n\tconst containerRef = useRef<HTMLDivElement>(null);\n\t// Refs para evitar re-renders innecesarios y closures estáticos en useEffect\n\tconst onPaymentWindowOpenedRef = useRef(onPaymentWindowOpened);\n\tconst onPaymentSubmittedRef = useRef(onPaymentSubmitted);\n\tconst onCancelledRef = useRef(onCancelled);\n\tconst onAutopayLoadedRef = useRef(onAutopayLoaded);\n\tconst onAutopayActivatedRef = useRef(onAutopayActivated);\n\tconst onAutopayRemovedRef = useRef(onAutopayRemoved);\n\tconst onAutopayErrorRef = useRef(onAutopayError);\n\n\tuseEffect(() => {\n\t\tonPaymentWindowOpenedRef.current = onPaymentWindowOpened;\n\t}, [onPaymentWindowOpened]);\n\n\tuseEffect(() => {\n\t\tonPaymentSubmittedRef.current = onPaymentSubmitted;\n\t}, [onPaymentSubmitted]);\n\n\tuseEffect(() => {\n\t\tonCancelledRef.current = onCancelled;\n\t}, [onCancelled]);\n\n\tuseEffect(() => {\n\t\tonAutopayLoadedRef.current = onAutopayLoaded;\n\t}, [onAutopayLoaded]);\n\n\tuseEffect(() => {\n\t\tonAutopayActivatedRef.current = onAutopayActivated;\n\t}, [onAutopayActivated]);\n\n\tuseEffect(() => {\n\t\tonAutopayRemovedRef.current = onAutopayRemoved;\n\t}, [onAutopayRemoved]);\n\n\tuseEffect(() => {\n\t\tonAutopayErrorRef.current = onAutopayError;\n\t}, [onAutopayError]);\n\n\tuseEffect(() => {\n\t\tif (!containerRef.current) return;\n\t\tconst container = containerRef.current;\n\n\t\tlet tapipayInstance: TapipayInstance | null = null;\n\t\tlet cancelled = false;\n\n\t\tconst handlePaymentWindowOpened = (\n\t\t\tdata: TapipayPaymentWindowOpenedEvent,\n\t\t) => {\n\t\t\tonPaymentWindowOpenedRef.current?.(data);\n\t\t};\n\t\tconst handlePaymentSubmitted = (data: TapipayPaymentSubmittedEvent) => {\n\t\t\tonPaymentSubmittedRef.current?.(data);\n\t\t};\n\t\tconst handleCancelled = (data: TapipayPaymentCancelledEvent) => {\n\t\t\tonCancelledRef.current?.(data);\n\t\t};\n\t\tconst handleAutopayLoaded = (data: TapipayAutopayLoadedEvent) => {\n\t\t\tonAutopayLoadedRef.current?.(data);\n\t\t};\n\t\tconst handleAutopayActivated = (data: TapipayAutopayActivatedEvent) => {\n\t\t\tonAutopayActivatedRef.current?.(data);\n\t\t};\n\t\tconst handleAutopayRemoved = (data: TapipayAutopayRemovedEvent) => {\n\t\t\tonAutopayRemovedRef.current?.(data);\n\t\t};\n\t\tconst handleAutopayError = (data: TapipayAutopayErrorEvent) => {\n\t\t\tonAutopayErrorRef.current?.(data);\n\t\t};\n\n\t\tloadTapipay({ environment }).then((instance) => {\n\t\t\tif (cancelled) return;\n\t\t\ttapipayInstance = instance;\n\n\t\t\tinstance.on(\"paymentWindowOpened\", handlePaymentWindowOpened);\n\t\t\tinstance.on(\"paymentSubmitted\", handlePaymentSubmitted);\n\t\t\tinstance.on(\"paymentCancelled\", handleCancelled);\n\t\t\tinstance.on(\"autopayLoaded\", handleAutopayLoaded);\n\t\t\tinstance.on(\"autopayActivated\", handleAutopayActivated);\n\t\t\tinstance.on(\"autopayRemoved\", handleAutopayRemoved);\n\t\t\tinstance.on(\"autopayError\", handleAutopayError);\n\n\t\t\tinstance.initialize({\n\t\t\t\tcontainer,\n\t\t\t\torganization,\n\t\t\t\tcompanyCode,\n\t\t\t\tidentifier,\n\t\t\t\texternalRequestId,\n\t\t\t\tselectionStrategy,\n\t\t\t\tview,\n\t\t\t});\n\t\t});\n\n\t\treturn () => {\n\t\t\tcancelled = true;\n\t\t\tif (tapipayInstance) {\n\t\t\t\ttapipayInstance.off(\"paymentWindowOpened\", handlePaymentWindowOpened);\n\t\t\t\ttapipayInstance.off(\"paymentSubmitted\", handlePaymentSubmitted);\n\t\t\t\ttapipayInstance.off(\"paymentCancelled\", handleCancelled);\n\t\t\t\ttapipayInstance.off(\"autopayLoaded\", handleAutopayLoaded);\n\t\t\t\ttapipayInstance.off(\"autopayActivated\", handleAutopayActivated);\n\t\t\t\ttapipayInstance.off(\"autopayRemoved\", handleAutopayRemoved);\n\t\t\t\ttapipayInstance.off(\"autopayError\", handleAutopayError);\n\t\t\t\ttapipayInstance.destroy(container);\n\t\t\t}\n\t\t};\n\t\t// El widget se re-monta si cambian los parámetros de identificación o entorno\n\t\t// eslint-disable-next-line react-hooks/exhaustive-deps\n\t}, [\n\t\torganization,\n\t\tcompanyCode,\n\t\tidentifier,\n\t\texternalRequestId,\n\t\tselectionStrategy,\n\t\tview,\n\t\tenvironment,\n\t]);\n\n\treturn <div ref={containerRef} className={className} style={style} />;\n}\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../src/react.tsx"],"sourcesContent":["import { useEffect, useRef, useState } from \"react\";\nimport { loadTapipay } from \"./loader\";\nimport type {\n\tLoadTapipayOptions,\n\tTapipayAutopayActivatedEvent,\n\tTapipayAutopayErrorEvent,\n\tTapipayAutopayLoadedEvent,\n\tTapipayAutopayRemovedEvent,\n\tTapipayDomiciliationBankSelectedEvent,\n\tTapipayDomiciliationConfirmedEvent,\n\tTapipayDomiciliationFormCompletedEvent,\n\tTapipayDomiciliationVerificationCompletedEvent,\n\tTapipayEnvironment,\n\tTapipayInstance,\n\tTapipayOptions,\n\tTapipayPaymentCancelledEvent,\n\tTapipayPaymentSubmittedEvent,\n\tTapipayPaymentWindowOpenedEvent,\n} from \"./types\";\n\n// ─── useTapipay hook ──────────────────────────────────────────────────────────\n\n/**\n * Hook de bajo nivel que carga el SDK y retorna la instancia.\n * Útil cuando necesitas control manual sobre initialize/destroy.\n *\n * @example\n * const { tapipay, error } = useTapipay();\n * const { tapipay, error } = useTapipay({ environment: 'homo' });\n */\nexport function useTapipay(options?: LoadTapipayOptions): {\n\ttapipay: TapipayInstance | null;\n\terror: Error | null;\n} {\n\tconst [tapipay, setTapipay] = useState<TapipayInstance | null>(null);\n\tconst [error, setError] = useState<Error | null>(null);\n\tconst environment = options?.environment;\n\n\tuseEffect(() => {\n\t\tlet cancelled = false;\n\t\tloadTapipay({ environment })\n\t\t\t.then((instance) => {\n\t\t\t\tif (!cancelled) setTapipay(instance);\n\t\t\t})\n\t\t\t.catch((err: Error) => {\n\t\t\t\tif (!cancelled) setError(err);\n\t\t\t});\n\t\treturn () => {\n\t\t\tcancelled = true;\n\t\t};\n\t}, [environment]);\n\n\treturn { tapipay, error };\n}\n\n// ─── TapipayWidget component ──────────────────────────────────────────────────\n\nexport interface TapipayWidgetProps extends Omit<TapipayOptions, \"container\"> {\n\t/** Entorno del SDK a cargar. Por defecto `'production'`. Usar `'homo'` para homologación. */\n\tenvironment?: TapipayEnvironment;\n\t/** Callback invocado cuando el popup de Yuno se abre exitosamente. */\n\tonPaymentWindowOpened?: (data: TapipayPaymentWindowOpenedEvent) => void;\n\t/** Callback invocado cuando el usuario completó el formulario de Yuno y fue redirigido al callback. */\n\tonPaymentSubmitted?: (data: TapipayPaymentSubmittedEvent) => void;\n\t/** Callback invocado cuando el usuario cierra el popup sin completar el pago. */\n\tonCancelled?: (data: TapipayPaymentCancelledEvent) => void;\n\t/** (Vista autopay) Callback con el conjunto de adhesiones activas; se reinvoca cuando la lista cambia. */\n\tonAutopayLoaded?: (data: TapipayAutopayLoadedEvent) => void;\n\t/** (Vista autopay) Callback cuando una nueva adhesión queda activa (una sola vez por adhesión nueva). */\n\tonAutopayActivated?: (data: TapipayAutopayActivatedEvent) => void;\n\t/** (Vista autopay) Callback cuando el usuario desadhiere un medio con éxito. */\n\tonAutopayRemoved?: (data: TapipayAutopayRemovedEvent) => void;\n\t/** (Vista autopay) Callback ante un error de carga de adhesiones o de desadhesión. */\n\tonAutopayError?: (data: TapipayAutopayErrorEvent) => void;\n\t/** (Vista autopay) El usuario eligió su banco en el alta de domiciliación. Emite en cada cambio de selección. */\n\tonDomiciliationBankSelected?: (\n\t\tdata: TapipayDomiciliationBankSelectedEvent,\n\t) => void;\n\t/** (Vista autopay) Los datos de la cuenta pasaron la validación del backend. Ojo: dispara al confirmar el método de verificación, no al salir del formulario. */\n\tonDomiciliationFormCompleted?: (\n\t\tdata: TapipayDomiciliationFormCompletedEvent,\n\t) => void;\n\t/** (Vista autopay) La verificación llegó a un desenlace. Solo emite al outcome final: un intento fallido con reintentos disponibles NO dispara el evento. */\n\tonDomiciliationVerificationCompleted?: (\n\t\tdata: TapipayDomiciliationVerificationCompletedEvent,\n\t) => void;\n\t/** (Vista autopay) El usuario confirmó la domiciliación. NO significa que quedó registrada — la confirmación real llega por `onAutopayActivated`. */\n\tonDomiciliationConfirmed?: (data: TapipayDomiciliationConfirmedEvent) => void;\n\t/** Clases CSS adicionales para el contenedor del widget. */\n\tclassName?: string;\n\t/** Estilos inline adicionales para el contenedor del widget. */\n\tstyle?: React.CSSProperties;\n}\n\n/**\n * Componente React que encapsula el widget de pago TapiPay.\n *\n * Maneja internamente la carga del SDK, el ciclo de vida del widget\n * y el cleanup al desmontar. Compatible con React Strict Mode.\n *\n * Se requiere `identifier` + UNO de `{ organization, companyCode }`.\n * Si se pasan ambos, `companyCode` tiene prioridad.\n *\n * @example\n * // Vista de pagos (default)\n * <TapipayWidget\n * organization=\"acme\"\n * identifier=\"CLI-001\"\n * externalRequestId=\"FAC-2024-001\"\n * onPaymentSubmitted={(data) => console.log(\"Pago enviado\", data)}\n * onCancelled={() => console.log(\"Pago cancelado por el usuario\")}\n * />\n *\n * @example\n * // Usando companyCode en lugar de organization\n * <TapipayWidget companyCode=\"acme-mx\" identifier=\"CLI-001\" />\n *\n * @example\n * // Vista de gestión de adhesiones de autopay\n * <TapipayWidget\n * organization=\"acme\"\n * identifier=\"CLI-001\"\n * view=\"autopay\"\n * onAutopayLoaded={(data) => console.log(\"Adhesiones\", data.count)}\n * onAutopayActivated={(data) => console.log(\"Adhesión activada\", data.id)}\n * onAutopayRemoved={(data) => console.log(\"Adhesión eliminada\", data.id)}\n * onDomiciliationBankSelected={(data) => console.log(\"Banco\", data.name)}\n * onDomiciliationFormCompleted={(data) => console.log(\"Cuenta ****\" + data.lastFour)}\n * onDomiciliationVerificationCompleted={(data) => console.log(\"Verificación\", data.outcome)}\n * onDomiciliationConfirmed={() => console.log(\"Enviado — esperar onAutopayActivated\")}\n * />\n */\nexport function TapipayWidget({\n\torganization,\n\tcompanyCode,\n\tidentifier,\n\texternalRequestId,\n\tselectionStrategy,\n\tview,\n\tenvironment,\n\tonPaymentWindowOpened,\n\tonPaymentSubmitted,\n\tonCancelled,\n\tonAutopayLoaded,\n\tonAutopayActivated,\n\tonAutopayRemoved,\n\tonAutopayError,\n\tonDomiciliationBankSelected,\n\tonDomiciliationFormCompleted,\n\tonDomiciliationVerificationCompleted,\n\tonDomiciliationConfirmed,\n\tclassName,\n\tstyle,\n}: TapipayWidgetProps) {\n\tconst containerRef = useRef<HTMLDivElement>(null);\n\t// Refs para evitar re-renders innecesarios y closures estáticos en useEffect\n\tconst onPaymentWindowOpenedRef = useRef(onPaymentWindowOpened);\n\tconst onPaymentSubmittedRef = useRef(onPaymentSubmitted);\n\tconst onCancelledRef = useRef(onCancelled);\n\tconst onAutopayLoadedRef = useRef(onAutopayLoaded);\n\tconst onAutopayActivatedRef = useRef(onAutopayActivated);\n\tconst onAutopayRemovedRef = useRef(onAutopayRemoved);\n\tconst onAutopayErrorRef = useRef(onAutopayError);\n\tconst onDomiciliationBankSelectedRef = useRef(onDomiciliationBankSelected);\n\tconst onDomiciliationFormCompletedRef = useRef(onDomiciliationFormCompleted);\n\tconst onDomiciliationVerificationCompletedRef = useRef(\n\t\tonDomiciliationVerificationCompleted,\n\t);\n\tconst onDomiciliationConfirmedRef = useRef(onDomiciliationConfirmed);\n\n\tuseEffect(() => {\n\t\tonPaymentWindowOpenedRef.current = onPaymentWindowOpened;\n\t}, [onPaymentWindowOpened]);\n\n\tuseEffect(() => {\n\t\tonPaymentSubmittedRef.current = onPaymentSubmitted;\n\t}, [onPaymentSubmitted]);\n\n\tuseEffect(() => {\n\t\tonCancelledRef.current = onCancelled;\n\t}, [onCancelled]);\n\n\tuseEffect(() => {\n\t\tonAutopayLoadedRef.current = onAutopayLoaded;\n\t}, [onAutopayLoaded]);\n\n\tuseEffect(() => {\n\t\tonAutopayActivatedRef.current = onAutopayActivated;\n\t}, [onAutopayActivated]);\n\n\tuseEffect(() => {\n\t\tonAutopayRemovedRef.current = onAutopayRemoved;\n\t}, [onAutopayRemoved]);\n\n\tuseEffect(() => {\n\t\tonAutopayErrorRef.current = onAutopayError;\n\t}, [onAutopayError]);\n\n\tuseEffect(() => {\n\t\tonDomiciliationBankSelectedRef.current = onDomiciliationBankSelected;\n\t}, [onDomiciliationBankSelected]);\n\n\tuseEffect(() => {\n\t\tonDomiciliationFormCompletedRef.current = onDomiciliationFormCompleted;\n\t}, [onDomiciliationFormCompleted]);\n\n\tuseEffect(() => {\n\t\tonDomiciliationVerificationCompletedRef.current =\n\t\t\tonDomiciliationVerificationCompleted;\n\t}, [onDomiciliationVerificationCompleted]);\n\n\tuseEffect(() => {\n\t\tonDomiciliationConfirmedRef.current = onDomiciliationConfirmed;\n\t}, [onDomiciliationConfirmed]);\n\n\tuseEffect(() => {\n\t\tif (!containerRef.current) return;\n\t\tconst container = containerRef.current;\n\n\t\tlet tapipayInstance: TapipayInstance | null = null;\n\t\tlet cancelled = false;\n\n\t\tconst handlePaymentWindowOpened = (\n\t\t\tdata: TapipayPaymentWindowOpenedEvent,\n\t\t) => {\n\t\t\tonPaymentWindowOpenedRef.current?.(data);\n\t\t};\n\t\tconst handlePaymentSubmitted = (data: TapipayPaymentSubmittedEvent) => {\n\t\t\tonPaymentSubmittedRef.current?.(data);\n\t\t};\n\t\tconst handleCancelled = (data: TapipayPaymentCancelledEvent) => {\n\t\t\tonCancelledRef.current?.(data);\n\t\t};\n\t\tconst handleAutopayLoaded = (data: TapipayAutopayLoadedEvent) => {\n\t\t\tonAutopayLoadedRef.current?.(data);\n\t\t};\n\t\tconst handleAutopayActivated = (data: TapipayAutopayActivatedEvent) => {\n\t\t\tonAutopayActivatedRef.current?.(data);\n\t\t};\n\t\tconst handleAutopayRemoved = (data: TapipayAutopayRemovedEvent) => {\n\t\t\tonAutopayRemovedRef.current?.(data);\n\t\t};\n\t\tconst handleAutopayError = (data: TapipayAutopayErrorEvent) => {\n\t\t\tonAutopayErrorRef.current?.(data);\n\t\t};\n\t\tconst handleDomiciliationBankSelected = (\n\t\t\tdata: TapipayDomiciliationBankSelectedEvent,\n\t\t) => {\n\t\t\tonDomiciliationBankSelectedRef.current?.(data);\n\t\t};\n\t\tconst handleDomiciliationFormCompleted = (\n\t\t\tdata: TapipayDomiciliationFormCompletedEvent,\n\t\t) => {\n\t\t\tonDomiciliationFormCompletedRef.current?.(data);\n\t\t};\n\t\tconst handleDomiciliationVerificationCompleted = (\n\t\t\tdata: TapipayDomiciliationVerificationCompletedEvent,\n\t\t) => {\n\t\t\tonDomiciliationVerificationCompletedRef.current?.(data);\n\t\t};\n\t\tconst handleDomiciliationConfirmed = (\n\t\t\tdata: TapipayDomiciliationConfirmedEvent,\n\t\t) => {\n\t\t\tonDomiciliationConfirmedRef.current?.(data);\n\t\t};\n\n\t\tloadTapipay({ environment }).then((instance) => {\n\t\t\tif (cancelled) return;\n\t\t\ttapipayInstance = instance;\n\n\t\t\tinstance.on(\"paymentWindowOpened\", handlePaymentWindowOpened);\n\t\t\tinstance.on(\"paymentSubmitted\", handlePaymentSubmitted);\n\t\t\tinstance.on(\"paymentCancelled\", handleCancelled);\n\t\t\tinstance.on(\"autopayLoaded\", handleAutopayLoaded);\n\t\t\tinstance.on(\"autopayActivated\", handleAutopayActivated);\n\t\t\tinstance.on(\"autopayRemoved\", handleAutopayRemoved);\n\t\t\tinstance.on(\"autopayError\", handleAutopayError);\n\t\t\tinstance.on(\"domiciliationBankSelected\", handleDomiciliationBankSelected);\n\t\t\tinstance.on(\n\t\t\t\t\"domiciliationFormCompleted\",\n\t\t\t\thandleDomiciliationFormCompleted,\n\t\t\t);\n\t\t\tinstance.on(\n\t\t\t\t\"domiciliationVerificationCompleted\",\n\t\t\t\thandleDomiciliationVerificationCompleted,\n\t\t\t);\n\t\t\tinstance.on(\"domiciliationConfirmed\", handleDomiciliationConfirmed);\n\n\t\t\tinstance.initialize({\n\t\t\t\tcontainer,\n\t\t\t\torganization,\n\t\t\t\tcompanyCode,\n\t\t\t\tidentifier,\n\t\t\t\texternalRequestId,\n\t\t\t\tselectionStrategy,\n\t\t\t\tview,\n\t\t\t});\n\t\t});\n\n\t\treturn () => {\n\t\t\tcancelled = true;\n\t\t\tif (tapipayInstance) {\n\t\t\t\ttapipayInstance.off(\"paymentWindowOpened\", handlePaymentWindowOpened);\n\t\t\t\ttapipayInstance.off(\"paymentSubmitted\", handlePaymentSubmitted);\n\t\t\t\ttapipayInstance.off(\"paymentCancelled\", handleCancelled);\n\t\t\t\ttapipayInstance.off(\"autopayLoaded\", handleAutopayLoaded);\n\t\t\t\ttapipayInstance.off(\"autopayActivated\", handleAutopayActivated);\n\t\t\t\ttapipayInstance.off(\"autopayRemoved\", handleAutopayRemoved);\n\t\t\t\ttapipayInstance.off(\"autopayError\", handleAutopayError);\n\t\t\t\ttapipayInstance.off(\n\t\t\t\t\t\"domiciliationBankSelected\",\n\t\t\t\t\thandleDomiciliationBankSelected,\n\t\t\t\t);\n\t\t\t\ttapipayInstance.off(\n\t\t\t\t\t\"domiciliationFormCompleted\",\n\t\t\t\t\thandleDomiciliationFormCompleted,\n\t\t\t\t);\n\t\t\t\ttapipayInstance.off(\n\t\t\t\t\t\"domiciliationVerificationCompleted\",\n\t\t\t\t\thandleDomiciliationVerificationCompleted,\n\t\t\t\t);\n\t\t\t\ttapipayInstance.off(\n\t\t\t\t\t\"domiciliationConfirmed\",\n\t\t\t\t\thandleDomiciliationConfirmed,\n\t\t\t\t);\n\t\t\t\ttapipayInstance.destroy(container);\n\t\t\t}\n\t\t};\n\t\t// El widget se re-monta si cambian los parámetros de identificación o entorno\n\t\t// eslint-disable-next-line react-hooks/exhaustive-deps\n\t}, [\n\t\torganization,\n\t\tcompanyCode,\n\t\tidentifier,\n\t\texternalRequestId,\n\t\tselectionStrategy,\n\t\tview,\n\t\tenvironment,\n\t]);\n\n\treturn <div ref={containerRef} className={className} style={style} />;\n}\n"],"mappings":"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","names":[]}
@@ -77,7 +77,7 @@ type TapipayPaymentCancelledEvent = Record<string, never>;
77
77
  * Tipo de medio adherido expuesto al sitio cliente.
78
78
  * Solo se expone el tipo lógico, nunca la marca ni el banco.
79
79
  */
80
- type TapipayAutopayMediaType = "card" | "bank_account";
80
+ type TapipayAutopayMediaType = "card" | "bank_account" | "debit_card";
81
81
  /**
82
82
  * Resumen mínimo y seguro de una adhesión activa.
83
83
  * Privacidad: solo tipo de medio + últimos 4 dígitos. El `id` es un hash opaco
@@ -140,6 +140,73 @@ interface TapipayAutopayErrorEvent {
140
140
  /** Mensaje neutral para el host. */
141
141
  message: string;
142
142
  }
143
+ /**
144
+ * Tipo de cuenta adherida, derivado de la longitud del identificador ingresado.
145
+ * 18 dígitos = CLABE, 16 = tarjeta de débito.
146
+ */
147
+ type TapipayDomiciliationAccountType = "BANK_ACCOUNT" | "DEBIT_CARD";
148
+ /** Método con el que se verificó la cuenta en el alta de domiciliación. */
149
+ type TapipayDomiciliationVerificationMethod = "penny" | "kyc" | "transfer";
150
+ /**
151
+ * Payload del evento domiciliationBankSelected.
152
+ * El usuario eligió su banco en el alta de domiciliación. Emite en cada cambio
153
+ * de selección.
154
+ */
155
+ interface TapipayDomiciliationBankSelectedEvent {
156
+ /** Id del banco en el catálogo de TapiPay. */
157
+ bankId: string;
158
+ /** Clave SPEI del banco. */
159
+ speiCode: string;
160
+ /** Nombre comercial del banco. */
161
+ name: string;
162
+ }
163
+ /**
164
+ * Payload del evento domiciliationFormCompleted.
165
+ *
166
+ * Los datos de la cuenta pasaron la validación del backend. Ojo con el timing:
167
+ * NO se dispara al salir de la pantalla del formulario, sino al confirmar el
168
+ * método de verificación — que es cuando la cuenta se registra contra el
169
+ * backend. Si los datos son inválidos, el evento no llega.
170
+ *
171
+ * Nunca incluye la CLABE ni el número de tarjeta completos.
172
+ */
173
+ interface TapipayDomiciliationFormCompletedEvent {
174
+ bankId: string;
175
+ /** Tipo de cuenta derivado de la longitud del identificador. */
176
+ accountType: TapipayDomiciliationAccountType;
177
+ /** Últimos 4 dígitos de la CLABE o tarjeta. `null` si no está disponible. */
178
+ lastFour: string | null;
179
+ }
180
+ /**
181
+ * Payload del evento domiciliationVerificationCompleted.
182
+ *
183
+ * La verificación de la cuenta llegó a un DESENLACE. Dos aclaraciones que
184
+ * importan para interpretarlo:
185
+ *
186
+ * 1. Solo emite al outcome final. Un intento de monto incorrecto que aún deja
187
+ * reintentos disponibles NO dispara el evento: `outcome: "failed"` llega
188
+ * recién cuando se agotan los intentos. Ausencia de evento NO significa que
189
+ * el usuario se frenó — puede estar reintentando.
190
+ * 2. Es method-agnostic y cubre el caso en que el paso de verificación no
191
+ * aparece en pantalla (banco que no la requiere, o método `kyc`/`transfer`):
192
+ * ahí también se emite, para que la secuencia no quede incompleta.
193
+ */
194
+ interface TapipayDomiciliationVerificationCompletedEvent {
195
+ method: TapipayDomiciliationVerificationMethod;
196
+ outcome: "approved" | "failed";
197
+ }
198
+ /**
199
+ * Payload del evento domiciliationConfirmed.
200
+ *
201
+ * El usuario confirmó la domiciliación. **No significa que quedó registrada:**
202
+ * se emite al click, sin esperar la respuesta del backend, que procesa el alta
203
+ * de forma asíncrona. La confirmación real llega por `autopayActivated`.
204
+ */
205
+ interface TapipayDomiciliationConfirmedEvent {
206
+ /** True si adhirió todas las deudas en vez de una selección. */
207
+ enrollAllDebts: boolean;
208
+ selectedProductsCount: number;
209
+ }
143
210
  /**
144
211
  * Instancia del SDK TapiPay expuesta en window.tapipay y retornada por loadTapipay().
145
212
  */
@@ -153,6 +220,10 @@ interface TapipayInstance {
153
220
  on(event: "autopayActivated", handler: (data: TapipayAutopayActivatedEvent) => void): void;
154
221
  on(event: "autopayRemoved", handler: (data: TapipayAutopayRemovedEvent) => void): void;
155
222
  on(event: "autopayError", handler: (data: TapipayAutopayErrorEvent) => void): void;
223
+ on(event: "domiciliationBankSelected", handler: (data: TapipayDomiciliationBankSelectedEvent) => void): void;
224
+ on(event: "domiciliationFormCompleted", handler: (data: TapipayDomiciliationFormCompletedEvent) => void): void;
225
+ on(event: "domiciliationVerificationCompleted", handler: (data: TapipayDomiciliationVerificationCompletedEvent) => void): void;
226
+ on(event: "domiciliationConfirmed", handler: (data: TapipayDomiciliationConfirmedEvent) => void): void;
156
227
  off(event: "paymentWindowOpened", handler: (data: TapipayPaymentWindowOpenedEvent) => void): void;
157
228
  off(event: "paymentSubmitted", handler: (data: TapipayPaymentSubmittedEvent) => void): void;
158
229
  off(event: "paymentCancelled", handler: (data: TapipayPaymentCancelledEvent) => void): void;
@@ -160,6 +231,10 @@ interface TapipayInstance {
160
231
  off(event: "autopayActivated", handler: (data: TapipayAutopayActivatedEvent) => void): void;
161
232
  off(event: "autopayRemoved", handler: (data: TapipayAutopayRemovedEvent) => void): void;
162
233
  off(event: "autopayError", handler: (data: TapipayAutopayErrorEvent) => void): void;
234
+ off(event: "domiciliationBankSelected", handler: (data: TapipayDomiciliationBankSelectedEvent) => void): void;
235
+ off(event: "domiciliationFormCompleted", handler: (data: TapipayDomiciliationFormCompletedEvent) => void): void;
236
+ off(event: "domiciliationVerificationCompleted", handler: (data: TapipayDomiciliationVerificationCompletedEvent) => void): void;
237
+ off(event: "domiciliationConfirmed", handler: (data: TapipayDomiciliationConfirmedEvent) => void): void;
163
238
  off(event: string, handler: (...args: unknown[]) => unknown): void;
164
239
  /** Cola interna usada por el stub antes de que cargue el SDK real. */
165
240
  _q?: [string, unknown[]][];
@@ -170,4 +245,4 @@ declare global {
170
245
  }
171
246
  }
172
247
 
173
- export type { LoadTapipayOptions as L, TapipayInstance as T, TapipayAutopayActivatedEvent as a, TapipayAutopayAdhesionSummary as b, TapipayAutopayErrorEvent as c, TapipayAutopayLoadedEvent as d, TapipayAutopayMediaType as e, TapipayAutopayRemovedEvent as f, TapipayEnvironment as g, TapipayOptions as h, TapipayPaymentCancelledEvent as i, TapipayPaymentSubmittedEvent as j, TapipayPaymentWindowOpenedEvent as k, TapipayView as l };
248
+ export type { LoadTapipayOptions as L, TapipayInstance as T, TapipayAutopayActivatedEvent as a, TapipayAutopayAdhesionSummary as b, TapipayAutopayErrorEvent as c, TapipayAutopayLoadedEvent as d, TapipayAutopayMediaType as e, TapipayAutopayRemovedEvent as f, TapipayDomiciliationAccountType as g, TapipayDomiciliationBankSelectedEvent as h, TapipayDomiciliationConfirmedEvent as i, TapipayDomiciliationFormCompletedEvent as j, TapipayDomiciliationVerificationCompletedEvent as k, TapipayDomiciliationVerificationMethod as l, TapipayEnvironment as m, TapipayOptions as n, TapipayPaymentCancelledEvent as o, TapipayPaymentSubmittedEvent as p, TapipayPaymentWindowOpenedEvent as q, TapipayView as r };
@@ -77,7 +77,7 @@ type TapipayPaymentCancelledEvent = Record<string, never>;
77
77
  * Tipo de medio adherido expuesto al sitio cliente.
78
78
  * Solo se expone el tipo lógico, nunca la marca ni el banco.
79
79
  */
80
- type TapipayAutopayMediaType = "card" | "bank_account";
80
+ type TapipayAutopayMediaType = "card" | "bank_account" | "debit_card";
81
81
  /**
82
82
  * Resumen mínimo y seguro de una adhesión activa.
83
83
  * Privacidad: solo tipo de medio + últimos 4 dígitos. El `id` es un hash opaco
@@ -140,6 +140,73 @@ interface TapipayAutopayErrorEvent {
140
140
  /** Mensaje neutral para el host. */
141
141
  message: string;
142
142
  }
143
+ /**
144
+ * Tipo de cuenta adherida, derivado de la longitud del identificador ingresado.
145
+ * 18 dígitos = CLABE, 16 = tarjeta de débito.
146
+ */
147
+ type TapipayDomiciliationAccountType = "BANK_ACCOUNT" | "DEBIT_CARD";
148
+ /** Método con el que se verificó la cuenta en el alta de domiciliación. */
149
+ type TapipayDomiciliationVerificationMethod = "penny" | "kyc" | "transfer";
150
+ /**
151
+ * Payload del evento domiciliationBankSelected.
152
+ * El usuario eligió su banco en el alta de domiciliación. Emite en cada cambio
153
+ * de selección.
154
+ */
155
+ interface TapipayDomiciliationBankSelectedEvent {
156
+ /** Id del banco en el catálogo de TapiPay. */
157
+ bankId: string;
158
+ /** Clave SPEI del banco. */
159
+ speiCode: string;
160
+ /** Nombre comercial del banco. */
161
+ name: string;
162
+ }
163
+ /**
164
+ * Payload del evento domiciliationFormCompleted.
165
+ *
166
+ * Los datos de la cuenta pasaron la validación del backend. Ojo con el timing:
167
+ * NO se dispara al salir de la pantalla del formulario, sino al confirmar el
168
+ * método de verificación — que es cuando la cuenta se registra contra el
169
+ * backend. Si los datos son inválidos, el evento no llega.
170
+ *
171
+ * Nunca incluye la CLABE ni el número de tarjeta completos.
172
+ */
173
+ interface TapipayDomiciliationFormCompletedEvent {
174
+ bankId: string;
175
+ /** Tipo de cuenta derivado de la longitud del identificador. */
176
+ accountType: TapipayDomiciliationAccountType;
177
+ /** Últimos 4 dígitos de la CLABE o tarjeta. `null` si no está disponible. */
178
+ lastFour: string | null;
179
+ }
180
+ /**
181
+ * Payload del evento domiciliationVerificationCompleted.
182
+ *
183
+ * La verificación de la cuenta llegó a un DESENLACE. Dos aclaraciones que
184
+ * importan para interpretarlo:
185
+ *
186
+ * 1. Solo emite al outcome final. Un intento de monto incorrecto que aún deja
187
+ * reintentos disponibles NO dispara el evento: `outcome: "failed"` llega
188
+ * recién cuando se agotan los intentos. Ausencia de evento NO significa que
189
+ * el usuario se frenó — puede estar reintentando.
190
+ * 2. Es method-agnostic y cubre el caso en que el paso de verificación no
191
+ * aparece en pantalla (banco que no la requiere, o método `kyc`/`transfer`):
192
+ * ahí también se emite, para que la secuencia no quede incompleta.
193
+ */
194
+ interface TapipayDomiciliationVerificationCompletedEvent {
195
+ method: TapipayDomiciliationVerificationMethod;
196
+ outcome: "approved" | "failed";
197
+ }
198
+ /**
199
+ * Payload del evento domiciliationConfirmed.
200
+ *
201
+ * El usuario confirmó la domiciliación. **No significa que quedó registrada:**
202
+ * se emite al click, sin esperar la respuesta del backend, que procesa el alta
203
+ * de forma asíncrona. La confirmación real llega por `autopayActivated`.
204
+ */
205
+ interface TapipayDomiciliationConfirmedEvent {
206
+ /** True si adhirió todas las deudas en vez de una selección. */
207
+ enrollAllDebts: boolean;
208
+ selectedProductsCount: number;
209
+ }
143
210
  /**
144
211
  * Instancia del SDK TapiPay expuesta en window.tapipay y retornada por loadTapipay().
145
212
  */
@@ -153,6 +220,10 @@ interface TapipayInstance {
153
220
  on(event: "autopayActivated", handler: (data: TapipayAutopayActivatedEvent) => void): void;
154
221
  on(event: "autopayRemoved", handler: (data: TapipayAutopayRemovedEvent) => void): void;
155
222
  on(event: "autopayError", handler: (data: TapipayAutopayErrorEvent) => void): void;
223
+ on(event: "domiciliationBankSelected", handler: (data: TapipayDomiciliationBankSelectedEvent) => void): void;
224
+ on(event: "domiciliationFormCompleted", handler: (data: TapipayDomiciliationFormCompletedEvent) => void): void;
225
+ on(event: "domiciliationVerificationCompleted", handler: (data: TapipayDomiciliationVerificationCompletedEvent) => void): void;
226
+ on(event: "domiciliationConfirmed", handler: (data: TapipayDomiciliationConfirmedEvent) => void): void;
156
227
  off(event: "paymentWindowOpened", handler: (data: TapipayPaymentWindowOpenedEvent) => void): void;
157
228
  off(event: "paymentSubmitted", handler: (data: TapipayPaymentSubmittedEvent) => void): void;
158
229
  off(event: "paymentCancelled", handler: (data: TapipayPaymentCancelledEvent) => void): void;
@@ -160,6 +231,10 @@ interface TapipayInstance {
160
231
  off(event: "autopayActivated", handler: (data: TapipayAutopayActivatedEvent) => void): void;
161
232
  off(event: "autopayRemoved", handler: (data: TapipayAutopayRemovedEvent) => void): void;
162
233
  off(event: "autopayError", handler: (data: TapipayAutopayErrorEvent) => void): void;
234
+ off(event: "domiciliationBankSelected", handler: (data: TapipayDomiciliationBankSelectedEvent) => void): void;
235
+ off(event: "domiciliationFormCompleted", handler: (data: TapipayDomiciliationFormCompletedEvent) => void): void;
236
+ off(event: "domiciliationVerificationCompleted", handler: (data: TapipayDomiciliationVerificationCompletedEvent) => void): void;
237
+ off(event: "domiciliationConfirmed", handler: (data: TapipayDomiciliationConfirmedEvent) => void): void;
163
238
  off(event: string, handler: (...args: unknown[]) => unknown): void;
164
239
  /** Cola interna usada por el stub antes de que cargue el SDK real. */
165
240
  _q?: [string, unknown[]][];
@@ -170,4 +245,4 @@ declare global {
170
245
  }
171
246
  }
172
247
 
173
- export type { LoadTapipayOptions as L, TapipayInstance as T, TapipayAutopayActivatedEvent as a, TapipayAutopayAdhesionSummary as b, TapipayAutopayErrorEvent as c, TapipayAutopayLoadedEvent as d, TapipayAutopayMediaType as e, TapipayAutopayRemovedEvent as f, TapipayEnvironment as g, TapipayOptions as h, TapipayPaymentCancelledEvent as i, TapipayPaymentSubmittedEvent as j, TapipayPaymentWindowOpenedEvent as k, TapipayView as l };
248
+ export type { LoadTapipayOptions as L, TapipayInstance as T, TapipayAutopayActivatedEvent as a, TapipayAutopayAdhesionSummary as b, TapipayAutopayErrorEvent as c, TapipayAutopayLoadedEvent as d, TapipayAutopayMediaType as e, TapipayAutopayRemovedEvent as f, TapipayDomiciliationAccountType as g, TapipayDomiciliationBankSelectedEvent as h, TapipayDomiciliationConfirmedEvent as i, TapipayDomiciliationFormCompletedEvent as j, TapipayDomiciliationVerificationCompletedEvent as k, TapipayDomiciliationVerificationMethod as l, TapipayEnvironment as m, TapipayOptions as n, TapipayPaymentCancelledEvent as o, TapipayPaymentSubmittedEvent as p, TapipayPaymentWindowOpenedEvent as q, TapipayView as r };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@npmtapi/embed",
3
- "version": "1.4.0",
3
+ "version": "1.5.0",
4
4
  "description": "TapiPay Embed SDK — carga y controla el widget de pago embebido",
5
5
  "type": "module",
6
6
  "exports": {