@votodigital-onpeui/react 0.1.56 → 0.1.58
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 +185 -13
- package/dist/{chunk-RL3RQN4O.mjs → chunk-DTIU6Q2O.mjs} +22 -12
- package/dist/chunk-DTIU6Q2O.mjs.map +1 -0
- package/dist/{chunk-XUSUDWMU.mjs → chunk-LHUNVLPX.mjs} +3 -3
- package/dist/{chunk-XUSUDWMU.mjs.map → chunk-LHUNVLPX.mjs.map} +1 -1
- package/dist/{chunk-RFIMDKOY.mjs → chunk-UWMR6FBN.mjs} +3 -3
- package/dist/{chunk-RFIMDKOY.mjs.map → chunk-UWMR6FBN.mjs.map} +1 -1
- package/dist/{chunk-7WO2CKUD.mjs → chunk-UZ6PCYO3.mjs} +3 -3
- package/dist/{chunk-7WO2CKUD.mjs.map → chunk-UZ6PCYO3.mjs.map} +1 -1
- package/dist/components.js +20 -10
- package/dist/components.js.map +1 -1
- package/dist/components.mjs +3 -3
- package/dist/hooks.js +20 -10
- package/dist/hooks.js.map +1 -1
- package/dist/hooks.mjs +2 -2
- package/dist/index.js +20 -10
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +4 -4
- package/dist/modal.js +21 -11
- package/dist/modal.js.map +1 -1
- package/dist/modal.mjs +3 -3
- package/dist/modal.mjs.map +1 -1
- package/package.json +3 -2
- package/dist/chunk-RL3RQN4O.mjs.map +0 -1
package/README.md
CHANGED
|
@@ -115,7 +115,7 @@ function App() {
|
|
|
115
115
|
<>
|
|
116
116
|
<button onClick={() => setIsOpen(true)}>Abrir Modal</button>
|
|
117
117
|
|
|
118
|
-
<Modal isOpen={isOpen} onClose={() => setIsOpen(false)} closeButton>
|
|
118
|
+
<Modal isOpen={isOpen} onClose={() => setIsOpen(false)} closeButton className="bg-white">
|
|
119
119
|
<h2>Título del Modal</h2>
|
|
120
120
|
<p>Contenido del modal.</p>
|
|
121
121
|
</Modal>
|
|
@@ -163,8 +163,9 @@ function App() {
|
|
|
163
163
|
onClose={() => setIsOpen(false)}
|
|
164
164
|
title="¿Estás seguro?"
|
|
165
165
|
message="Esta acción no se puede deshacer."
|
|
166
|
-
|
|
166
|
+
type="warning"
|
|
167
167
|
color="red"
|
|
168
|
+
buttonMode="double"
|
|
168
169
|
textButtonConfirm="Eliminar"
|
|
169
170
|
textButtonCancel="Cancelar"
|
|
170
171
|
onConfirm={() => console.log("confirmado")}
|
|
@@ -181,17 +182,26 @@ function App() {
|
|
|
181
182
|
|------|------|---------|-------------|
|
|
182
183
|
| `isOpen` | `boolean` | — | **(requerido)** |
|
|
183
184
|
| `onClose` | `() => void` | — | **(requerido)** |
|
|
184
|
-
| `title` | `string` | — | Título del modal
|
|
185
|
-
| `message` | `ReactNode` | — | Mensaje descriptivo
|
|
186
|
-
| `
|
|
187
|
-
| `
|
|
188
|
-
| `
|
|
185
|
+
| `title` | `string` | — | Título del modal |
|
|
186
|
+
| `message` | `ReactNode` | — | Mensaje descriptivo (string o JSX) |
|
|
187
|
+
| `content` | `ReactNode` | — | Alias de `message` |
|
|
188
|
+
| `type` | `'warning' \| 'success' \| 'question' \| 'info' \| 'none'` | `'warning'` | Determina el icono y el color por defecto |
|
|
189
|
+
| `buttonMode` | `'single' \| 'double' \| 'confirm'` | — | `single` = un botón, `double` = Cancelar + Confirmar, `confirm` = No + Sí |
|
|
190
|
+
| `color` | `'blue' \| 'red' \| 'skyblue' \| 'yellow'` | — | Override manual del color del icono y título |
|
|
189
191
|
| `textButtonConfirm` | `string` | `'Confirmar'` | Texto del botón de confirmación |
|
|
190
192
|
| `textButtonCancel` | `string` | `'Cancelar'` | Texto del botón de cancelación |
|
|
191
|
-
| `onConfirm` | `() => void
|
|
192
|
-
| `onCancel` | `() => void
|
|
193
|
+
| `onConfirm` | `() => void \| Promise<void>` | — | Acción al confirmar |
|
|
194
|
+
| `onCancel` | `() => void \| Promise<void>` | — | Acción al cancelar |
|
|
193
195
|
| `withoutAutoClose` | `boolean` | `false` | Evita que el modal se cierre automáticamente al confirmar/cancelar |
|
|
196
|
+
| `disabledConfirmButton` | `boolean` | `false` | Deshabilita el botón confirmar |
|
|
197
|
+
| `closeDisabled` | `boolean` | `false` | Deshabilita el cierre por click fuera y Escape |
|
|
198
|
+
| `closeButton` | `boolean` | `false` | Muestra botón X para cerrar |
|
|
199
|
+
| `alignJustify` | `boolean` | `false` | Alinea el texto del mensaje en justify en vez de centrado |
|
|
200
|
+
| `alignTop` | `boolean` | `false` | Alinea el modal al tope de la pantalla |
|
|
201
|
+
| `animated` | `boolean` | `true` | Habilita animación de entrada/salida |
|
|
202
|
+
| `preventBodyScroll` | `boolean` | `true` | Bloquea el scroll del body mientras el modal está abierto |
|
|
194
203
|
| `zIndexLevel` | `number` | `100` | Nivel de z-index |
|
|
204
|
+
| `className` | `string` | — | Clases adicionales |
|
|
195
205
|
|
|
196
206
|
---
|
|
197
207
|
|
|
@@ -202,10 +212,18 @@ Modal de carga con spinner animado y mensaje.
|
|
|
202
212
|
```tsx
|
|
203
213
|
import { ModalLoading } from "@votodigital-onpeui/react";
|
|
204
214
|
|
|
215
|
+
// Uso básico
|
|
205
216
|
<ModalLoading
|
|
206
217
|
isOpen={loading}
|
|
207
218
|
message="Procesando información..."
|
|
208
219
|
/>
|
|
220
|
+
|
|
221
|
+
// Con spinner personalizado
|
|
222
|
+
<ModalLoading
|
|
223
|
+
isOpen={loading}
|
|
224
|
+
message="Subiendo archivo..."
|
|
225
|
+
spinner={<div className="w-16 h-16 rounded-full border-4 border-white border-t-transparent animate-spin" />}
|
|
226
|
+
/>
|
|
209
227
|
```
|
|
210
228
|
|
|
211
229
|
#### Props
|
|
@@ -213,8 +231,156 @@ import { ModalLoading } from "@votodigital-onpeui/react";
|
|
|
213
231
|
| Prop | Tipo | Default | Descripción |
|
|
214
232
|
|------|------|---------|-------------|
|
|
215
233
|
| `isOpen` | `boolean` | — | **(requerido)** |
|
|
234
|
+
| `onClose` | `() => void` | — | Callback al cerrar |
|
|
216
235
|
| `message` | `string` | `'Cargando...'` | Mensaje de carga |
|
|
236
|
+
| `spinner` | `ReactNode` | — | Spinner personalizado. Si no se provee, se usa el spinner por defecto |
|
|
237
|
+
| `animated` | `boolean` | `true` | Habilita animación de entrada/salida |
|
|
238
|
+
| `preventBodyScroll` | `boolean` | `true` | Bloquea el scroll del body |
|
|
217
239
|
| `zIndexLevel` | `number` | `100` | Nivel de z-index |
|
|
240
|
+
| `className` | `string` | — | Clases adicionales |
|
|
241
|
+
|
|
242
|
+
---
|
|
243
|
+
|
|
244
|
+
### ModalLoadingPercentage
|
|
245
|
+
|
|
246
|
+
Modal de carga con barra de progreso y porcentaje.
|
|
247
|
+
|
|
248
|
+
```tsx
|
|
249
|
+
import { ModalLoadingPercentage } from "@votodigital-onpeui/react";
|
|
250
|
+
|
|
251
|
+
<ModalLoadingPercentage
|
|
252
|
+
isOpen={isOpen}
|
|
253
|
+
message="Importando padrón electoral"
|
|
254
|
+
percentage={progress}
|
|
255
|
+
/>
|
|
256
|
+
```
|
|
257
|
+
|
|
258
|
+
#### Props
|
|
259
|
+
|
|
260
|
+
| Prop | Tipo | Default | Descripción |
|
|
261
|
+
|------|------|---------|-------------|
|
|
262
|
+
| `isOpen` | `boolean` | — | **(requerido)** |
|
|
263
|
+
| `message` | `string` | — | **(requerido)** Texto que aparece sobre la barra de progreso |
|
|
264
|
+
| `percentage` | `number` | — | **(requerido)** Valor entre 0 y 100. Se clampea automáticamente |
|
|
265
|
+
| `alignTop` | `boolean` | `false` | Alinea el modal al tope de la pantalla en vez de al centro |
|
|
266
|
+
| `animated` | `boolean` | `true` | Habilita animación de entrada/salida |
|
|
267
|
+
| `preventBodyScroll` | `boolean` | `true` | Bloquea el scroll del body |
|
|
268
|
+
| `zIndexLevel` | `number` | `300` | Nivel de z-index |
|
|
269
|
+
|
|
270
|
+
---
|
|
271
|
+
|
|
272
|
+
### ModalGlobalProvider
|
|
273
|
+
|
|
274
|
+
Proveedor centralizado que gestiona los tres modales (ModalConfirm, ModalLoading, ModalLoadingPercentage) desde cualquier parte de la app sin props drilling. Usa Zustand internamente.
|
|
275
|
+
|
|
276
|
+
#### Setup
|
|
277
|
+
|
|
278
|
+
Envuelve tu app una sola vez:
|
|
279
|
+
|
|
280
|
+
```tsx
|
|
281
|
+
import { ModalGlobalProvider } from "@votodigital-onpeui/react";
|
|
282
|
+
|
|
283
|
+
function App() {
|
|
284
|
+
return (
|
|
285
|
+
<ModalGlobalProvider>
|
|
286
|
+
<Router />
|
|
287
|
+
</ModalGlobalProvider>
|
|
288
|
+
);
|
|
289
|
+
}
|
|
290
|
+
```
|
|
291
|
+
|
|
292
|
+
#### Usar el modal de confirmación
|
|
293
|
+
|
|
294
|
+
```tsx
|
|
295
|
+
import { useModalGlobalStore } from "@votodigital-onpeui/react";
|
|
296
|
+
|
|
297
|
+
function MiComponente() {
|
|
298
|
+
const { openModal, openModalWithClose } = useModalGlobalStore();
|
|
299
|
+
|
|
300
|
+
const handleEliminar = async () => {
|
|
301
|
+
// Retorna true (confirmar) o false (cancelar)
|
|
302
|
+
const confirmed = await openModal({
|
|
303
|
+
type: "warning",
|
|
304
|
+
title: "¿Estás seguro?",
|
|
305
|
+
message: "Esta acción no se puede deshacer.",
|
|
306
|
+
buttonMode: "double",
|
|
307
|
+
color: "red",
|
|
308
|
+
textButtonConfirm: "Eliminar",
|
|
309
|
+
});
|
|
310
|
+
|
|
311
|
+
if (confirmed) {
|
|
312
|
+
// lógica de eliminación
|
|
313
|
+
}
|
|
314
|
+
};
|
|
315
|
+
|
|
316
|
+
const handleConX = async () => {
|
|
317
|
+
// Retorna 'confirm' | 'cancel' | 'close'
|
|
318
|
+
const result = await openModalWithClose({
|
|
319
|
+
type: "info",
|
|
320
|
+
title: "Aviso",
|
|
321
|
+
message: "Revisa los datos antes de continuar.",
|
|
322
|
+
buttonMode: "single",
|
|
323
|
+
});
|
|
324
|
+
};
|
|
325
|
+
}
|
|
326
|
+
```
|
|
327
|
+
|
|
328
|
+
#### Usar el modal de loading
|
|
329
|
+
|
|
330
|
+
```tsx
|
|
331
|
+
import { useModalLoadingStore } from "@votodigital-onpeui/react";
|
|
332
|
+
|
|
333
|
+
function MiComponente() {
|
|
334
|
+
const { openLoading, closeLoading } = useModalLoadingStore();
|
|
335
|
+
|
|
336
|
+
const handleGuardar = async () => {
|
|
337
|
+
const sessionId = openLoading("Guardando...");
|
|
338
|
+
try {
|
|
339
|
+
await guardarDatos();
|
|
340
|
+
} finally {
|
|
341
|
+
closeLoading(sessionId);
|
|
342
|
+
}
|
|
343
|
+
};
|
|
344
|
+
}
|
|
345
|
+
```
|
|
346
|
+
|
|
347
|
+
#### Usar el modal de loading con porcentaje
|
|
348
|
+
|
|
349
|
+
```tsx
|
|
350
|
+
import { useModalLoadingPercentageStore } from "@votodigital-onpeui/react";
|
|
351
|
+
|
|
352
|
+
function MiComponente() {
|
|
353
|
+
const { openLoadingPercentage, updatePercentage, closeLoadingPercentage } =
|
|
354
|
+
useModalLoadingPercentageStore();
|
|
355
|
+
|
|
356
|
+
const handleImportar = async () => {
|
|
357
|
+
const sessionId = openLoadingPercentage("Importando padrón", 0);
|
|
358
|
+
for (let i = 0; i <= 100; i += 10) {
|
|
359
|
+
await procesarLote(i);
|
|
360
|
+
updatePercentage(i, sessionId);
|
|
361
|
+
}
|
|
362
|
+
closeLoadingPercentage(sessionId);
|
|
363
|
+
};
|
|
364
|
+
}
|
|
365
|
+
```
|
|
366
|
+
|
|
367
|
+
> **Nota sobre sessionId:** `openLoading`, `openLoadingPercentage` retornan un `sessionId`. Pasarlo a `closeLoading` / `closeLoadingPercentage` evita que una llamada tardía cierre un loading abierto por otra operación posterior.
|
|
368
|
+
|
|
369
|
+
#### Props de ModalGlobalProvider
|
|
370
|
+
|
|
371
|
+
| Prop | Tipo | Default | Descripción |
|
|
372
|
+
|------|------|---------|-------------|
|
|
373
|
+
| `children` | `ReactNode` | — | **(requerido)** |
|
|
374
|
+
| `zIndexLevel` | `number` | `200` | z-index del ModalConfirm |
|
|
375
|
+
| `zIndexLoading` | `number` | `300` | z-index del ModalLoading |
|
|
376
|
+
| `zIndexLoadingPercentage` | `number` | `300` | z-index del ModalLoadingPercentage |
|
|
377
|
+
| `animated` | `boolean` | `true` | Animación en todos los modales |
|
|
378
|
+
| `preventBodyScroll` | `boolean` | `true` | Scroll lock en todos los modales |
|
|
379
|
+
| `loadingSpinner` | `ReactNode` | — | Spinner personalizado para ModalLoading |
|
|
380
|
+
| `loadingPercentageAlignTop` | `boolean` | `false` | Alinea el ModalLoadingPercentage al tope |
|
|
381
|
+
| `defaultTextButtonConfirm` | `string` | — | Texto por defecto del botón confirmar |
|
|
382
|
+
| `defaultTextButtonCancel` | `string` | — | Texto por defecto del botón cancelar |
|
|
383
|
+
| `disableFocus` | `boolean` | `false` | Deshabilita el manejo de focus en todos los modales |
|
|
218
384
|
|
|
219
385
|
---
|
|
220
386
|
|
|
@@ -495,12 +661,18 @@ Modal
|
|
|
495
661
|
├── Portal
|
|
496
662
|
└── IconCloseRadius
|
|
497
663
|
|
|
498
|
-
ModalConfirm
|
|
499
|
-
ModalLoading
|
|
664
|
+
ModalConfirm → Modal
|
|
665
|
+
ModalLoading → Modal
|
|
666
|
+
ModalLoadingPercentage → Modal
|
|
500
667
|
ModalBrowserIncompatible → Modal + IconWarning + IconChromeColor + IconSafariColor + IconEdgeColor
|
|
501
668
|
ModalSystemIncompatible → Modal + IconWarning + IconWindow + IconAndroid + IconApple
|
|
502
|
-
ModalDnieVersions
|
|
503
|
-
ModalNfc
|
|
669
|
+
ModalDnieVersions → Modal
|
|
670
|
+
ModalNfc → Modal + IconAndroid + IconApple
|
|
671
|
+
|
|
672
|
+
ModalGlobalProvider → ModalConfirm + ModalLoading + ModalLoadingPercentage
|
|
673
|
+
useModalGlobalStore (Zustand) — openModal, openModalWithClose
|
|
674
|
+
useModalLoadingStore (Zustand) — openLoading, closeLoading
|
|
675
|
+
useModalLoadingPercentageStore (Zustand) — openLoadingPercentage, updatePercentage, closeLoadingPercentage
|
|
504
676
|
|
|
505
677
|
Footer → BrowserRecommended + iconos de redes sociales
|
|
506
678
|
NotRecommended → IconWarningNotRecommended + IconCloseRadius
|
|
@@ -18,15 +18,20 @@ var Portal = ({ children, container }) => {
|
|
|
18
18
|
};
|
|
19
19
|
var ModalGlobalContext = createContext(null);
|
|
20
20
|
var useModalGlobalContext = () => useContext(ModalGlobalContext);
|
|
21
|
-
var openModals = globalThis.__openModals || (globalThis.__openModals = /* @__PURE__ */ new
|
|
22
|
-
var
|
|
21
|
+
var openModals = globalThis.__openModals || (globalThis.__openModals = /* @__PURE__ */ new Map());
|
|
22
|
+
var computeZIndex = (requested) => {
|
|
23
|
+
if (openModals.size === 0) return requested;
|
|
24
|
+
const maxAssigned = Math.max(...openModals.values());
|
|
25
|
+
return Math.max(requested, maxAssigned + 20);
|
|
26
|
+
};
|
|
27
|
+
var registerModal = (id, zIndex, enabled) => {
|
|
28
|
+
openModals.set(id, zIndex);
|
|
23
29
|
if (!enabled || typeof document === "undefined") return;
|
|
24
|
-
openModals.add(id);
|
|
25
30
|
document.body.style.overflow = "hidden";
|
|
26
31
|
};
|
|
27
|
-
var
|
|
28
|
-
if (!enabled || typeof document === "undefined") return;
|
|
32
|
+
var unregisterModal = (id, enabled) => {
|
|
29
33
|
openModals.delete(id);
|
|
34
|
+
if (!enabled || typeof document === "undefined") return;
|
|
30
35
|
if (openModals.size === 0) {
|
|
31
36
|
document.body.style.overflow = "";
|
|
32
37
|
}
|
|
@@ -110,6 +115,7 @@ var Modal = ({
|
|
|
110
115
|
const ctx = useModalGlobalContext();
|
|
111
116
|
const animated = animatedProp ?? ctx?.animated ?? true;
|
|
112
117
|
const disableFocus = disableFocusProp ?? ctx?.disableFocus ?? false;
|
|
118
|
+
const [assignedZIndex, setAssignedZIndex] = useState(zIndexLevel);
|
|
113
119
|
const ariaLabelledBy = props["aria-labelledby"];
|
|
114
120
|
const modalRef = useRef(null);
|
|
115
121
|
const contentRef = useRef(null);
|
|
@@ -150,11 +156,15 @@ var Modal = ({
|
|
|
150
156
|
}
|
|
151
157
|
}, [isOpen, animated, onCloseComplete]);
|
|
152
158
|
useLayoutEffect(() => {
|
|
153
|
-
if (isOpen)
|
|
159
|
+
if (isOpen) {
|
|
160
|
+
const computed = computeZIndex(zIndexLevel);
|
|
161
|
+
setAssignedZIndex(computed);
|
|
162
|
+
registerModal(modalId, computed, preventBodyScroll);
|
|
163
|
+
}
|
|
154
164
|
return () => {
|
|
155
|
-
if (isOpen)
|
|
165
|
+
if (isOpen) unregisterModal(modalId, preventBodyScroll);
|
|
156
166
|
};
|
|
157
|
-
}, [isOpen, preventBodyScroll, modalId]);
|
|
167
|
+
}, [isOpen, preventBodyScroll, modalId, zIndexLevel]);
|
|
158
168
|
useEffect(() => {
|
|
159
169
|
if (!isOpen) return;
|
|
160
170
|
const resetScroll = () => {
|
|
@@ -326,7 +336,7 @@ var Modal = ({
|
|
|
326
336
|
/* @__PURE__ */ jsx(
|
|
327
337
|
"div",
|
|
328
338
|
{
|
|
329
|
-
style: { zIndex:
|
|
339
|
+
style: { zIndex: assignedZIndex },
|
|
330
340
|
className: [
|
|
331
341
|
"fixed inset-0 bg-onpe-blue",
|
|
332
342
|
animated ? "transition-opacity duration-200" : "",
|
|
@@ -338,7 +348,7 @@ var Modal = ({
|
|
|
338
348
|
/* @__PURE__ */ jsx(
|
|
339
349
|
"div",
|
|
340
350
|
{
|
|
341
|
-
style: { zIndex:
|
|
351
|
+
style: { zIndex: assignedZIndex + 10 },
|
|
342
352
|
className: [
|
|
343
353
|
"fixed top-0 w-full h-screen grid",
|
|
344
354
|
alignTop ? "place-items-start pt-8" : "place-items-center",
|
|
@@ -397,5 +407,5 @@ var Modal = ({
|
|
|
397
407
|
};
|
|
398
408
|
|
|
399
409
|
export { Modal, ModalGlobalContext, Portal };
|
|
400
|
-
//# sourceMappingURL=chunk-
|
|
401
|
-
//# sourceMappingURL=chunk-
|
|
410
|
+
//# sourceMappingURL=chunk-DTIU6Q2O.mjs.map
|
|
411
|
+
//# sourceMappingURL=chunk-DTIU6Q2O.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/components/Portal/Portal.tsx","../src/components/ModalGlobal/ModalGlobalContext.ts","../src/components/Modal/Modal.tsx"],"names":["useState","useEffect","activeIndex"],"mappings":"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","file":"chunk-DTIU6Q2O.mjs","sourcesContent":["import { ReactNode, useEffect, useState } from \"react\";\nimport { createPortal } from \"react-dom\";\n\nexport interface PortalProps {\n children?: ReactNode;\n container?: Element | DocumentFragment | null;\n}\n\nexport const Portal = ({ children, container }: PortalProps) => {\n const [mounted, setMounted] = useState(false);\n\n useEffect(() => {\n setMounted(true);\n return () => setMounted(false);\n }, []);\n\n if (!mounted) return null;\n\n let portalElement = container || document.querySelector(\"#portal\");\n if (!portalElement) {\n portalElement = document.body;\n }\n\n return createPortal(children, portalElement);\n};\n\nexport default Portal;\n","import { createContext, useContext } from \"react\";\n\ninterface ModalGlobalContextValue {\n animated: boolean;\n disableFocus: boolean;\n}\n\nexport const ModalGlobalContext = createContext<ModalGlobalContextValue | null>(null);\n\nexport const useModalGlobalContext = () => useContext(ModalGlobalContext);\n","import { HTMLAttributes, ReactNode, useEffect, useId, useLayoutEffect, useRef, useState } from \"react\";\nimport { Portal } from \"../Portal/Portal\";\nimport { IconCloseRadius } from \"../../icons/Actions/IconCloseRadius\";\nimport { useModalGlobalContext } from \"../ModalGlobal/ModalGlobalContext\";\n\nexport interface ModalProps extends HTMLAttributes<HTMLDivElement> {\n isOpen: boolean;\n onClose: () => void;\n children: ReactNode;\n whitoutBackground?: boolean;\n closeButton?: boolean;\n closeDisabled?: boolean;\n escapeToClose?: boolean;\n disableFocus?: boolean;\n disableFocusRestore?: boolean;\n existTabIndex?: boolean;\n zIndexLevel?: number;\n onCloseComplete?: () => void;\n /** Alinea el modal al tope de la pantalla en vez de al centro */\n alignTop?: boolean;\n /** Habilita animación de entrada/salida (default: true) */\n animated?: boolean;\n /** Bloquea el scroll del body mientras el modal está abierto (default: true) */\n preventBodyScroll?: boolean;\n overlayColor?:\n | \"blue\"\n | \"skyblue\"\n | \"skyblue-light\"\n | \"yellow\"\n | \"light-skyblue\"\n | \"gray\"\n | \"gray-light\"\n | \"gray-extra-light\"\n | \"red\"\n | \"dark-gray\"\n | \"green\"\n | \"yellow-light\"\n | \"primary\";\n}\n\n// Registry: modalId -> assigned zIndexLevel (backdrop level)\nconst openModals: Map<string, number> =\n (globalThis as unknown as Record<string, unknown>).__openModals as Map<string, number> ||\n ((globalThis as unknown as Record<string, Map<string, number>>).__openModals = new Map<string, number>());\n\n/**\n * Calcula el z-index a usar para el nuevo modal.\n * Si el zIndexLevel solicitado quedaría por debajo del contenido del modal\n * más alto abierto actualmente (assigned + 10), lo eleva automáticamente.\n */\nconst computeZIndex = (requested: number): number => {\n if (openModals.size === 0) return requested;\n const maxAssigned = Math.max(...openModals.values());\n // El contenido del modal más alto está en maxAssigned + 10.\n // El backdrop del nuevo modal debe estar por encima de eso.\n return Math.max(requested, maxAssigned + 20);\n};\n\nconst registerModal = (id: string, zIndex: number, enabled: boolean) => {\n openModals.set(id, zIndex);\n if (!enabled || typeof document === \"undefined\") return;\n document.body.style.overflow = \"hidden\";\n};\n\nconst unregisterModal = (id: string, enabled: boolean) => {\n openModals.delete(id);\n if (!enabled || typeof document === \"undefined\") return;\n if (openModals.size === 0) {\n document.body.style.overflow = \"\";\n }\n};\n\nconst FOCUSABLE_SELECTOR = [\n \"a[href]\",\n \"area[href]\",\n \"button:not([disabled])\",\n 'input:not([disabled]):not([type=\"hidden\"])',\n \"select:not([disabled])\",\n \"textarea:not([disabled])\",\n \"iframe\",\n \"object\",\n \"embed\",\n '[tabindex]:not([tabindex=\"-1\"])',\n '[contenteditable=\"true\"]',\n].join(\",\");\n\nconst FOCUS_GUARD_ATTRIBUTE = \"data-focus-guard\";\n\nconst focusGuardStyle = {\n position: \"absolute\",\n width: \"1px\",\n height: \"1px\",\n padding: 0,\n margin: 0,\n overflow: \"hidden\",\n clip: \"rect(0, 0, 0, 0)\",\n whiteSpace: \"nowrap\",\n border: 0,\n} as const;\n\nconst isElementVisible = (element: HTMLElement) => {\n const style = globalThis.getComputedStyle(element);\n return (\n style.visibility !== \"hidden\" &&\n style.display !== \"none\" &&\n element.offsetParent !== null\n );\n};\n\nconst getFocusableElements = (wrapper: HTMLElement, includeWrapper = true) => {\n let focusable = Array.from(wrapper.querySelectorAll<HTMLElement>(FOCUSABLE_SELECTOR)).filter(\n (el) =>\n !el.hasAttribute(FOCUS_GUARD_ATTRIBUTE) &&\n isElementVisible(el) &&\n el.tabIndex !== -1,\n );\n\n if (includeWrapper && wrapper.tabIndex >= 0) {\n focusable = [wrapper, ...focusable];\n }\n\n return focusable;\n};\n\nconst focusWrapper = (wrapper: HTMLElement, options?: FocusOptions) => {\n if (wrapper.tabIndex >= 0) {\n wrapper.focus(options);\n return;\n }\n\n const focusable = getFocusableElements(wrapper, false);\n focusable[0]?.focus(options);\n};\n\nconst focusEdgeElement = (\n wrapper: HTMLElement,\n position: \"first\" | \"last\",\n options?: FocusOptions,\n) => {\n const focusable = getFocusableElements(wrapper, false);\n const target = position === \"last\" ? focusable.at(-1) : focusable[0];\n\n if (target) {\n target.focus(options);\n return;\n }\n\n focusWrapper(wrapper, options);\n};\n\nexport const Modal = ({\n isOpen,\n onClose,\n children,\n whitoutBackground = false,\n closeButton = false,\n closeDisabled = false,\n escapeToClose = true,\n disableFocus: disableFocusProp,\n disableFocusRestore = false,\n existTabIndex = true,\n zIndexLevel = 100,\n onCloseComplete,\n alignTop = false,\n animated: animatedProp,\n preventBodyScroll = true,\n // eslint-disable-next-line @typescript-eslint/no-unused-vars -- overlayColor reservado para uso futuro\n overlayColor: _overlayColor = \"blue\",\n ...props\n}: ModalProps) => {\n const modalId = useId();\n const ctx = useModalGlobalContext();\n const animated = animatedProp ?? ctx?.animated ?? true;\n const disableFocus = disableFocusProp ?? ctx?.disableFocus ?? false;\n const [assignedZIndex, setAssignedZIndex] = useState(zIndexLevel);\n const ariaLabelledBy = props[\"aria-labelledby\"];\n const modalRef = useRef<HTMLDivElement>(null);\n const contentRef = useRef<HTMLDivElement>(null);\n const previousActiveElement = useRef<HTMLElement | null>(null);\n const handleStartFocusGuard = () => {\n const wrapper = modalRef.current;\n if (!wrapper) return;\n focusEdgeElement(wrapper, \"last\", { preventScroll: true });\n };\n const handleEndFocusGuard = () => {\n const wrapper = modalRef.current;\n if (!wrapper) return;\n focusEdgeElement(wrapper, \"first\", { preventScroll: true });\n };\n\n // CSS animation state (replaces framer-motion AnimatePresence)\n const [mounted, setMounted] = useState(false);\n const [visible, setVisible] = useState(false);\n\n // Cache children during exit animation (replicates AnimatePresence behavior):\n // when global state clears data before the modal finishes closing, the cached\n // children keep the content visible throughout the exit animation.\n const [cachedChildren, setCachedChildren] = useState<ReactNode>(children);\n useEffect(() => {\n if (isOpen) {\n setCachedChildren(children);\n }\n }, [isOpen, children]);\n\n useEffect(() => {\n if (!animated) return;\n if (isOpen) {\n setMounted(true);\n const raf = requestAnimationFrame(() => {\n requestAnimationFrame(() => setVisible(true));\n });\n return () => cancelAnimationFrame(raf);\n } else {\n setVisible(false);\n const timer = setTimeout(() => {\n setMounted(false);\n onCloseComplete?.();\n }, 200);\n return () => clearTimeout(timer);\n }\n }, [isOpen, animated, onCloseComplete]);\n\n // Body scroll lock + z-index auto-stacking\n useLayoutEffect(() => {\n if (isOpen) {\n const computed = computeZIndex(zIndexLevel);\n setAssignedZIndex(computed);\n registerModal(modalId, computed, preventBodyScroll);\n }\n return () => {\n if (isOpen) unregisterModal(modalId, preventBodyScroll);\n };\n }, [isOpen, preventBodyScroll, modalId, zIndexLevel]);\n\n // Scroll reset when opening\n useEffect(() => {\n if (!isOpen) return;\n const resetScroll = () => {\n const el = contentRef.current;\n if (!el) return;\n el.style.scrollBehavior = \"auto\";\n el.scrollTop = 0;\n requestAnimationFrame(() => {\n el.scrollTop = 0;\n setTimeout(() => {\n el.style.scrollBehavior = \"smooth\";\n }, 10);\n });\n };\n resetScroll();\n [10, 50, 100, 200].forEach((d) => setTimeout(resetScroll, d));\n }, [isOpen]);\n\n // Keyboard handling and focus trap\n useEffect(() => {\n const pendingTasks: Array<ReturnType<typeof globalThis.setTimeout>> = [];\n\n const handleDocumentFocusIn = (e: FocusEvent) => {\n if (!isOpen || disableFocus) return;\n const wrapper = modalRef.current;\n const target = e.target;\n\n if (!wrapper || !(target instanceof HTMLElement) || wrapper.contains(target)) {\n return;\n }\n\n requestAnimationFrame(() => {\n const currentActive = document.activeElement;\n if (currentActive instanceof HTMLElement && wrapper.contains(currentActive)) {\n return;\n }\n\n focusWrapper(wrapper, { preventScroll: true });\n });\n };\n\n const handleKeyDown = (e: KeyboardEvent) => {\n if (e.key === \"Escape\" && escapeToClose && !closeDisabled) {\n onClose();\n return;\n }\n\n if (!isOpen || disableFocus) return;\n const wrapper = modalRef.current;\n if (!wrapper) return;\n\n const focusable = getFocusableElements(wrapper);\n const active = (document.activeElement as HTMLElement) || null;\n\n const arrowKeys = [\"ArrowUp\", \"ArrowDown\", \"ArrowLeft\", \"ArrowRight\"];\n if (arrowKeys.includes(e.key)) {\n if (active && wrapper.contains(active)) {\n const activeIndex = focusable.indexOf(active);\n if (\n (e.key === \"ArrowUp\" || e.key === \"ArrowLeft\") &&\n activeIndex === 0\n ) {\n e.preventDefault();\n e.stopPropagation();\n if (focusable.length > 1) focusable.at(-1)?.focus();\n else active.focus();\n return;\n }\n if (\n (e.key === \"ArrowDown\" || e.key === \"ArrowRight\") &&\n activeIndex === focusable.length - 1\n ) {\n e.preventDefault();\n e.stopPropagation();\n if (focusable.length > 1) focusable[0].focus();\n else active.focus();\n return;\n }\n requestAnimationFrame(() => {\n const currentActive = document.activeElement as HTMLElement;\n if (!currentActive || !wrapper.contains(currentActive)) {\n if (activeIndex !== -1 && focusable[activeIndex])\n focusable[activeIndex].focus();\n else if (focusable.length > 0) focusable[0].focus();\n else wrapper.focus();\n }\n });\n } else {\n e.preventDefault();\n if (focusable.length > 0) {\n if (e.key === \"ArrowUp\" || e.key === \"ArrowLeft\")\n focusable.at(-1)?.focus();\n else focusable[0].focus();\n } else {\n wrapper.focus();\n }\n }\n return;\n }\n\n if (e.key !== \"Tab\") return;\n if (focusable.length === 0) {\n e.preventDefault();\n wrapper.focus();\n return;\n }\n\n const first = focusable[0];\n const last = focusable.at(-1);\n const isShift = e.shiftKey;\n\n if (!first || !last) {\n e.preventDefault();\n wrapper.focus();\n return;\n }\n\n if (!active || !wrapper.contains(active)) {\n e.preventDefault();\n (isShift ? last : first).focus();\n return;\n }\n\n const activeIndex = focusable.indexOf(active);\n if (\n !isShift &&\n (active === last || activeIndex === focusable.length - 1)\n ) {\n e.preventDefault();\n first.focus();\n return;\n }\n\n if (isShift) {\n e.preventDefault();\n if (active === first || active === wrapper || activeIndex === 0)\n last.focus();\n else if (activeIndex > 0) focusable[activeIndex - 1].focus();\n else last.focus();\n }\n };\n\n if (isOpen && !disableFocus) {\n previousActiveElement.current = document.activeElement as HTMLElement;\n\n const focusInitial = (wrapper: HTMLElement) => {\n focusWrapper(wrapper, { preventScroll: true });\n };\n\n const bindFocusManagement = (attempt = 0) => {\n const wrapper = modalRef.current;\n if (!wrapper) {\n if (attempt < 10) {\n pendingTasks.push(\n globalThis.setTimeout(() => bindFocusManagement(attempt + 1), 25),\n );\n }\n return;\n }\n\n focusInitial(wrapper);\n };\n\n document.addEventListener(\"keydown\", handleKeyDown);\n document.addEventListener(\"focusin\", handleDocumentFocusIn, true);\n pendingTasks.push(globalThis.setTimeout(() => bindFocusManagement(), 0));\n } else if (isOpen && disableFocus) {\n document.addEventListener(\"keydown\", handleKeyDown);\n }\n\n return () => {\n pendingTasks.forEach((task) => globalThis.clearTimeout(task));\n document.removeEventListener(\"keydown\", handleKeyDown);\n document.removeEventListener(\"focusin\", handleDocumentFocusIn, true);\n if (\n !disableFocus &&\n !disableFocusRestore &&\n previousActiveElement.current\n ) {\n previousActiveElement.current.focus();\n }\n };\n }, [\n isOpen,\n onClose,\n closeDisabled,\n escapeToClose,\n disableFocus,\n disableFocusRestore,\n ariaLabelledBy,\n ]);\n\n // Sin animación: renderizar directo desde isOpen (sin delay de useEffect)\n if (!animated && !isOpen) return null;\n // Con animación: usar mounted para controlar enter/exit transitions\n if (animated && !mounted) return null;\n\n const contentClass = [\n \"relative flex flex-col items-center justify-start\",\n whitoutBackground\n ? \"bg-transparent\"\n : [\n \"min-w-[320px] w-[95vw] max-w-[95vw] max-h-[90vh]\",\n \"overflow-y-auto scroll-smooth\",\n \"md:max-w-[1000px]\",\n ].join(\" \"),\n props.className || \"\",\n ]\n .filter(Boolean)\n .join(\" \");\n\n return (\n <Portal>\n {/* Backdrop */}\n <div\n style={{ zIndex: assignedZIndex }}\n className={[\n \"fixed inset-0 bg-onpe-blue\",\n animated ? \"transition-opacity duration-200\" : \"\",\n animated ? (visible ? \"opacity-80\" : \"opacity-0\") : \"opacity-80\",\n ].join(\" \")}\n onClick={onClose}\n />\n\n {/* Container */}\n <div\n style={{ zIndex: assignedZIndex + 10 }}\n className={[\n \"fixed top-0 w-full h-screen grid\",\n alignTop ? \"place-items-start pt-8\" : \"place-items-center\",\n animated ? \"transition-all duration-200\" : \"\",\n animated\n ? visible\n ? \"opacity-100 scale-100 translate-y-0\"\n : \"opacity-[0.2] scale-95 -translate-y-5\"\n : \"opacity-100 scale-100 translate-y-0\",\n ].join(\" \")}\n >\n <div className=\"relative grid place-items-center\">\n <div\n ref={modalRef}\n onClick={(e) => e.stopPropagation()}\n {...(existTabIndex && { tabIndex: disableFocus ? -1 : 0 })}\n role=\"dialog\"\n aria-modal=\"true\"\n aria-labelledby={props[\"aria-labelledby\"]}\n aria-describedby={props[\"aria-describedby\"]}\n aria-label={props[\"aria-label\"]}\n >\n <span\n tabIndex={disableFocus ? -1 : 0}\n aria-hidden=\"true\"\n {...{ [FOCUS_GUARD_ATTRIBUTE]: \"start\" }}\n style={focusGuardStyle}\n onFocus={handleStartFocusGuard}\n />\n <div ref={contentRef} className={contentClass}>\n {isOpen ? children : cachedChildren}\n </div>\n {closeButton && (\n <button\n onClick={onClose}\n className=\"absolute top-2.5 right-2.5 text-onpe-red cursor-pointer w-4 h-4 border-none bg-transparent p-0 md:w-6 md:h-6\"\n aria-label=\"Cerrar\"\n type=\"button\"\n >\n <IconCloseRadius aria-hidden=\"true\" className=\"w-full h-full\" />\n </button>\n )}\n <span\n tabIndex={disableFocus ? -1 : 0}\n aria-hidden=\"true\"\n {...{ [FOCUS_GUARD_ATTRIBUTE]: \"end\" }}\n style={focusGuardStyle}\n onFocus={handleEndFocusGuard}\n />\n </div>\n </div>\n </div>\n </Portal>\n );\n};\n\nexport default Modal;\n"]}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { Modal } from './chunk-
|
|
1
|
+
import { Modal } from './chunk-DTIU6Q2O.mjs';
|
|
2
2
|
import { create } from 'zustand';
|
|
3
3
|
import { useRef, useEffect, useCallback, useState } from 'react';
|
|
4
4
|
import io from 'socket.io-client';
|
|
@@ -474,5 +474,5 @@ var OnpeIdModal = ({
|
|
|
474
474
|
};
|
|
475
475
|
|
|
476
476
|
export { OnpeIdModal, useIframeCommunication, useIframePreload, useModalIframePreload, useOnpeIdAuth, useSendMessageToIframe, useSocketConnection };
|
|
477
|
-
//# sourceMappingURL=chunk-
|
|
478
|
-
//# sourceMappingURL=chunk-
|
|
477
|
+
//# sourceMappingURL=chunk-LHUNVLPX.mjs.map
|
|
478
|
+
//# sourceMappingURL=chunk-LHUNVLPX.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/hooks/onpeId/store/modalIframePreload.ts","../src/hooks/onpeId/useIframeCommunication/useIframeCommunication.ts","../src/hooks/onpeId/useIframePreload/useIframePreload.ts","../src/hooks/onpeId/useSocketConnection/useSocketConnection.ts","../src/hooks/useOnpeIdAuth/useOnpeIdAuth.ts","../src/hooks/useOnpeIdAuth/OnpeIdModal.tsx"],"names":["useRef","useEffect","useState","useCallback"],"mappings":"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","file":"chunk-XUSUDWMU.mjs","sourcesContent":["import { create } from \"zustand\";\n\ninterface ModalIframePreloadStore {\n modalUrl: string;\n isOpenModal: boolean;\n isIframeReady: boolean;\n setModalUrl: (url: string) => void;\n openModal: () => void;\n closeModal: () => void;\n setIsIframeReady: (ready: boolean) => void;\n reset: () => void;\n}\n\nconst INITIAL_STATE: Omit<\n ModalIframePreloadStore,\n \"setModalUrl\" | \"openModal\" | \"closeModal\" | \"setIsIframeReady\" | \"reset\"\n> = {\n modalUrl: \"\",\n isOpenModal: false,\n isIframeReady: false,\n};\n\nexport const useModalIframePreload = create<ModalIframePreloadStore>()(\n (set) => ({\n ...INITIAL_STATE,\n setModalUrl: (url: string) => set({ modalUrl: url }),\n openModal: () => set({ isOpenModal: true }),\n closeModal: () => {\n set({\n isOpenModal: false,\n isIframeReady: false,\n modalUrl: \"\",\n });\n },\n setIsIframeReady: (ready: boolean) => set({ isIframeReady: ready }),\n reset: () => set(INITIAL_STATE),\n })\n);\n","import { useEffect, useRef, useCallback } from \"react\";\n\nexport type MessageStatus = \"EXPIRED_APP\" | \"OPEN_APP\" | \"LAUNCH_APP\" | \"HOME_APP\" | \"NOT_APP\" | \"OPEN_MOBILE\";\n\nexport interface IframeMessage {\n status: MessageStatus;\n url?: string;\n data?: unknown;\n token?: string;\n type?: \"LOGIN\" | \"FIRMA\";\n}\n\ninterface UseIframeCommunicationParams {\n onExpiredApp?: (data: IframeMessage) => void;\n onOpenApp?: (data: IframeMessage) => void;\n onLaunchApp?: (data: IframeMessage) => void;\n onHomeApp?: (data: IframeMessage) => void;\n onNotApp?: (data: IframeMessage) => void;\n onOpenMobile?: (data: IframeMessage) => void;\n enabled?: boolean;\n allowedOrigin?: string;\n}\n\nexport const useIframeCommunication = ({\n onExpiredApp,\n onOpenApp,\n onLaunchApp,\n onHomeApp,\n onNotApp,\n onOpenMobile,\n enabled = true,\n allowedOrigin,\n}: UseIframeCommunicationParams = {}) => {\n const handlersRef = useRef({\n onExpiredApp,\n onOpenApp,\n onLaunchApp,\n onHomeApp,\n onNotApp,\n onOpenMobile,\n });\n\n useEffect(() => {\n handlersRef.current = {\n onExpiredApp,\n onOpenApp,\n onLaunchApp,\n onHomeApp,\n onNotApp,\n onOpenMobile,\n };\n }, [onExpiredApp, onOpenApp, onLaunchApp, onHomeApp, onNotApp, onOpenMobile]);\n\n useEffect(() => {\n if (!enabled) return;\n\n const handler = (event: MessageEvent) => {\n if (allowedOrigin && event.origin !== allowedOrigin) {\n console.warn(\n `Mensaje rechazado de origen no permitido: ${event.origin}`,\n );\n return;\n }\n\n const data = event.data as IframeMessage;\n if (!data?.status) return;\n\n const handlers = handlersRef.current;\n\n switch (data.status) {\n case \"EXPIRED_APP\":\n handlers.onExpiredApp?.(data);\n break;\n case \"OPEN_APP\":\n handlers.onOpenApp?.(data);\n break;\n case \"LAUNCH_APP\":\n handlers.onLaunchApp?.(data);\n break;\n case \"HOME_APP\":\n handlers.onHomeApp?.(data);\n break;\n case \"NOT_APP\":\n handlers.onNotApp?.(data);\n break;\n case \"OPEN_MOBILE\":\n handlers.onOpenMobile?.(data);\n break;\n default:\n break;\n }\n };\n\n globalThis.addEventListener(\"message\", handler);\n return () => globalThis.removeEventListener(\"message\", handler);\n }, [enabled, allowedOrigin]);\n};\n\ninterface UseSendMessageToIframeParams {\n iframeRef: React.RefObject<HTMLIFrameElement | null>;\n modalUrl: string;\n}\n\nexport const useSendMessageToIframe = ({\n iframeRef,\n modalUrl,\n}: UseSendMessageToIframeParams) => {\n const sendMessageToIframe = useCallback(\n (message: Record<string, unknown>) => {\n if (!iframeRef.current || !modalUrl) return;\n\n try {\n const iframeOrigin = new URL(modalUrl).origin;\n iframeRef.current.contentWindow?.postMessage(message, iframeOrigin);\n } catch (error) {\n console.error(\"Error al enviar mensaje al iframe:\", error);\n }\n },\n [iframeRef, modalUrl],\n );\n\n return { sendMessageToIframe };\n};\n","import { useRef } from \"react\";\n\nimport { useModalIframePreload } from \"../store/modalIframePreload\";\n\nexport const useIframePreload = () => {\n const {\n modalUrl,\n setModalUrl,\n isOpenModal,\n closeModal,\n setIsIframeReady,\n openModal,\n reset,\n } = useModalIframePreload();\n\n const preloadIframeRef = useRef<HTMLIFrameElement>(null);\n const iframeRef = useRef<HTMLIFrameElement>(null);\n\n const isPreloading = !!modalUrl && !isOpenModal;\n\n const handlePreloadIframeReady = () => {\n setIsIframeReady(true);\n openModal();\n };\n\n const handleModalIframeReady = () => {\n if (!useModalIframePreload.getState().isIframeReady) {\n setIsIframeReady(true);\n }\n };\n\n return {\n modalUrl,\n setModalUrl,\n isOpenModal,\n closeModal,\n isPreloading,\n preloadIframeRef,\n iframeRef,\n handlePreloadIframeReady,\n handleModalIframeReady,\n reset,\n };\n};\n","import { useEffect, useRef, useState } from \"react\";\nimport io, { type Socket } from \"socket.io-client\";\n\nconst RECONNECTION_ATTEMPTS = 14;\n\nexport interface SocketEventData {\n success: boolean;\n token: string;\n}\n\ninterface UseSocketConnectionParams {\n socketUrl: string;\n secure?: boolean;\n isOpenLaunchApp: boolean;\n dataOpenLaunchApp: Record<string, unknown>;\n closeLaunchApp: () => void;\n closeModal: () => void;\n onComplete?: (data: SocketEventData) => void;\n onDisconnectClient?: () => void;\n onDisconnect?: () => void;\n onMaxReconnects?: () => void;\n onConnectionChange?: (connected: boolean) => void;\n enabled?: boolean;\n isSessionExpired?: boolean;\n}\n\nexport const useSocketConnection = ({\n socketUrl,\n secure = false,\n isOpenLaunchApp,\n dataOpenLaunchApp,\n closeLaunchApp,\n closeModal,\n onComplete,\n onDisconnectClient,\n onDisconnect,\n onMaxReconnects,\n onConnectionChange,\n enabled = true,\n isSessionExpired = false,\n}: UseSocketConnectionParams) => {\n const socketRef = useRef<Socket | null>(null);\n const [attempts, setAttempts] = useState(0);\n\n const dataOpenLaunchAppRef = useRef(dataOpenLaunchApp);\n const closeLaunchAppRef = useRef(closeLaunchApp);\n const closeModalRef = useRef(closeModal);\n const enabledRef = useRef(enabled);\n const onConnectionChangeRef = useRef(onConnectionChange);\n const onCompleteRef = useRef(onComplete);\n const onDisconnectClientRef = useRef(onDisconnectClient);\n const onDisconnectRef = useRef(onDisconnect);\n const onMaxReconnectsRef = useRef(onMaxReconnects);\n\n useEffect(() => {\n dataOpenLaunchAppRef.current = dataOpenLaunchApp;\n closeLaunchAppRef.current = closeLaunchApp;\n closeModalRef.current = closeModal;\n enabledRef.current = enabled;\n onConnectionChangeRef.current = onConnectionChange;\n onCompleteRef.current = onComplete;\n onDisconnectClientRef.current = onDisconnectClient;\n onDisconnectRef.current = onDisconnect;\n onMaxReconnectsRef.current = onMaxReconnects;\n }, [\n dataOpenLaunchApp,\n closeLaunchApp,\n closeModal,\n enabled,\n onConnectionChange,\n onComplete,\n onDisconnectClient,\n onDisconnect,\n onMaxReconnects,\n ]);\n\n useEffect(() => {\n if (attempts === RECONNECTION_ATTEMPTS) {\n if (socketRef.current) {\n socketRef.current.disconnect();\n }\n closeLaunchAppRef.current();\n onConnectionChangeRef.current?.(false);\n closeModalRef.current();\n onMaxReconnectsRef.current?.();\n setTimeout(() => setAttempts(0), 0);\n }\n }, [attempts]);\n\n useEffect(() => {\n if (!enabled) {\n if (socketRef.current) {\n socketRef.current.removeAllListeners();\n socketRef.current.disconnect();\n socketRef.current = null;\n onConnectionChangeRef.current?.(false);\n setTimeout(() => setAttempts(0), 0);\n }\n return;\n }\n\n if (!isOpenLaunchApp) {\n if (socketRef.current) {\n socketRef.current.removeAllListeners();\n socketRef.current.disconnect();\n socketRef.current = null;\n }\n return;\n }\n\n if (!socketRef.current) {\n socketRef.current = io(socketUrl, {\n transports: [\"websocket\"],\n secure,\n upgrade: false,\n forceNew: true,\n reconnection: true,\n reconnectionAttempts: RECONNECTION_ATTEMPTS,\n reconnectionDelay: 2000,\n reconnectionDelayMax: 1000,\n });\n\n const socket = socketRef.current;\n\n const handleConnect = () => {\n if (!enabledRef.current) return;\n\n onConnectionChangeRef.current?.(true);\n if (socketRef.current) {\n const jsonObject = dataOpenLaunchAppRef.current;\n\n if (jsonObject && Object.keys(jsonObject).length > 0) {\n socketRef.current.emit(\"setToken\", jsonObject);\n } else {\n setTimeout(() => {\n const delayedData = dataOpenLaunchAppRef.current;\n if (\n delayedData &&\n Object.keys(delayedData).length > 0 &&\n socketRef.current &&\n enabledRef.current\n ) {\n socketRef.current.emit(\"setToken\", delayedData);\n }\n }, 100);\n }\n } else {\n console.error(\"Socket no está disponible para enviar token\");\n }\n };\n\n const handleDisconnect = () => {\n if (!enabledRef.current) return;\n\n onConnectionChangeRef.current?.(false);\n closeLaunchAppRef.current();\n closeModalRef.current();\n onDisconnectRef.current?.();\n };\n\n const handleReconnectAttempt = (attemptNumber: number) => {\n setAttempts(attemptNumber);\n };\n\n const handleConnectError = (error: Error) => {\n console.error(\"Error de conexión socket:\", error);\n };\n\n const handleComplete = (data: SocketEventData) => {\n if (!enabledRef.current) return;\n closeLaunchAppRef.current();\n onConnectionChangeRef.current?.(false);\n closeModalRef.current();\n onCompleteRef.current?.(data);\n };\n\n const handleServerTimeout = () => {\n if (!enabledRef.current) return;\n closeLaunchAppRef.current();\n onConnectionChangeRef.current?.(false);\n closeModalRef.current();\n };\n\n const handleDisconnectClient = () => {\n if (!enabledRef.current) return;\n closeLaunchAppRef.current();\n onConnectionChangeRef.current?.(false);\n closeModalRef.current();\n onDisconnectClientRef.current?.();\n };\n\n socket.on(\"connect\", handleConnect);\n socket.on(\"disconnect\", handleDisconnect);\n socket.on(\"connect_error\", handleConnectError);\n socket.io.on(\"reconnect_attempt\", handleReconnectAttempt);\n socket.on(\"onProcessComplete\", handleComplete);\n socket.on(\"onValidationComplete\", handleComplete);\n socket.on(\"onProcessCompleteFirma\", handleComplete);\n socket.on(\"onServerTimeout\", handleServerTimeout);\n socket.on(\"onDisconnectClient\", handleDisconnectClient);\n }\n\n return () => {\n if (socketRef.current && (!enabled || !isOpenLaunchApp)) {\n socketRef.current.removeAllListeners();\n socketRef.current.disconnect();\n socketRef.current = null;\n }\n };\n }, [enabled, isOpenLaunchApp, socketUrl, secure]);\n\n useEffect(() => {\n if (isSessionExpired && socketRef.current) {\n socketRef.current.emit(\"setToken\", \"TIMEOUT_APP\");\n }\n }, [isSessionExpired]);\n\n useEffect(() => {\n return () => {\n if (socketRef.current) {\n socketRef.current.removeAllListeners();\n socketRef.current.disconnect();\n socketRef.current = null;\n }\n };\n }, []);\n\n return { attempts };\n};\n","import { useState, useCallback, useEffect } from \"react\";\n\nimport {\n useIframeCommunication,\n useIframePreload,\n useSocketConnection,\n type SocketEventData,\n} from \"../onpeId\";\n\ninterface UseOnpeIdAuthParams {\n socketUrl: string;\n secure?: boolean;\n navigate: (url: string) => void;\n onConnectionChange?: (connected: boolean) => void;\n connectionApp?: boolean;\n onPageReload?: () => void;\n onComplete?: (data: SocketEventData) => void;\n onDisconnectClient?: () => void;\n onExpiredApp?: () => void;\n onDisconnect?: () => void;\n onMaxReconnects?: () => void;\n onHomeApp?: () => void;\n onNotApp?: () => void;\n onOpenMobile?: (data: Record<string, unknown>) => void;\n isSessionExpired?: boolean;\n}\n\nexport const useOnpeIdAuth = ({\n socketUrl,\n secure = false,\n navigate,\n onConnectionChange,\n connectionApp,\n onPageReload,\n onComplete,\n onHomeApp,\n onNotApp,\n onDisconnectClient,\n isSessionExpired,\n onExpiredApp,\n onDisconnect,\n onMaxReconnects,\n onOpenMobile,\n}: UseOnpeIdAuthParams) => {\n const [isOpenLaunchApp, setIsOpenLaunchApp] = useState(false);\n const [dataOpenLaunchApp, setDataOpenLaunchApp] = useState<\n Record<string, unknown>\n >({});\n\n const openLaunchApp = useCallback(() => setIsOpenLaunchApp(true), []);\n const closeLaunchApp = useCallback(() => setIsOpenLaunchApp(false), []);\n\n const {\n modalUrl,\n setModalUrl,\n isOpenModal,\n isPreloading,\n closeModal,\n preloadIframeRef,\n iframeRef,\n handlePreloadIframeReady,\n handleModalIframeReady,\n reset: resetIframeState,\n } = useIframePreload();\n\n const handleClose = useCallback(() => {\n onConnectionChange?.(false);\n closeModal();\n closeLaunchApp();\n resetIframeState();\n }, [closeModal, closeLaunchApp, resetIframeState, onConnectionChange]);\n\n useEffect(() => {\n if (connectionApp) {\n onConnectionChange?.(false);\n onPageReload?.();\n }\n return () => {\n resetIframeState();\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps -- solo se ejecuta en el primer render\n }, []);\n\n const { attempts } = useSocketConnection({\n socketUrl,\n secure,\n isOpenLaunchApp,\n dataOpenLaunchApp,\n closeLaunchApp,\n closeModal: handleClose,\n onComplete,\n onDisconnectClient,\n onDisconnect,\n onMaxReconnects,\n onConnectionChange,\n enabled: isOpenModal && !!modalUrl,\n isSessionExpired,\n });\n\n useIframeCommunication({\n onExpiredApp: () => {\n handleClose();\n onExpiredApp?.();\n },\n onOpenApp: (data) => {\n navigate(data.url!);\n },\n onLaunchApp: (data) => {\n openLaunchApp();\n setDataOpenLaunchApp((data.data as Record<string, unknown>) ?? {});\n },\n onOpenMobile: (data) => {\n onOpenMobile?.((data.data as Record<string, unknown>) ?? {});\n },\n onHomeApp: () => {\n handleClose();\n onHomeApp?.();\n },\n onNotApp: () => {\n handleClose();\n onNotApp?.();\n },\n });\n\n return {\n modalUrl,\n setModalUrl,\n isOpenModal,\n isPreloading,\n isOpenLaunchApp,\n handleClose,\n iframeRef,\n preloadIframeRef,\n handlePreloadIframeReady,\n handleModalIframeReady,\n attempts,\n reset: resetIframeState,\n };\n};\n","import { useState } from \"react\";\n\nimport { Modal } from \"../../components/Modal\";\n\ninterface OnpeIdModalProps {\n modalUrl: string;\n isOpenModal: boolean;\n isOpenLaunchApp: boolean;\n isOnline: boolean;\n onClose: () => void;\n iframeRef: React.RefObject<HTMLIFrameElement | null>;\n preloadIframeRef: React.RefObject<HTMLIFrameElement | null>;\n handlePreloadIframeReady: () => void;\n handleModalIframeReady: () => void;\n disableFocus?: boolean;\n}\n\nexport const OnpeIdModal = ({\n modalUrl,\n isOpenModal,\n isOpenLaunchApp,\n isOnline,\n onClose,\n iframeRef,\n preloadIframeRef,\n handlePreloadIframeReady,\n handleModalIframeReady,\n disableFocus = false,\n}: OnpeIdModalProps) => {\n const [isIframeLoaded, setIsIframeLoaded] = useState(false);\n\n return (\n <>\n {modalUrl && !isOpenModal && isOnline && (\n <iframe\n ref={preloadIframeRef}\n src={modalUrl}\n className=\"hidden\"\n onLoad={handlePreloadIframeReady}\n title=\"Precarga ONPE ID\"\n />\n )}\n\n <Modal\n isOpen={isOpenModal && isOnline}\n onClose={onClose}\n className=\"bg-white max-w-custom-673 p-10 relative\"\n closeButton={!isOpenLaunchApp && isIframeLoaded}\n escapeToClose={false}\n disableFocus={disableFocus}\n >\n {!!modalUrl && isOnline && (\n <iframe\n ref={iframeRef}\n src={modalUrl}\n onLoad={() => {\n handleModalIframeReady();\n setIsIframeLoaded(true);\n }}\n className=\"w-full h-[410px] min-[400px]:h-[390px] md:h-[312px]\"\n title=\"Aplicativo ONPEID para autenticación y registro\"\n />\n )}\n </Modal>\n </>\n );\n};\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/hooks/onpeId/store/modalIframePreload.ts","../src/hooks/onpeId/useIframeCommunication/useIframeCommunication.ts","../src/hooks/onpeId/useIframePreload/useIframePreload.ts","../src/hooks/onpeId/useSocketConnection/useSocketConnection.ts","../src/hooks/useOnpeIdAuth/useOnpeIdAuth.ts","../src/hooks/useOnpeIdAuth/OnpeIdModal.tsx"],"names":["useRef","useEffect","useState","useCallback"],"mappings":"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","file":"chunk-LHUNVLPX.mjs","sourcesContent":["import { create } from \"zustand\";\n\ninterface ModalIframePreloadStore {\n modalUrl: string;\n isOpenModal: boolean;\n isIframeReady: boolean;\n setModalUrl: (url: string) => void;\n openModal: () => void;\n closeModal: () => void;\n setIsIframeReady: (ready: boolean) => void;\n reset: () => void;\n}\n\nconst INITIAL_STATE: Omit<\n ModalIframePreloadStore,\n \"setModalUrl\" | \"openModal\" | \"closeModal\" | \"setIsIframeReady\" | \"reset\"\n> = {\n modalUrl: \"\",\n isOpenModal: false,\n isIframeReady: false,\n};\n\nexport const useModalIframePreload = create<ModalIframePreloadStore>()(\n (set) => ({\n ...INITIAL_STATE,\n setModalUrl: (url: string) => set({ modalUrl: url }),\n openModal: () => set({ isOpenModal: true }),\n closeModal: () => {\n set({\n isOpenModal: false,\n isIframeReady: false,\n modalUrl: \"\",\n });\n },\n setIsIframeReady: (ready: boolean) => set({ isIframeReady: ready }),\n reset: () => set(INITIAL_STATE),\n })\n);\n","import { useEffect, useRef, useCallback } from \"react\";\n\nexport type MessageStatus = \"EXPIRED_APP\" | \"OPEN_APP\" | \"LAUNCH_APP\" | \"HOME_APP\" | \"NOT_APP\" | \"OPEN_MOBILE\";\n\nexport interface IframeMessage {\n status: MessageStatus;\n url?: string;\n data?: unknown;\n token?: string;\n type?: \"LOGIN\" | \"FIRMA\";\n}\n\ninterface UseIframeCommunicationParams {\n onExpiredApp?: (data: IframeMessage) => void;\n onOpenApp?: (data: IframeMessage) => void;\n onLaunchApp?: (data: IframeMessage) => void;\n onHomeApp?: (data: IframeMessage) => void;\n onNotApp?: (data: IframeMessage) => void;\n onOpenMobile?: (data: IframeMessage) => void;\n enabled?: boolean;\n allowedOrigin?: string;\n}\n\nexport const useIframeCommunication = ({\n onExpiredApp,\n onOpenApp,\n onLaunchApp,\n onHomeApp,\n onNotApp,\n onOpenMobile,\n enabled = true,\n allowedOrigin,\n}: UseIframeCommunicationParams = {}) => {\n const handlersRef = useRef({\n onExpiredApp,\n onOpenApp,\n onLaunchApp,\n onHomeApp,\n onNotApp,\n onOpenMobile,\n });\n\n useEffect(() => {\n handlersRef.current = {\n onExpiredApp,\n onOpenApp,\n onLaunchApp,\n onHomeApp,\n onNotApp,\n onOpenMobile,\n };\n }, [onExpiredApp, onOpenApp, onLaunchApp, onHomeApp, onNotApp, onOpenMobile]);\n\n useEffect(() => {\n if (!enabled) return;\n\n const handler = (event: MessageEvent) => {\n if (allowedOrigin && event.origin !== allowedOrigin) {\n console.warn(\n `Mensaje rechazado de origen no permitido: ${event.origin}`,\n );\n return;\n }\n\n const data = event.data as IframeMessage;\n if (!data?.status) return;\n\n const handlers = handlersRef.current;\n\n switch (data.status) {\n case \"EXPIRED_APP\":\n handlers.onExpiredApp?.(data);\n break;\n case \"OPEN_APP\":\n handlers.onOpenApp?.(data);\n break;\n case \"LAUNCH_APP\":\n handlers.onLaunchApp?.(data);\n break;\n case \"HOME_APP\":\n handlers.onHomeApp?.(data);\n break;\n case \"NOT_APP\":\n handlers.onNotApp?.(data);\n break;\n case \"OPEN_MOBILE\":\n handlers.onOpenMobile?.(data);\n break;\n default:\n break;\n }\n };\n\n globalThis.addEventListener(\"message\", handler);\n return () => globalThis.removeEventListener(\"message\", handler);\n }, [enabled, allowedOrigin]);\n};\n\ninterface UseSendMessageToIframeParams {\n iframeRef: React.RefObject<HTMLIFrameElement | null>;\n modalUrl: string;\n}\n\nexport const useSendMessageToIframe = ({\n iframeRef,\n modalUrl,\n}: UseSendMessageToIframeParams) => {\n const sendMessageToIframe = useCallback(\n (message: Record<string, unknown>) => {\n if (!iframeRef.current || !modalUrl) return;\n\n try {\n const iframeOrigin = new URL(modalUrl).origin;\n iframeRef.current.contentWindow?.postMessage(message, iframeOrigin);\n } catch (error) {\n console.error(\"Error al enviar mensaje al iframe:\", error);\n }\n },\n [iframeRef, modalUrl],\n );\n\n return { sendMessageToIframe };\n};\n","import { useRef } from \"react\";\n\nimport { useModalIframePreload } from \"../store/modalIframePreload\";\n\nexport const useIframePreload = () => {\n const {\n modalUrl,\n setModalUrl,\n isOpenModal,\n closeModal,\n setIsIframeReady,\n openModal,\n reset,\n } = useModalIframePreload();\n\n const preloadIframeRef = useRef<HTMLIFrameElement>(null);\n const iframeRef = useRef<HTMLIFrameElement>(null);\n\n const isPreloading = !!modalUrl && !isOpenModal;\n\n const handlePreloadIframeReady = () => {\n setIsIframeReady(true);\n openModal();\n };\n\n const handleModalIframeReady = () => {\n if (!useModalIframePreload.getState().isIframeReady) {\n setIsIframeReady(true);\n }\n };\n\n return {\n modalUrl,\n setModalUrl,\n isOpenModal,\n closeModal,\n isPreloading,\n preloadIframeRef,\n iframeRef,\n handlePreloadIframeReady,\n handleModalIframeReady,\n reset,\n };\n};\n","import { useEffect, useRef, useState } from \"react\";\nimport io, { type Socket } from \"socket.io-client\";\n\nconst RECONNECTION_ATTEMPTS = 14;\n\nexport interface SocketEventData {\n success: boolean;\n token: string;\n}\n\ninterface UseSocketConnectionParams {\n socketUrl: string;\n secure?: boolean;\n isOpenLaunchApp: boolean;\n dataOpenLaunchApp: Record<string, unknown>;\n closeLaunchApp: () => void;\n closeModal: () => void;\n onComplete?: (data: SocketEventData) => void;\n onDisconnectClient?: () => void;\n onDisconnect?: () => void;\n onMaxReconnects?: () => void;\n onConnectionChange?: (connected: boolean) => void;\n enabled?: boolean;\n isSessionExpired?: boolean;\n}\n\nexport const useSocketConnection = ({\n socketUrl,\n secure = false,\n isOpenLaunchApp,\n dataOpenLaunchApp,\n closeLaunchApp,\n closeModal,\n onComplete,\n onDisconnectClient,\n onDisconnect,\n onMaxReconnects,\n onConnectionChange,\n enabled = true,\n isSessionExpired = false,\n}: UseSocketConnectionParams) => {\n const socketRef = useRef<Socket | null>(null);\n const [attempts, setAttempts] = useState(0);\n\n const dataOpenLaunchAppRef = useRef(dataOpenLaunchApp);\n const closeLaunchAppRef = useRef(closeLaunchApp);\n const closeModalRef = useRef(closeModal);\n const enabledRef = useRef(enabled);\n const onConnectionChangeRef = useRef(onConnectionChange);\n const onCompleteRef = useRef(onComplete);\n const onDisconnectClientRef = useRef(onDisconnectClient);\n const onDisconnectRef = useRef(onDisconnect);\n const onMaxReconnectsRef = useRef(onMaxReconnects);\n\n useEffect(() => {\n dataOpenLaunchAppRef.current = dataOpenLaunchApp;\n closeLaunchAppRef.current = closeLaunchApp;\n closeModalRef.current = closeModal;\n enabledRef.current = enabled;\n onConnectionChangeRef.current = onConnectionChange;\n onCompleteRef.current = onComplete;\n onDisconnectClientRef.current = onDisconnectClient;\n onDisconnectRef.current = onDisconnect;\n onMaxReconnectsRef.current = onMaxReconnects;\n }, [\n dataOpenLaunchApp,\n closeLaunchApp,\n closeModal,\n enabled,\n onConnectionChange,\n onComplete,\n onDisconnectClient,\n onDisconnect,\n onMaxReconnects,\n ]);\n\n useEffect(() => {\n if (attempts === RECONNECTION_ATTEMPTS) {\n if (socketRef.current) {\n socketRef.current.disconnect();\n }\n closeLaunchAppRef.current();\n onConnectionChangeRef.current?.(false);\n closeModalRef.current();\n onMaxReconnectsRef.current?.();\n setTimeout(() => setAttempts(0), 0);\n }\n }, [attempts]);\n\n useEffect(() => {\n if (!enabled) {\n if (socketRef.current) {\n socketRef.current.removeAllListeners();\n socketRef.current.disconnect();\n socketRef.current = null;\n onConnectionChangeRef.current?.(false);\n setTimeout(() => setAttempts(0), 0);\n }\n return;\n }\n\n if (!isOpenLaunchApp) {\n if (socketRef.current) {\n socketRef.current.removeAllListeners();\n socketRef.current.disconnect();\n socketRef.current = null;\n }\n return;\n }\n\n if (!socketRef.current) {\n socketRef.current = io(socketUrl, {\n transports: [\"websocket\"],\n secure,\n upgrade: false,\n forceNew: true,\n reconnection: true,\n reconnectionAttempts: RECONNECTION_ATTEMPTS,\n reconnectionDelay: 2000,\n reconnectionDelayMax: 1000,\n });\n\n const socket = socketRef.current;\n\n const handleConnect = () => {\n if (!enabledRef.current) return;\n\n onConnectionChangeRef.current?.(true);\n if (socketRef.current) {\n const jsonObject = dataOpenLaunchAppRef.current;\n\n if (jsonObject && Object.keys(jsonObject).length > 0) {\n socketRef.current.emit(\"setToken\", jsonObject);\n } else {\n setTimeout(() => {\n const delayedData = dataOpenLaunchAppRef.current;\n if (\n delayedData &&\n Object.keys(delayedData).length > 0 &&\n socketRef.current &&\n enabledRef.current\n ) {\n socketRef.current.emit(\"setToken\", delayedData);\n }\n }, 100);\n }\n } else {\n console.error(\"Socket no está disponible para enviar token\");\n }\n };\n\n const handleDisconnect = () => {\n if (!enabledRef.current) return;\n\n onConnectionChangeRef.current?.(false);\n closeLaunchAppRef.current();\n closeModalRef.current();\n onDisconnectRef.current?.();\n };\n\n const handleReconnectAttempt = (attemptNumber: number) => {\n setAttempts(attemptNumber);\n };\n\n const handleConnectError = (error: Error) => {\n console.error(\"Error de conexión socket:\", error);\n };\n\n const handleComplete = (data: SocketEventData) => {\n if (!enabledRef.current) return;\n closeLaunchAppRef.current();\n onConnectionChangeRef.current?.(false);\n closeModalRef.current();\n onCompleteRef.current?.(data);\n };\n\n const handleServerTimeout = () => {\n if (!enabledRef.current) return;\n closeLaunchAppRef.current();\n onConnectionChangeRef.current?.(false);\n closeModalRef.current();\n };\n\n const handleDisconnectClient = () => {\n if (!enabledRef.current) return;\n closeLaunchAppRef.current();\n onConnectionChangeRef.current?.(false);\n closeModalRef.current();\n onDisconnectClientRef.current?.();\n };\n\n socket.on(\"connect\", handleConnect);\n socket.on(\"disconnect\", handleDisconnect);\n socket.on(\"connect_error\", handleConnectError);\n socket.io.on(\"reconnect_attempt\", handleReconnectAttempt);\n socket.on(\"onProcessComplete\", handleComplete);\n socket.on(\"onValidationComplete\", handleComplete);\n socket.on(\"onProcessCompleteFirma\", handleComplete);\n socket.on(\"onServerTimeout\", handleServerTimeout);\n socket.on(\"onDisconnectClient\", handleDisconnectClient);\n }\n\n return () => {\n if (socketRef.current && (!enabled || !isOpenLaunchApp)) {\n socketRef.current.removeAllListeners();\n socketRef.current.disconnect();\n socketRef.current = null;\n }\n };\n }, [enabled, isOpenLaunchApp, socketUrl, secure]);\n\n useEffect(() => {\n if (isSessionExpired && socketRef.current) {\n socketRef.current.emit(\"setToken\", \"TIMEOUT_APP\");\n }\n }, [isSessionExpired]);\n\n useEffect(() => {\n return () => {\n if (socketRef.current) {\n socketRef.current.removeAllListeners();\n socketRef.current.disconnect();\n socketRef.current = null;\n }\n };\n }, []);\n\n return { attempts };\n};\n","import { useState, useCallback, useEffect } from \"react\";\n\nimport {\n useIframeCommunication,\n useIframePreload,\n useSocketConnection,\n type SocketEventData,\n} from \"../onpeId\";\n\ninterface UseOnpeIdAuthParams {\n socketUrl: string;\n secure?: boolean;\n navigate: (url: string) => void;\n onConnectionChange?: (connected: boolean) => void;\n connectionApp?: boolean;\n onPageReload?: () => void;\n onComplete?: (data: SocketEventData) => void;\n onDisconnectClient?: () => void;\n onExpiredApp?: () => void;\n onDisconnect?: () => void;\n onMaxReconnects?: () => void;\n onHomeApp?: () => void;\n onNotApp?: () => void;\n onOpenMobile?: (data: Record<string, unknown>) => void;\n isSessionExpired?: boolean;\n}\n\nexport const useOnpeIdAuth = ({\n socketUrl,\n secure = false,\n navigate,\n onConnectionChange,\n connectionApp,\n onPageReload,\n onComplete,\n onHomeApp,\n onNotApp,\n onDisconnectClient,\n isSessionExpired,\n onExpiredApp,\n onDisconnect,\n onMaxReconnects,\n onOpenMobile,\n}: UseOnpeIdAuthParams) => {\n const [isOpenLaunchApp, setIsOpenLaunchApp] = useState(false);\n const [dataOpenLaunchApp, setDataOpenLaunchApp] = useState<\n Record<string, unknown>\n >({});\n\n const openLaunchApp = useCallback(() => setIsOpenLaunchApp(true), []);\n const closeLaunchApp = useCallback(() => setIsOpenLaunchApp(false), []);\n\n const {\n modalUrl,\n setModalUrl,\n isOpenModal,\n isPreloading,\n closeModal,\n preloadIframeRef,\n iframeRef,\n handlePreloadIframeReady,\n handleModalIframeReady,\n reset: resetIframeState,\n } = useIframePreload();\n\n const handleClose = useCallback(() => {\n onConnectionChange?.(false);\n closeModal();\n closeLaunchApp();\n resetIframeState();\n }, [closeModal, closeLaunchApp, resetIframeState, onConnectionChange]);\n\n useEffect(() => {\n if (connectionApp) {\n onConnectionChange?.(false);\n onPageReload?.();\n }\n return () => {\n resetIframeState();\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps -- solo se ejecuta en el primer render\n }, []);\n\n const { attempts } = useSocketConnection({\n socketUrl,\n secure,\n isOpenLaunchApp,\n dataOpenLaunchApp,\n closeLaunchApp,\n closeModal: handleClose,\n onComplete,\n onDisconnectClient,\n onDisconnect,\n onMaxReconnects,\n onConnectionChange,\n enabled: isOpenModal && !!modalUrl,\n isSessionExpired,\n });\n\n useIframeCommunication({\n onExpiredApp: () => {\n handleClose();\n onExpiredApp?.();\n },\n onOpenApp: (data) => {\n navigate(data.url!);\n },\n onLaunchApp: (data) => {\n openLaunchApp();\n setDataOpenLaunchApp((data.data as Record<string, unknown>) ?? {});\n },\n onOpenMobile: (data) => {\n onOpenMobile?.((data.data as Record<string, unknown>) ?? {});\n },\n onHomeApp: () => {\n handleClose();\n onHomeApp?.();\n },\n onNotApp: () => {\n handleClose();\n onNotApp?.();\n },\n });\n\n return {\n modalUrl,\n setModalUrl,\n isOpenModal,\n isPreloading,\n isOpenLaunchApp,\n handleClose,\n iframeRef,\n preloadIframeRef,\n handlePreloadIframeReady,\n handleModalIframeReady,\n attempts,\n reset: resetIframeState,\n };\n};\n","import { useState } from \"react\";\n\nimport { Modal } from \"../../components/Modal\";\n\ninterface OnpeIdModalProps {\n modalUrl: string;\n isOpenModal: boolean;\n isOpenLaunchApp: boolean;\n isOnline: boolean;\n onClose: () => void;\n iframeRef: React.RefObject<HTMLIFrameElement | null>;\n preloadIframeRef: React.RefObject<HTMLIFrameElement | null>;\n handlePreloadIframeReady: () => void;\n handleModalIframeReady: () => void;\n disableFocus?: boolean;\n}\n\nexport const OnpeIdModal = ({\n modalUrl,\n isOpenModal,\n isOpenLaunchApp,\n isOnline,\n onClose,\n iframeRef,\n preloadIframeRef,\n handlePreloadIframeReady,\n handleModalIframeReady,\n disableFocus = false,\n}: OnpeIdModalProps) => {\n const [isIframeLoaded, setIsIframeLoaded] = useState(false);\n\n return (\n <>\n {modalUrl && !isOpenModal && isOnline && (\n <iframe\n ref={preloadIframeRef}\n src={modalUrl}\n className=\"hidden\"\n onLoad={handlePreloadIframeReady}\n title=\"Precarga ONPE ID\"\n />\n )}\n\n <Modal\n isOpen={isOpenModal && isOnline}\n onClose={onClose}\n className=\"bg-white max-w-custom-673 p-10 relative\"\n closeButton={!isOpenLaunchApp && isIframeLoaded}\n escapeToClose={false}\n disableFocus={disableFocus}\n >\n {!!modalUrl && isOnline && (\n <iframe\n ref={iframeRef}\n src={modalUrl}\n onLoad={() => {\n handleModalIframeReady();\n setIsIframeLoaded(true);\n }}\n className=\"w-full h-[410px] min-[400px]:h-[390px] md:h-[312px]\"\n title=\"Aplicativo ONPEID para autenticación y registro\"\n />\n )}\n </Modal>\n </>\n );\n};\n"]}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { IconSpinnerDesktop, IconSpinnerMobile, IconCheck, IconQuestion, IconInfo, IconWarningNotRecommended } from './chunk-WMTOTUKK.mjs';
|
|
2
|
-
import { Modal } from './chunk-
|
|
2
|
+
import { Modal } from './chunk-DTIU6Q2O.mjs';
|
|
3
3
|
import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
|
|
4
4
|
import { useState, useEffect } from 'react';
|
|
5
5
|
|
|
@@ -294,5 +294,5 @@ var ModalLoading = ({
|
|
|
294
294
|
};
|
|
295
295
|
|
|
296
296
|
export { Button, ModalConfirm, ModalLoading };
|
|
297
|
-
//# sourceMappingURL=chunk-
|
|
298
|
-
//# sourceMappingURL=chunk-
|
|
297
|
+
//# sourceMappingURL=chunk-UWMR6FBN.mjs.map
|
|
298
|
+
//# sourceMappingURL=chunk-UWMR6FBN.mjs.map
|