{"version":3,"file":"src_App_tsx.chunk.bundle","sources":["/Users/claudiobaiardi/Documents/GitHub/aldyl/dataoil-app/apps/data-oil-app/otherReports/src/App.tsx","/Users/claudiobaiardi/Documents/GitHub/aldyl/dataoil-app/node_modules/.pnpm/@swc+helpers@0.5.21/node_modules/@swc/helpers/cjs/_async_to_generator.cjs","/Users/claudiobaiardi/Documents/GitHub/aldyl/dataoil-app/node_modules/.pnpm/@swc+helpers@0.5.21/node_modules/@swc/helpers/cjs/_interop_require_default.cjs","/Users/claudiobaiardi/Documents/GitHub/aldyl/dataoil-app/packages/mfe-runtime/src/index.ts","/Users/claudiobaiardi/Documents/GitHub/aldyl/dataoil-app/packages/mfe-runtime/src/mfeCacheBust.ts"],"sourcesContent":["import React, { useEffect, useMemo, useState } from 'react';\nimport {\n  View,\n  Text,\n  StyleSheet,\n  TouchableOpacity,\n  ScrollView,\n  ActivityIndicator,\n} from 'react-native';\nimport {\n  ClipboardDocumentListIcon,\n  ChartBarIcon,\n  ChatBubbleLeftRightIcon,\n  ChevronRightIcon,\n} from 'react-native-heroicons/outline';\nimport { useNavigation } from '@react-navigation/native';\nimport { configService } from '@data-oil-front/core-host';\nimport { runMfeCacheBustIfNeeded } from '@data-oil-front/mfe-runtime';\nimport { useClientConfig } from './hooks/useClientConfig';\n\ntype LinkItem = {\n  key: string;\n  label: string;\n  icon: React.ComponentType<any>;\n  group: 'fiscalizacion' | 'otros';\n  description: string;\n};\n\nfunction App() {\n  const navigation = useNavigation();\n  const [loadingStates, setLoadingStates] = useState<{\n    [key: string]: boolean;\n  }>({});\n  const { config: clientConfig, primaryColor } = useClientConfig();\n\n  useEffect(() => {\n    runMfeCacheBustIfNeeded().catch(() => undefined);\n  }, []);\n\n  useEffect(() => {\n    configService.getEffectiveConfig().catch(() => {\n    });\n  }, []);\n\n  const links = useMemo<LinkItem[]>(() => {\n    const clientName = clientConfig.clientName;\n    const base: LinkItem[] = [\n      {\n        key: 'OwnInspectionFormScreen',\n        label: 'FISCALIZACIÓN PROPIA',\n        icon: ClipboardDocumentListIcon,\n        group: 'fiscalizacion',\n        description: 'Reporte de fiscalización propia de la empresa',\n      },\n      {\n        key: 'ThirdPartyAuditFormScreen',\n        label: 'FISCALIZACIÓN DE TERCEROS',\n        icon: ClipboardDocumentListIcon,\n        group: 'fiscalizacion',\n        description: 'Reporte de fiscalización de empresas de terceros',\n      },\n      {\n        key: 'MarketReferencePriceFormScreen',\n        label: 'VALOR DEL MERCADO',\n        icon: ChartBarIcon,\n        group: 'otros',\n        description: 'Envía actualizaciones de valor del mercado',\n      },\n      {\n        key: 'CommentsFormScreen',\n        label: 'COMENTARIOS',\n        icon: ChatBubbleLeftRightIcon,\n        group: 'otros',\n        description: 'Envía tus comentarios y sugerencias',\n      },\n    ];\n\n    const aldylExtras: LinkItem[] = [\n      {\n        key: 'LiftingCostFormScreen',\n        label: 'LIFTING COST',\n        icon: ClipboardDocumentListIcon,\n        group: 'otros',\n        description: 'Costos netos y brutos de barriles',\n      },\n      {\n        key: 'ShipToShipFormScreen',\n        label: 'SHIP TO SHIP',\n        icon: ClipboardDocumentListIcon,\n        group: 'otros',\n        description: 'Recoger información Ship To Ship',\n      },\n      {\n        key: 'BilledRecoveryAndExpensesFormScreen',\n        label: 'FACTURADO, RECOBRO Y GASTOS PDVSA',\n        icon: ClipboardDocumentListIcon,\n        group: 'otros',\n        description:\n          'Recoger información necesaria de lo facturado, recobro y gastos de PDVSA',\n      },\n    ];\n\n    return clientName === 'aldyl' ? [...base, ...aldylExtras] : base;\n  }, [clientConfig]);\n\n  const sortedLinks = useMemo<LinkItem[]>(() => {\n    const othersPriority: Record<string, number> = {\n      LiftingCostFormScreen: 1,\n      ShipToShipFormScreen: 2,\n      BilledRecoveryAndExpensesFormScreen: 3,\n      MarketReferencePriceFormScreen: 4,\n      CommentsFormScreen: 5,\n    };\n\n    return [...links].sort((a, b) => {\n      if (a.group !== b.group) {\n        return a.group === 'fiscalizacion' ? -1 : 1;\n      }\n\n      if (a.group === 'otros' && b.group === 'otros') {\n        const aPriority = othersPriority[a.key] ?? Number.MAX_SAFE_INTEGER;\n        const bPriority = othersPriority[b.key] ?? Number.MAX_SAFE_INTEGER;\n        if (aPriority !== bPriority) return aPriority - bPriority;\n      }\n\n      return 0;\n    });\n  }, [links]);\n\n  const handleLinkPress = async (label: string, navigateTo: string) => {\n    setLoadingStates(prev => ({ ...prev, [label]: true }));\n    try {\n      navigation.navigate(navigateTo as never);\n    } finally {\n      setTimeout(() => {\n        setLoadingStates(prev => ({ ...prev, [label]: false }));\n      }, 400);\n    }\n  };\n\n  const renderRow = (item: LinkItem) => {\n    const Icon = item.icon;\n    const isLoading = !!loadingStates[item.label];\n    return (\n      <TouchableOpacity\n        key={item.label}\n        onPress={() => handleLinkPress(item.label, item.key)}\n        disabled={isLoading}\n        activeOpacity={0.8}\n        style={styles.row}\n      >\n        <View style={[styles.iconBox, { backgroundColor: primaryColor || undefined }]}>\n          {isLoading ? (\n            <ActivityIndicator color=\"#fff\" />\n          ) : (\n            <Icon size={28} color=\"#fff\" />\n          )}\n        </View>\n        <View style={styles.rowContent}>\n          <Text style={styles.rowTitle}>{item.label}</Text>\n          <Text style={styles.rowSubtitle}>{item.description}</Text>\n        </View>\n        {!isLoading && <ChevronRightIcon size={24} color={primaryColor || undefined} />}\n      </TouchableOpacity>\n    );\n  };\n\n  return (\n    <>\n      <View style={styles.container}>\n        <ScrollView\n          style={styles.scroll}\n          contentContainerStyle={styles.content}\n          showsVerticalScrollIndicator={false}\n        >\n          <Text style={styles.title}>Otros reportes</Text>\n          {sortedLinks.map(renderRow)}\n        </ScrollView>\n      </View>\n    </>\n  );\n}\n\nconst styles = StyleSheet.create({\n  container: {\n    flex: 1,\n    backgroundColor: '#f9fafb',\n  },\n  scroll: {\n    flex: 1,\n    width: '100%',\n  },\n  content: {\n    padding: 16,\n    gap: 12,\n  },\n  title: {\n    fontSize: 18,\n    fontWeight: 'bold',\n    color: '#000',\n    marginBottom: 8,\n  },\n  row: {\n    flexDirection: 'row',\n    alignItems: 'center',\n    backgroundColor: '#fff',\n    borderRadius: 16,\n    borderWidth: 1,\n    borderColor: '#E5E7EB',\n    padding: 12,\n    shadowColor: '#000',\n    shadowOpacity: 0.06,\n    shadowRadius: 10,\n    shadowOffset: { width: 0, height: 4 },\n    elevation: 2,\n  },\n  iconBox: {\n    width: 56,\n    height: 56,\n    borderRadius: 12,\n    alignItems: 'center',\n    justifyContent: 'center',\n    marginRight: 12,\n  },\n  rowContent: {\n    flex: 1,\n  },\n  rowTitle: {\n    fontSize: 16,\n    fontWeight: '600',\n    color: '#111827',\n  },\n  rowSubtitle: {\n    fontSize: 14,\n    color: '#6B7280',\n    marginTop: 4,\n  },\n});\n\nexport default App;\n","\"use strict\";\nfunction asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) {\n    try {\n        var info = gen[key](arg);\n        var value = info.value;\n    } catch (error) {\n        reject(error);\n        return;\n    }\n    if (info.done) resolve(value);\n    else Promise.resolve(value).then(_next, _throw);\n}\nfunction _async_to_generator(fn) {\n    return function() {\n        var self = this, args = arguments;\n        return new Promise(function(resolve, reject) {\n            var gen = fn.apply(self, args);\n            function _next(value) {\n                asyncGeneratorStep(gen, resolve, reject, _next, _throw, \"next\", value);\n            }\n            function _throw(err) {\n                asyncGeneratorStep(gen, resolve, reject, _next, _throw, \"throw\", err);\n            }\n            _next(undefined);\n        });\n    };\n}\nexports._ = _async_to_generator;\n","\"use strict\";\nfunction _interop_require_default(obj) {\n    return obj && obj.__esModule ? obj : {\n        default: obj\n    };\n}\nexports._ = _interop_require_default;\n","// @data-oil-front/mfe-runtime — public barrel.\n// IMPORTANTE: este paquete NO se importa desde el host ni desde core-host.\n// Es MFE-only: lo importa cada App de MFE para correr el one-shot de\n// cache-bust en cada rol. Ver src/__tests__/architecture.test.ts.\n\nexport {\n  runMfeCacheBustIfNeeded,\n  MFE_CACHE_BUST_VERSION,\n} from \"./mfeCacheBust\";\n","import { NativeModules, DevSettings } from 'react-native';\nimport NetInfo from '@react-native-community/netinfo';\nimport { storageService, authService } from '@data-oil-front/core-host';\n\n/**\n * Versión del cache-bust de bundles MFE. Bumpear este valor fuerza, UNA sola\n * vez por device, un purgado de la cache de bundles de Re.Pack (ScriptManager)\n * + del manifest cacheado del navigationWarmupShell, seguido de un restart.\n *\n * PARA QUÉ: rescatar devices \"pegados\" en una versión vieja del\n * navigationWarmupShell cuyo mecanismo de actualización detecta el hash nuevo\n * pero no baja los chunks. Vive en este paquete MFE-only (`mfe-runtime`) y se\n * dispara desde el entry de CADA MFE, así TODOS los roles se rescatan (antes\n * vivía sólo en labReports/LabStatusWidget, gateado por RBAC, dejando a los\n * roles sin labReports pegados para siempre).\n *\n * ADEMÁS purga la sesión (logout) para forzar re-login: el único modo de\n * refrescar el `user` cacheado con roles/tags VIEJOS que dejan a `useCan`\n * fail-closed (no hay endpoint de refresh de user sin re-login). Por eso TODO\n * el force-refresh se gatea en conectividad: NUNCA purgar sesión/bundles\n * offline (dejaría al usuario atascado en login sin red, sin acceso a su\n * trabajo encolado en `core-shared:offline_mutations`).\n *\n * DATA-SAFE respecto de la cola offline: NO toca `core-shared:offline_mutations`.\n */\nexport const MFE_CACHE_BUST_VERSION = '2026-05-29-v5';\n\n// Flag de \"ya aplicado\". Vive en un namespace que NO purgamos → sobrevive al\n// bust y evita el loop infinito.\n//\n// CONTINUIDAD HISTÓRICA: el namespace se mantiene como 'labReports' (y la key\n// como 'mfeCacheBustVersion') A PROPÓSITO. Esta lógica nació en labReports y\n// muchos devices YA aplicaron el one-shot y persistieron el flag bajo ese\n// namespace. Cambiar el nombre acá haría que esos devices NO encuentren el\n// flag previo y RE-EJECUTEN el bust (purga + logout + restart) sin necesidad.\n// El nombre describe el origen, no el alcance: hoy lo corren todos los MFEs.\nconst BUST_NAMESPACE = 'labReports';\nconst BUST_VERSION_KEY = 'mfeCacheBustVersion';\n\n// Claim persistido de \"bust en curso ESTA sesión\". A diferencia del flag\n// in-memory `busting`, este cruza bundles: la copia de `reports` y la de\n// `labReports` son instancias de módulo SEPARADAS (no comparten el `busting`),\n// así que sin este claim dos MFEs que montan a la vez podrían disparar el\n// bust en paralelo. TTL corto: un claim abandonado (app matada a mitad de\n// camino antes del restart) se auto-sana y permite reintentar.\n//\n// LÍMITE CONOCIDO: el read-check-then-write sobre AsyncStorage NO es atómico, así\n// que queda una ventana TOCTOU si dos MFEs montan en el mismo tick antes de que\n// el claim se escriba. El claim ELIMINA el caso cross-cold-start (el importante) y\n// reduce el concurrente, pero no lo cierra del todo (AsyncStorage no ofrece CAS).\n// Es benigno: todas las ops son idempotentes (removeByPrefix/remove sobre keys ya\n// borradas = no-op, logout doble = no-op, flag de versión idempotente) y el primer\n// restart descarta el contexto del segundo. Peor caso: un restart redundante.\nconst BUST_IN_PROGRESS_KEY = 'mfeCacheBustInProgress';\nconst BUST_IN_PROGRESS_TTL_MINUTES = 5;\n\n// Cache de bundles de Re.Pack: un único blob monolítico bajo namespace 'host'\n// (key real: `Repack.ScriptManager.Cache.v4.<release|debug>`). Usamos prefijo\n// agnóstico de versión/entorno para cubrir ambos builds.\nconst SCRIPT_MANAGER_CACHE_PREFIX = 'Repack.ScriptManager.Cache';\n\n// Hash del manifest del navigationWarmupShell (ver navigationManifest.ts).\nconst NAV_SHELL_MANIFEST_NAMESPACE = 'host';\nconst NAV_SHELL_MANIFEST_KEY = 'navigationWarmupShellManifest';\n\n// Evita el doble disparo dentro de la misma sesión Y del mismo bundle, antes de\n// que ocurra el restart (el widget puede remontar mientras tanto). NO cruza\n// bundles → para eso está el claim persistido `mfeCacheBustInProgress`.\nlet busting = false;\n\nasync function restart(reason: string): Promise<void> {\n  if (__DEV__) {\n    try {\n      DevSettings.reload(reason);\n    } catch (error) {\n      console.warn('[mfeCacheBust] DevSettings.reload falló:', error);\n    }\n    return;\n  }\n\n  // En release no podemos importar `react-native-restart` (no es dep de\n  // labReports), pero el módulo nativo HardRestartModule es process-global y\n  // sí es alcanzable desde cualquier MFE.\n  const mod = (NativeModules as any)?.HardRestartModule as\n    | { restart: (reason: string | null) => Promise<boolean> }\n    | undefined;\n\n  if (mod && typeof mod.restart === 'function') {\n    try {\n      await mod.restart(reason);\n      return;\n    } catch (error) {\n      console.warn('[mfeCacheBust] HardRestartModule.restart falló:', error);\n    }\n  } else {\n    // error (no warn): si el módulo nativo falta, ya purgamos bundles + sesión\n    // pero NO reiniciamos → el usuario queda deslogueado sin restart hasta cerrar\n    // y reabrir a mano. Tiene que verse en el monitoring de producción.\n    console.error(\n      '[mfeCacheBust] HardRestartModule no disponible — el reinicio debe hacerse manualmente.',\n    );\n  }\n}\n\n/**\n * Purga la cache de bundles MFE + la sesión y reinicia, una sola vez por bump\n * de `MFE_CACHE_BUST_VERSION`. Idempotente: si la versión ya fue aplicada en\n * este device, no hace nada.\n *\n * GATE OBLIGATORIO de conectividad (vía `NetInfo.fetch()`, fuente canónica): si\n * está offline no se purga NADA (no dejar al usuario sin bundles ni sin sesión\n * sin red). Se chequea acá adentro —y NO con un `isConnected` de React que\n * llega laggy/false al montar— para no postergar el force-refresh por error.\n */\nexport async function runMfeCacheBustIfNeeded(): Promise<void> {\n  if (busting) return;\n\n  // GATE de conectividad con la fuente canónica (estado real, no el de React).\n  // El bust descarga bundles frescos y el logout exige poder re-loguear → red.\n  try {\n    const net = await NetInfo.fetch();\n    if (!net.isConnected) {\n      console.log('[mfeCacheBust] Offline (NetInfo): se pospone el force-refresh.');\n      return;\n    }\n  } catch (error) {\n    // Si NetInfo falla, por seguridad NO purgamos (evita lockout offline).\n    console.warn('[mfeCacheBust] NetInfo falló; se pospone el force-refresh.', error);\n    return;\n  }\n\n  try {\n    const applied = await storageService.get<string>(\n      BUST_NAMESPACE,\n      BUST_VERSION_KEY,\n      true, // ignoreExpiration: el flag no debe caducar\n    );\n\n    if (applied === MFE_CACHE_BUST_VERSION) return;\n\n    // CLAIM cross-bundle: si otro MFE (otro bundle, otra instancia de módulo)\n    // ya tomó el bust esta sesión, no lo dispares de nuevo. El claim tiene TTL\n    // corto, así que un claim abandonado (app matada antes del restart) se\n    // auto-sana y el próximo arranque puede reintentar.\n    const inProgress = await storageService.get<string>(\n      BUST_NAMESPACE,\n      BUST_IN_PROGRESS_KEY,\n    );\n\n    if (inProgress === MFE_CACHE_BUST_VERSION) {\n      console.log(\n        '[mfeCacheBust] Bust ya en curso esta sesión (otro MFE): se omite.',\n      );\n      return;\n    }\n\n    busting = true;\n\n    // Tomar el claim ANTES de purgar nada. Vive en namespace 'labReports' →\n    // sobrevive al purge de 'host'/'auth'. TTL corto para que se auto-sane.\n    await storageService.set(\n      BUST_NAMESPACE,\n      BUST_IN_PROGRESS_KEY,\n      MFE_CACHE_BUST_VERSION,\n      BUST_IN_PROGRESS_TTL_MINUTES,\n    );\n\n    console.log(\n      `[mfeCacheBust] Force-refresh (versión ${MFE_CACHE_BUST_VERSION})...`,\n    );\n\n    // 1. Nuke del blob de ScriptManager → todos los MFEs re-descargan su bundle\n    //    en el próximo cold start (incluido el navigationWarmupShell fresco).\n    await storageService.removeByPrefix('host', SCRIPT_MANAGER_CACHE_PREFIX);\n\n    // 2. Forzar el re-fetch del manifest del navigationWarmupShell.\n    await storageService.remove(\n      NAV_SHELL_MANIFEST_NAMESPACE,\n      NAV_SHELL_MANIFEST_KEY,\n    );\n\n    // 3. Purgar la sesión → fuerza re-login → trae un `user` fresco con los\n    //    roles/tags correctos para `useCan` (no hay refresh de user sin\n    //    re-login). NO toca la cola offline (`core-shared:offline_mutations`).\n    await authService.logout();\n\n    // 4. Marcar la versión como aplicada ANTES del restart para no loopear.\n    //    Vive en namespace 'labReports' → sobrevive al purge de 'host'/'auth'.\n    await storageService.set(\n      BUST_NAMESPACE,\n      BUST_VERSION_KEY,\n      MFE_CACHE_BUST_VERSION,\n      100 * 365 * 24 * 60, // ~100 años: en la práctica no expira\n    );\n\n    console.log('[mfeCacheBust] Force-refresh listo. Reiniciando la app...');\n    await restart(`mfe-cache-bust:${MFE_CACHE_BUST_VERSION}`);\n  } catch (error) {\n    busting = false;\n    // Soltar el claim para que un próximo intento (mismo o distinto MFE) pueda\n    // reintentar; igual el TTL corto lo soltaría solo.\n    try {\n      await storageService.remove(BUST_NAMESPACE, BUST_IN_PROGRESS_KEY);\n    } catch (cleanupError) {\n      console.warn(\n        '[mfeCacheBust] No se pudo soltar el claim in-progress:',\n        cleanupError,\n      );\n    }\n    console.error('[mfeCacheBust] Error durante el force-refresh:', error);\n  }\n}\n"],"names":["styles","StyleSheet","create","container","flex","backgroundColor","scroll","width","content","padding","gap","title","fontSize","fontWeight","color","marginBottom","row","flexDirection","alignItems","borderRadius","borderWidth","borderColor","shadowColor","shadowOpacity","shadowRadius","shadowOffset","height","elevation","iconBox","justifyContent","marginRight","rowContent","rowTitle","rowSubtitle","marginTop","navigation","useNavigation","loadingStates","setLoadingStates","useState","clientConfig","useClientConfig","config","primaryColor","useEffect","runMfeCacheBustIfNeeded","catch","configService","getEffectiveConfig","links","useMemo","clientName","base","key","label","icon","ClipboardDocumentListIcon","group","description","ChartBarIcon","ChatBubbleLeftRightIcon","aldylExtras","sortedLinks","othersPriority","LiftingCostFormScreen","ShipToShipFormScreen","BilledRecoveryAndExpensesFormScreen","MarketReferencePriceFormScreen","CommentsFormScreen","sort","a","b","aPriority","Number","MAX_SAFE_INTEGER","bPriority","View","style","ScrollView","contentContainerStyle","showsVerticalScrollIndicator","Text","map","renderRow","item","Icon","isLoading","TouchableOpacity","onPress","navigateTo","prev","navigate","setTimeout","disabled","activeOpacity","undefined","ActivityIndicator","size","ChevronRightIcon","asyncGeneratorStep","gen","resolve","reject","_next","_throw","arg","info","value","error","done","Promise","then","exports","_","fn","self","this","args","arguments","apply","err","obj","__esModule","default","MFE_CACHE_BUST_VERSION","BUST_NAMESPACE","BUST_VERSION_KEY","BUST_IN_PROGRESS_KEY","BUST_IN_PROGRESS_TTL_MINUTES","SCRIPT_MANAGER_CACHE_PREFIX","NAV_SHELL_MANIFEST_NAMESPACE","NAV_SHELL_MANIFEST_KEY","busting","NetInfo","fetch","isConnected","console","log","warn","storageService","get","set","removeByPrefix","remove","authService","logout","reason","mod","NativeModules","HardRestartModule","restart","cleanupError"],"mappings":"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"}