@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 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
- icon="warning"
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 **(requerido)** |
185
- | `message` | `ReactNode` | — | Mensaje descriptivo **(requerido)** |
186
- | `icon` | `'warning' \| 'success'` | `'warning'` | Icono a mostrar |
187
- | `color` | `'blue' \| 'red'` | `'blue'` | Color del icono y título |
188
- | `twoButtons` | `boolean` | `true` | Muestra dos botones (confirmar + cancelar) |
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` | — | Acción al confirmar |
192
- | `onCancel` | `() => void` | — | Acción al cancelar |
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 → Modal
499
- ModalLoading → Modal
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 → Modal
503
- ModalNfc → Modal + IconAndroid + IconApple
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 Set());
22
- var lockBodyScroll = (id, enabled) => {
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 unlockBodyScroll = (id, enabled) => {
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) lockBodyScroll(modalId, preventBodyScroll);
159
+ if (isOpen) {
160
+ const computed = computeZIndex(zIndexLevel);
161
+ setAssignedZIndex(computed);
162
+ registerModal(modalId, computed, preventBodyScroll);
163
+ }
154
164
  return () => {
155
- if (isOpen) unlockBodyScroll(modalId, preventBodyScroll);
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: zIndexLevel },
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: zIndexLevel + 10 },
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-RL3RQN4O.mjs.map
401
- //# sourceMappingURL=chunk-RL3RQN4O.mjs.map
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-RL3RQN4O.mjs';
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-XUSUDWMU.mjs.map
478
- //# sourceMappingURL=chunk-XUSUDWMU.mjs.map
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":";;;;;;AAaA,IAAM,aAAA,GAGF;AAAA,EACF,QAAA,EAAU,EAAA;AAAA,EACV,WAAA,EAAa,KAAA;AAAA,EACb,aAAA,EAAe;AACjB,CAAA;AAEO,IAAM,wBAAwB,MAAA,EAAgC;AAAA,EACnE,CAAC,GAAA,MAAS;AAAA,IACR,GAAG,aAAA;AAAA,IACH,aAAa,CAAC,GAAA,KAAgB,IAAI,EAAE,QAAA,EAAU,KAAK,CAAA;AAAA,IACnD,WAAW,MAAM,GAAA,CAAI,EAAE,WAAA,EAAa,MAAM,CAAA;AAAA,IAC1C,YAAY,MAAM;AAChB,MAAA,GAAA,CAAI;AAAA,QACF,WAAA,EAAa,KAAA;AAAA,QACb,aAAA,EAAe,KAAA;AAAA,QACf,QAAA,EAAU;AAAA,OACX,CAAA;AAAA,IACH,CAAA;AAAA,IACA,kBAAkB,CAAC,KAAA,KAAmB,IAAI,EAAE,aAAA,EAAe,OAAO,CAAA;AAAA,IAClE,KAAA,EAAO,MAAM,GAAA,CAAI,aAAa;AAAA,GAChC;AACF;ACdO,IAAM,yBAAyB,CAAC;AAAA,EACrC,YAAA;AAAA,EACA,SAAA;AAAA,EACA,WAAA;AAAA,EACA,SAAA;AAAA,EACA,QAAA;AAAA,EACA,YAAA;AAAA,EACA,OAAA,GAAU,IAAA;AAAA,EACV;AACF,CAAA,GAAkC,EAAC,KAAM;AACvC,EAAA,MAAM,cAAc,MAAA,CAAO;AAAA,IACzB,YAAA;AAAA,IACA,SAAA;AAAA,IACA,WAAA;AAAA,IACA,SAAA;AAAA,IACA,QAAA;AAAA,IACA;AAAA,GACD,CAAA;AAED,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,WAAA,CAAY,OAAA,GAAU;AAAA,MACpB,YAAA;AAAA,MACA,SAAA;AAAA,MACA,WAAA;AAAA,MACA,SAAA;AAAA,MACA,QAAA;AAAA,MACA;AAAA,KACF;AAAA,EACF,CAAA,EAAG,CAAC,YAAA,EAAc,SAAA,EAAW,aAAa,SAAA,EAAW,QAAA,EAAU,YAAY,CAAC,CAAA;AAE5E,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,IAAI,CAAC,OAAA,EAAS;AAEd,IAAA,MAAM,OAAA,GAAU,CAAC,KAAA,KAAwB;AACvC,MAAA,IAAI,aAAA,IAAiB,KAAA,CAAM,MAAA,KAAW,aAAA,EAAe;AACnD,QAAA,OAAA,CAAQ,IAAA;AAAA,UACN,CAAA,0CAAA,EAA6C,MAAM,MAAM,CAAA;AAAA,SAC3D;AACA,QAAA;AAAA,MACF;AAEA,MAAA,MAAM,OAAO,KAAA,CAAM,IAAA;AACnB,MAAA,IAAI,CAAC,MAAM,MAAA,EAAQ;AAEnB,MAAA,MAAM,WAAW,WAAA,CAAY,OAAA;AAE7B,MAAA,QAAQ,KAAK,MAAA;AAAQ,QACnB,KAAK,aAAA;AACH,UAAA,QAAA,CAAS,eAAe,IAAI,CAAA;AAC5B,UAAA;AAAA,QACF,KAAK,UAAA;AACH,UAAA,QAAA,CAAS,YAAY,IAAI,CAAA;AACzB,UAAA;AAAA,QACF,KAAK,YAAA;AACH,UAAA,QAAA,CAAS,cAAc,IAAI,CAAA;AAC3B,UAAA;AAAA,QACF,KAAK,UAAA;AACH,UAAA,QAAA,CAAS,YAAY,IAAI,CAAA;AACzB,UAAA;AAAA,QACF,KAAK,SAAA;AACH,UAAA,QAAA,CAAS,WAAW,IAAI,CAAA;AACxB,UAAA;AAAA,QACF,KAAK,aAAA;AACH,UAAA,QAAA,CAAS,eAAe,IAAI,CAAA;AAC5B,UAAA;AAEA;AACJ,IACF,CAAA;AAEA,IAAA,UAAA,CAAW,gBAAA,CAAiB,WAAW,OAAO,CAAA;AAC9C,IAAA,OAAO,MAAM,UAAA,CAAW,mBAAA,CAAoB,SAAA,EAAW,OAAO,CAAA;AAAA,EAChE,CAAA,EAAG,CAAC,OAAA,EAAS,aAAa,CAAC,CAAA;AAC7B;AAOO,IAAM,yBAAyB,CAAC;AAAA,EACrC,SAAA;AAAA,EACA;AACF,CAAA,KAAoC;AAClC,EAAA,MAAM,mBAAA,GAAsB,WAAA;AAAA,IAC1B,CAAC,OAAA,KAAqC;AACpC,MAAA,IAAI,CAAC,SAAA,CAAU,OAAA,IAAW,CAAC,QAAA,EAAU;AAErC,MAAA,IAAI;AACF,QAAA,MAAM,YAAA,GAAe,IAAI,GAAA,CAAI,QAAQ,CAAA,CAAE,MAAA;AACvC,QAAA,SAAA,CAAU,OAAA,CAAQ,aAAA,EAAe,WAAA,CAAY,OAAA,EAAS,YAAY,CAAA;AAAA,MACpE,SAAS,KAAA,EAAO;AACd,QAAA,OAAA,CAAQ,KAAA,CAAM,sCAAsC,KAAK,CAAA;AAAA,MAC3D;AAAA,IACF,CAAA;AAAA,IACA,CAAC,WAAW,QAAQ;AAAA,GACtB;AAEA,EAAA,OAAO,EAAE,mBAAA,EAAoB;AAC/B;ACtHO,IAAM,mBAAmB,MAAM;AACpC,EAAA,MAAM;AAAA,IACJ,QAAA;AAAA,IACA,WAAA;AAAA,IACA,WAAA;AAAA,IACA,UAAA;AAAA,IACA,gBAAA;AAAA,IACA,SAAA;AAAA,IACA;AAAA,MACE,qBAAA,EAAsB;AAE1B,EAAA,MAAM,gBAAA,GAAmBA,OAA0B,IAAI,CAAA;AACvD,EAAA,MAAM,SAAA,GAAYA,OAA0B,IAAI,CAAA;AAEhD,EAAA,MAAM,YAAA,GAAe,CAAC,CAAC,QAAA,IAAY,CAAC,WAAA;AAEpC,EAAA,MAAM,2BAA2B,MAAM;AACrC,IAAA,gBAAA,CAAiB,IAAI,CAAA;AACrB,IAAA,SAAA,EAAU;AAAA,EACZ,CAAA;AAEA,EAAA,MAAM,yBAAyB,MAAM;AACnC,IAAA,IAAI,CAAC,qBAAA,CAAsB,QAAA,EAAS,CAAE,aAAA,EAAe;AACnD,MAAA,gBAAA,CAAiB,IAAI,CAAA;AAAA,IACvB;AAAA,EACF,CAAA;AAEA,EAAA,OAAO;AAAA,IACL,QAAA;AAAA,IACA,WAAA;AAAA,IACA,WAAA;AAAA,IACA,UAAA;AAAA,IACA,YAAA;AAAA,IACA,gBAAA;AAAA,IACA,SAAA;AAAA,IACA,wBAAA;AAAA,IACA,sBAAA;AAAA,IACA;AAAA,GACF;AACF;ACxCA,IAAM,qBAAA,GAAwB,EAAA;AAuBvB,IAAM,sBAAsB,CAAC;AAAA,EAClC,SAAA;AAAA,EACA,MAAA,GAAS,KAAA;AAAA,EACT,eAAA;AAAA,EACA,iBAAA;AAAA,EACA,cAAA;AAAA,EACA,UAAA;AAAA,EACA,UAAA;AAAA,EACA,kBAAA;AAAA,EACA,YAAA;AAAA,EACA,eAAA;AAAA,EACA,kBAAA;AAAA,EACA,OAAA,GAAU,IAAA;AAAA,EACV,gBAAA,GAAmB;AACrB,CAAA,KAAiC;AAC/B,EAAA,MAAM,SAAA,GAAYA,OAAsB,IAAI,CAAA;AAC5C,EAAA,MAAM,CAAC,QAAA,EAAU,WAAW,CAAA,GAAI,SAAS,CAAC,CAAA;AAE1C,EAAA,MAAM,oBAAA,GAAuBA,OAAO,iBAAiB,CAAA;AACrD,EAAA,MAAM,iBAAA,GAAoBA,OAAO,cAAc,CAAA;AAC/C,EAAA,MAAM,aAAA,GAAgBA,OAAO,UAAU,CAAA;AACvC,EAAA,MAAM,UAAA,GAAaA,OAAO,OAAO,CAAA;AACjC,EAAA,MAAM,qBAAA,GAAwBA,OAAO,kBAAkB,CAAA;AACvD,EAAA,MAAM,aAAA,GAAgBA,OAAO,UAAU,CAAA;AACvC,EAAA,MAAM,qBAAA,GAAwBA,OAAO,kBAAkB,CAAA;AACvD,EAAA,MAAM,eAAA,GAAkBA,OAAO,YAAY,CAAA;AAC3C,EAAA,MAAM,kBAAA,GAAqBA,OAAO,eAAe,CAAA;AAEjD,EAAAC,UAAU,MAAM;AACd,IAAA,oBAAA,CAAqB,OAAA,GAAU,iBAAA;AAC/B,IAAA,iBAAA,CAAkB,OAAA,GAAU,cAAA;AAC5B,IAAA,aAAA,CAAc,OAAA,GAAU,UAAA;AACxB,IAAA,UAAA,CAAW,OAAA,GAAU,OAAA;AACrB,IAAA,qBAAA,CAAsB,OAAA,GAAU,kBAAA;AAChC,IAAA,aAAA,CAAc,OAAA,GAAU,UAAA;AACxB,IAAA,qBAAA,CAAsB,OAAA,GAAU,kBAAA;AAChC,IAAA,eAAA,CAAgB,OAAA,GAAU,YAAA;AAC1B,IAAA,kBAAA,CAAmB,OAAA,GAAU,eAAA;AAAA,EAC/B,CAAA,EAAG;AAAA,IACD,iBAAA;AAAA,IACA,cAAA;AAAA,IACA,UAAA;AAAA,IACA,OAAA;AAAA,IACA,kBAAA;AAAA,IACA,UAAA;AAAA,IACA,kBAAA;AAAA,IACA,YAAA;AAAA,IACA;AAAA,GACD,CAAA;AAED,EAAAA,UAAU,MAAM;AACd,IAAA,IAAI,aAAa,qBAAA,EAAuB;AACtC,MAAA,IAAI,UAAU,OAAA,EAAS;AACrB,QAAA,SAAA,CAAU,QAAQ,UAAA,EAAW;AAAA,MAC/B;AACA,MAAA,iBAAA,CAAkB,OAAA,EAAQ;AAC1B,MAAA,qBAAA,CAAsB,UAAU,KAAK,CAAA;AACrC,MAAA,aAAA,CAAc,OAAA,EAAQ;AACtB,MAAA,kBAAA,CAAmB,OAAA,IAAU;AAC7B,MAAA,UAAA,CAAW,MAAM,WAAA,CAAY,CAAC,CAAA,EAAG,CAAC,CAAA;AAAA,IACpC;AAAA,EACF,CAAA,EAAG,CAAC,QAAQ,CAAC,CAAA;AAEb,EAAAA,UAAU,MAAM;AACd,IAAA,IAAI,CAAC,OAAA,EAAS;AACZ,MAAA,IAAI,UAAU,OAAA,EAAS;AACrB,QAAA,SAAA,CAAU,QAAQ,kBAAA,EAAmB;AACrC,QAAA,SAAA,CAAU,QAAQ,UAAA,EAAW;AAC7B,QAAA,SAAA,CAAU,OAAA,GAAU,IAAA;AACpB,QAAA,qBAAA,CAAsB,UAAU,KAAK,CAAA;AACrC,QAAA,UAAA,CAAW,MAAM,WAAA,CAAY,CAAC,CAAA,EAAG,CAAC,CAAA;AAAA,MACpC;AACA,MAAA;AAAA,IACF;AAEA,IAAA,IAAI,CAAC,eAAA,EAAiB;AACpB,MAAA,IAAI,UAAU,OAAA,EAAS;AACrB,QAAA,SAAA,CAAU,QAAQ,kBAAA,EAAmB;AACrC,QAAA,SAAA,CAAU,QAAQ,UAAA,EAAW;AAC7B,QAAA,SAAA,CAAU,OAAA,GAAU,IAAA;AAAA,MACtB;AACA,MAAA;AAAA,IACF;AAEA,IAAA,IAAI,CAAC,UAAU,OAAA,EAAS;AACtB,MAAA,SAAA,CAAU,OAAA,GAAU,GAAG,SAAA,EAAW;AAAA,QAChC,UAAA,EAAY,CAAC,WAAW,CAAA;AAAA,QACxB,MAAA;AAAA,QACA,OAAA,EAAS,KAAA;AAAA,QACT,QAAA,EAAU,IAAA;AAAA,QACV,YAAA,EAAc,IAAA;AAAA,QACd,oBAAA,EAAsB,qBAAA;AAAA,QACtB,iBAAA,EAAmB,GAAA;AAAA,QACnB,oBAAA,EAAsB;AAAA,OACvB,CAAA;AAED,MAAA,MAAM,SAAS,SAAA,CAAU,OAAA;AAEzB,MAAA,MAAM,gBAAgB,MAAM;AAC1B,QAAA,IAAI,CAAC,WAAW,OAAA,EAAS;AAEzB,QAAA,qBAAA,CAAsB,UAAU,IAAI,CAAA;AACpC,QAAA,IAAI,UAAU,OAAA,EAAS;AACrB,UAAA,MAAM,aAAa,oBAAA,CAAqB,OAAA;AAExC,UAAA,IAAI,cAAc,MAAA,CAAO,IAAA,CAAK,UAAU,CAAA,CAAE,SAAS,CAAA,EAAG;AACpD,YAAA,SAAA,CAAU,OAAA,CAAQ,IAAA,CAAK,UAAA,EAAY,UAAU,CAAA;AAAA,UAC/C,CAAA,MAAO;AACL,YAAA,UAAA,CAAW,MAAM;AACf,cAAA,MAAM,cAAc,oBAAA,CAAqB,OAAA;AACzC,cAAA,IACE,WAAA,IACA,MAAA,CAAO,IAAA,CAAK,WAAW,CAAA,CAAE,SAAS,CAAA,IAClC,SAAA,CAAU,OAAA,IACV,UAAA,CAAW,OAAA,EACX;AACA,gBAAA,SAAA,CAAU,OAAA,CAAQ,IAAA,CAAK,UAAA,EAAY,WAAW,CAAA;AAAA,cAChD;AAAA,YACF,GAAG,GAAG,CAAA;AAAA,UACR;AAAA,QACF,CAAA,MAAO;AACL,UAAA,OAAA,CAAQ,MAAM,gDAA6C,CAAA;AAAA,QAC7D;AAAA,MACF,CAAA;AAEA,MAAA,MAAM,mBAAmB,MAAM;AAC7B,QAAA,IAAI,CAAC,WAAW,OAAA,EAAS;AAEzB,QAAA,qBAAA,CAAsB,UAAU,KAAK,CAAA;AACrC,QAAA,iBAAA,CAAkB,OAAA,EAAQ;AAC1B,QAAA,aAAA,CAAc,OAAA,EAAQ;AACtB,QAAA,eAAA,CAAgB,OAAA,IAAU;AAAA,MAC5B,CAAA;AAEA,MAAA,MAAM,sBAAA,GAAyB,CAAC,aAAA,KAA0B;AACxD,QAAA,WAAA,CAAY,aAAa,CAAA;AAAA,MAC3B,CAAA;AAEA,MAAA,MAAM,kBAAA,GAAqB,CAAC,KAAA,KAAiB;AAC3C,QAAA,OAAA,CAAQ,KAAA,CAAM,gCAA6B,KAAK,CAAA;AAAA,MAClD,CAAA;AAEA,MAAA,MAAM,cAAA,GAAiB,CAAC,IAAA,KAA0B;AAChD,QAAA,IAAI,CAAC,WAAW,OAAA,EAAS;AACzB,QAAA,iBAAA,CAAkB,OAAA,EAAQ;AAC1B,QAAA,qBAAA,CAAsB,UAAU,KAAK,CAAA;AACrC,QAAA,aAAA,CAAc,OAAA,EAAQ;AACtB,QAAA,aAAA,CAAc,UAAU,IAAI,CAAA;AAAA,MAC9B,CAAA;AAEA,MAAA,MAAM,sBAAsB,MAAM;AAChC,QAAA,IAAI,CAAC,WAAW,OAAA,EAAS;AACzB,QAAA,iBAAA,CAAkB,OAAA,EAAQ;AAC1B,QAAA,qBAAA,CAAsB,UAAU,KAAK,CAAA;AACrC,QAAA,aAAA,CAAc,OAAA,EAAQ;AAAA,MACxB,CAAA;AAEA,MAAA,MAAM,yBAAyB,MAAM;AACnC,QAAA,IAAI,CAAC,WAAW,OAAA,EAAS;AACzB,QAAA,iBAAA,CAAkB,OAAA,EAAQ;AAC1B,QAAA,qBAAA,CAAsB,UAAU,KAAK,CAAA;AACrC,QAAA,aAAA,CAAc,OAAA,EAAQ;AACtB,QAAA,qBAAA,CAAsB,OAAA,IAAU;AAAA,MAClC,CAAA;AAEA,MAAA,MAAA,CAAO,EAAA,CAAG,WAAW,aAAa,CAAA;AAClC,MAAA,MAAA,CAAO,EAAA,CAAG,cAAc,gBAAgB,CAAA;AACxC,MAAA,MAAA,CAAO,EAAA,CAAG,iBAAiB,kBAAkB,CAAA;AAC7C,MAAA,MAAA,CAAO,EAAA,CAAG,EAAA,CAAG,mBAAA,EAAqB,sBAAsB,CAAA;AACxD,MAAA,MAAA,CAAO,EAAA,CAAG,qBAAqB,cAAc,CAAA;AAC7C,MAAA,MAAA,CAAO,EAAA,CAAG,wBAAwB,cAAc,CAAA;AAChD,MAAA,MAAA,CAAO,EAAA,CAAG,0BAA0B,cAAc,CAAA;AAClD,MAAA,MAAA,CAAO,EAAA,CAAG,mBAAmB,mBAAmB,CAAA;AAChD,MAAA,MAAA,CAAO,EAAA,CAAG,sBAAsB,sBAAsB,CAAA;AAAA,IACxD;AAEA,IAAA,OAAO,MAAM;AACX,MAAA,IAAI,SAAA,CAAU,OAAA,KAAY,CAAC,OAAA,IAAW,CAAC,eAAA,CAAA,EAAkB;AACvD,QAAA,SAAA,CAAU,QAAQ,kBAAA,EAAmB;AACrC,QAAA,SAAA,CAAU,QAAQ,UAAA,EAAW;AAC7B,QAAA,SAAA,CAAU,OAAA,GAAU,IAAA;AAAA,MACtB;AAAA,IACF,CAAA;AAAA,EACF,GAAG,CAAC,OAAA,EAAS,eAAA,EAAiB,SAAA,EAAW,MAAM,CAAC,CAAA;AAEhD,EAAAA,UAAU,MAAM;AACd,IAAA,IAAI,gBAAA,IAAoB,UAAU,OAAA,EAAS;AACzC,MAAA,SAAA,CAAU,OAAA,CAAQ,IAAA,CAAK,UAAA,EAAY,aAAa,CAAA;AAAA,IAClD;AAAA,EACF,CAAA,EAAG,CAAC,gBAAgB,CAAC,CAAA;AAErB,EAAAA,UAAU,MAAM;AACd,IAAA,OAAO,MAAM;AACX,MAAA,IAAI,UAAU,OAAA,EAAS;AACrB,QAAA,SAAA,CAAU,QAAQ,kBAAA,EAAmB;AACrC,QAAA,SAAA,CAAU,QAAQ,UAAA,EAAW;AAC7B,QAAA,SAAA,CAAU,OAAA,GAAU,IAAA;AAAA,MACtB;AAAA,IACF,CAAA;AAAA,EACF,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,OAAO,EAAE,QAAA,EAAS;AACpB;ACzMO,IAAM,gBAAgB,CAAC;AAAA,EAC5B,SAAA;AAAA,EACA,MAAA,GAAS,KAAA;AAAA,EACT,QAAA;AAAA,EACA,kBAAA;AAAA,EACA,aAAA;AAAA,EACA,YAAA;AAAA,EACA,UAAA;AAAA,EACA,SAAA;AAAA,EACA,QAAA;AAAA,EACA,kBAAA;AAAA,EACA,gBAAA;AAAA,EACA,YAAA;AAAA,EACA,YAAA;AAAA,EACA,eAAA;AAAA,EACA;AACF,CAAA,KAA2B;AACzB,EAAA,MAAM,CAAC,eAAA,EAAiB,kBAAkB,CAAA,GAAIC,SAAS,KAAK,CAAA;AAC5D,EAAA,MAAM,CAAC,iBAAA,EAAmB,oBAAoB,CAAA,GAAIA,QAAAA,CAEhD,EAAE,CAAA;AAEJ,EAAA,MAAM,gBAAgBC,WAAAA,CAAY,MAAM,mBAAmB,IAAI,CAAA,EAAG,EAAE,CAAA;AACpE,EAAA,MAAM,iBAAiBA,WAAAA,CAAY,MAAM,mBAAmB,KAAK,CAAA,EAAG,EAAE,CAAA;AAEtE,EAAA,MAAM;AAAA,IACJ,QAAA;AAAA,IACA,WAAA;AAAA,IACA,WAAA;AAAA,IACA,YAAA;AAAA,IACA,UAAA;AAAA,IACA,gBAAA;AAAA,IACA,SAAA;AAAA,IACA,wBAAA;AAAA,IACA,sBAAA;AAAA,IACA,KAAA,EAAO;AAAA,MACL,gBAAA,EAAiB;AAErB,EAAA,MAAM,WAAA,GAAcA,YAAY,MAAM;AACpC,IAAA,kBAAA,GAAqB,KAAK,CAAA;AAC1B,IAAA,UAAA,EAAW;AACX,IAAA,cAAA,EAAe;AACf,IAAA,gBAAA,EAAiB;AAAA,EACnB,GAAG,CAAC,UAAA,EAAY,cAAA,EAAgB,gBAAA,EAAkB,kBAAkB,CAAC,CAAA;AAErE,EAAAF,UAAU,MAAM;AACd,IAAA,IAAI,aAAA,EAAe;AACjB,MAAA,kBAAA,GAAqB,KAAK,CAAA;AAC1B,MAAA,YAAA,IAAe;AAAA,IACjB;AACA,IAAA,OAAO,MAAM;AACX,MAAA,gBAAA,EAAiB;AAAA,IACnB,CAAA;AAAA,EAEF,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,EAAE,QAAA,EAAS,GAAI,mBAAA,CAAoB;AAAA,IACvC,SAAA;AAAA,IACA,MAAA;AAAA,IACA,eAAA;AAAA,IACA,iBAAA;AAAA,IACA,cAAA;AAAA,IACA,UAAA,EAAY,WAAA;AAAA,IACZ,UAAA;AAAA,IACA,kBAAA;AAAA,IACA,YAAA;AAAA,IACA,eAAA;AAAA,IACA,kBAAA;AAAA,IACA,OAAA,EAAS,WAAA,IAAe,CAAC,CAAC,QAAA;AAAA,IAC1B;AAAA,GACD,CAAA;AAED,EAAA,sBAAA,CAAuB;AAAA,IACrB,cAAc,MAAM;AAClB,MAAA,WAAA,EAAY;AACZ,MAAA,YAAA,IAAe;AAAA,IACjB,CAAA;AAAA,IACA,SAAA,EAAW,CAAC,IAAA,KAAS;AACnB,MAAA,QAAA,CAAS,KAAK,GAAI,CAAA;AAAA,IACpB,CAAA;AAAA,IACA,WAAA,EAAa,CAAC,IAAA,KAAS;AACrB,MAAA,aAAA,EAAc;AACd,MAAA,oBAAA,CAAsB,IAAA,CAAK,IAAA,IAAoC,EAAE,CAAA;AAAA,IACnE,CAAA;AAAA,IACA,YAAA,EAAc,CAAC,IAAA,KAAS;AACtB,MAAA,YAAA,GAAgB,IAAA,CAAK,IAAA,IAAoC,EAAE,CAAA;AAAA,IAC7D,CAAA;AAAA,IACA,WAAW,MAAM;AACf,MAAA,WAAA,EAAY;AACZ,MAAA,SAAA,IAAY;AAAA,IACd,CAAA;AAAA,IACA,UAAU,MAAM;AACd,MAAA,WAAA,EAAY;AACZ,MAAA,QAAA,IAAW;AAAA,IACb;AAAA,GACD,CAAA;AAED,EAAA,OAAO;AAAA,IACL,QAAA;AAAA,IACA,WAAA;AAAA,IACA,WAAA;AAAA,IACA,YAAA;AAAA,IACA,eAAA;AAAA,IACA,WAAA;AAAA,IACA,SAAA;AAAA,IACA,gBAAA;AAAA,IACA,wBAAA;AAAA,IACA,sBAAA;AAAA,IACA,QAAA;AAAA,IACA,KAAA,EAAO;AAAA,GACT;AACF;ACzHO,IAAM,cAAc,CAAC;AAAA,EAC1B,QAAA;AAAA,EACA,WAAA;AAAA,EACA,eAAA;AAAA,EACA,QAAA;AAAA,EACA,OAAA;AAAA,EACA,SAAA;AAAA,EACA,gBAAA;AAAA,EACA,wBAAA;AAAA,EACA,sBAAA;AAAA,EACA,YAAA,GAAe;AACjB,CAAA,KAAwB;AACtB,EAAA,MAAM,CAAC,cAAA,EAAgB,iBAAiB,CAAA,GAAIC,SAAS,KAAK,CAAA;AAE1D,EAAA,uBACE,IAAA,CAAA,QAAA,EAAA,EACG,QAAA,EAAA;AAAA,IAAA,QAAA,IAAY,CAAC,eAAe,QAAA,oBAC3B,GAAA;AAAA,MAAC,QAAA;AAAA,MAAA;AAAA,QACC,GAAA,EAAK,gBAAA;AAAA,QACL,GAAA,EAAK,QAAA;AAAA,QACL,SAAA,EAAU,QAAA;AAAA,QACV,MAAA,EAAQ,wBAAA;AAAA,QACR,KAAA,EAAM;AAAA;AAAA,KACR;AAAA,oBAGF,GAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,QAAQ,WAAA,IAAe,QAAA;AAAA,QACvB,OAAA;AAAA,QACA,SAAA,EAAU,yCAAA;AAAA,QACV,WAAA,EAAa,CAAC,eAAA,IAAmB,cAAA;AAAA,QACjC,aAAA,EAAe,KAAA;AAAA,QACf,YAAA;AAAA,QAEC,QAAA,EAAA,CAAC,CAAC,QAAA,IAAY,QAAA,oBACb,GAAA;AAAA,UAAC,QAAA;AAAA,UAAA;AAAA,YACC,GAAA,EAAK,SAAA;AAAA,YACL,GAAA,EAAK,QAAA;AAAA,YACL,QAAQ,MAAM;AACZ,cAAA,sBAAA,EAAuB;AACvB,cAAA,iBAAA,CAAkB,IAAI,CAAA;AAAA,YACxB,CAAA;AAAA,YACA,SAAA,EAAU,qDAAA;AAAA,YACV,KAAA,EAAM;AAAA;AAAA;AACR;AAAA;AAEJ,GAAA,EACF,CAAA;AAEJ","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-RL3RQN4O.mjs';
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-RFIMDKOY.mjs.map
298
- //# sourceMappingURL=chunk-RFIMDKOY.mjs.map
297
+ //# sourceMappingURL=chunk-UWMR6FBN.mjs.map
298
+ //# sourceMappingURL=chunk-UWMR6FBN.mjs.map