{"version":3,"file":"__federation_expose_LabStatusWidget.chunk.bundle","sources":["/Users/claudiobaiardi/Documents/GitHub/aldyl/dataoil-app/apps/data-oil-app/labReports/src/components/LabStatusWidget.tsx","/Users/claudiobaiardi/Documents/GitHub/aldyl/dataoil-app/apps/data-oil-app/labReports/src/hooks/useLabReportsStats.ts","/Users/claudiobaiardi/Documents/GitHub/aldyl/dataoil-app/apps/data-oil-app/labReports/src/index.ts","/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 { FunctionComponent, useEffect, useRef } from 'react';\nimport {\n  View,\n  Text,\n  StyleSheet,\n  TouchableOpacity,\n  Animated,\n} from 'react-native';\nimport { useNavigation } from '@react-navigation/native';\nimport { ArrowPathIcon } from 'react-native-heroicons/outline';\nimport { NAVIGATION, LAB_REPORTS_SCREENS } from '@data-oil-front/core-utils';\nimport Svg, { Path } from 'react-native-svg';\nimport { useLabReportsStats } from '../hooks/useLabReportsStats';\nimport { runMfeCacheBustIfNeeded } from '@data-oil-front/mfe-runtime';\n\ninterface LabIconProps {\n  size?: number;\n  color?: string;\n}\n\nconst LabIcon: FunctionComponent<LabIconProps> = ({ \n  size = 24, \n  color = '#10B981' \n}) => (\n  <Svg\n    width={size}\n    height={size}\n    viewBox=\"0 0 24 24\"\n    fill=\"none\"\n    stroke={color}\n    strokeWidth={2}\n    strokeLinecap=\"round\"\n    strokeLinejoin=\"round\"\n  >\n    <Path d=\"M19.428 15.428a2 2 0 00-1.022-.547l-2.387-.477a6 6 0 00-3.86.517l-.318.158a6 6 0 01-3.86.517L6.05 15.21a2 2 0 00-1.806.547M8 4h8l-1 1v5.172a2 2 0 00.586 1.414l5 5c1.26 1.26.367 3.414-1.415 3.414H4.828c-1.782 0-2.674-2.154-1.414-3.414l5-5A2 2 0 009 10.172V5L8 4z\" />\n  </Svg>\n);\n\nconst LabStatusWidget: FunctionComponent = () => {\n  const navigation = useNavigation<any>();\n  const { stats, loading, refresh, usingCache, isConnected } = useLabReportsStats();\n  const spinValue = useRef(new Animated.Value(0)).current;\n\n  // Force-refresh one-shot: al montar este MFE lazy (que SÍ se baja fresco aun\n  // con el nav pegado), purga cache de bundles + sesión y reinicia, una sola\n  // vez por MFE_CACHE_BUST_VERSION. El gate de conectividad vive adentro\n  // (NetInfo.fetch, fuente canónica). `isConnected` queda sólo como disparador\n  // de reintento si la red vuelve. Ver @data-oil-front/mfe-runtime.\n  // A diferencia de los otros 4 MFEs (que usan `[]`), acá el dep `[isConnected]`\n  // es INTENCIONAL: re-dispara el gate cuando vuelve la red. NO normalizar a `[]`.\n  useEffect(() => {\n    runMfeCacheBustIfNeeded().catch(() => undefined);\n  }, [isConnected]);\n\n  useEffect(() => {\n    if (loading) {\n      Animated.loop(\n        Animated.timing(spinValue, {\n          toValue: 1,\n          duration: 1000,\n          useNativeDriver: true,\n        }),\n      ).start();\n    } else {\n      spinValue.setValue(0);\n    }\n  }, [loading, spinValue]);\n\n  const spin = spinValue.interpolate({\n    inputRange: [0, 1],\n    outputRange: ['0deg', '360deg'],\n  });\n\n  const handleRefreshData = () => {\n    refresh();\n  };\n\n  const handlePendingPress = () => {\n    navigation.navigate(NAVIGATION.LAB_REPORTS_FLOW, {\n      screen: LAB_REPORTS_SCREENS.HOME,\n      params: { filter: 'pending' },\n    });\n  };\n\n  const handleHistoryPress = () => {\n    navigation.navigate(NAVIGATION.LAB_REPORTS_FLOW, {\n      screen: LAB_REPORTS_SCREENS.HOME,\n      params: { filter: 'history' },\n    });\n  };\n\n  const containerStyle = [\n    styles.container,\n    {\n      backgroundColor: isConnected ? '#10B981' : '#9CA3AF',\n      opacity: isConnected ? 1 : 0.7,\n    },\n  ];\n\n  return (\n    <TouchableOpacity \n      style={containerStyle} \n      onPress={handleHistoryPress}\n      activeOpacity={0.9}\n    >\n      {}\n      <View style={styles.header}>\n        <View style={styles.iconContainer}>\n          <View style={styles.iconInner}>\n            <LabIcon size={24} color=\"#10B981\" />\n          </View>\n        </View>\n        <View style={styles.textContainer}>\n          <Text style={styles.title}>Estado del Laboratorio</Text>\n          <Text style={styles.subtitle}>\n            {usingCache ? 'Resumen de reportes (caché)' : 'Resumen de reportes'}\n          </Text>\n        </View>\n\n        <TouchableOpacity\n          onPress={handleRefreshData}\n          style={styles.refreshButton}\n          disabled={loading}\n        >\n          <Animated.View style={{ transform: [{ rotate: spin }] }}>\n            <ArrowPathIcon size={18} color=\"#FFFFFF\" />\n          </Animated.View>\n        </TouchableOpacity>\n      </View>\n\n      {}\n      <View style={styles.dataSection}>\n        <View style={styles.dataGrid}>\n          <TouchableOpacity \n            style={styles.dataItem} \n            onPress={handlePendingPress}\n            activeOpacity={0.7}\n          >\n            <Text style={styles.dataValue}>{stats.pending}</Text>\n            <Text style={styles.dataLabel}>Pendientes</Text>\n          </TouchableOpacity>\n          <View style={styles.dataItem}>\n            <Text style={styles.dataValue}>{stats.total}</Text>\n            <Text style={styles.dataLabel}>Reportes total</Text>\n          </View>\n          <View style={styles.dataItem}>\n            <Text style={styles.dataValue}>{stats.percentage}%</Text>\n            <Text style={styles.dataLabel}>Resolución</Text>\n          </View>\n        </View>\n      </View>\n    </TouchableOpacity>\n  );\n};\n\nconst styles = StyleSheet.create({\n  container: {\n    width: '100%',\n    borderRadius: 8,\n    padding: 16,\n    shadowColor: '#000',\n    shadowOffset: {\n      width: 0,\n      height: 2,\n    },\n    shadowOpacity: 0.1,\n    shadowRadius: 4,\n    elevation: 3,\n  },\n  header: {\n    flexDirection: 'row',\n    alignItems: 'center',\n    marginBottom: 12,\n  },\n  iconContainer: {\n    width: 40,\n    height: 40,\n    borderRadius: 8,\n    backgroundColor: 'rgba(255, 255, 255, 0.9)',\n    justifyContent: 'center',\n    alignItems: 'center',\n    marginRight: 12,\n    borderWidth: 1,\n    borderColor: 'rgba(255, 255, 255, 0.8)',\n  },\n  iconInner: {\n    width: 24,\n    height: 24,\n    justifyContent: 'center',\n    alignItems: 'center',\n  },\n  textContainer: {\n    flex: 1,\n  },\n  title: {\n    fontSize: 16,\n    fontWeight: '600',\n    color: '#FFFFFF',\n    marginBottom: 2,\n    textShadowColor: 'rgba(0, 0, 0, 0.1)',\n    textShadowOffset: { width: 0, height: 1 },\n    textShadowRadius: 2,\n  },\n  subtitle: {\n    fontSize: 14,\n    color: '#D1FAE5',\n    textShadowColor: 'rgba(0, 0, 0, 0.05)',\n    textShadowOffset: { width: 0, height: 1 },\n    textShadowRadius: 1,\n  },\n  refreshButton: {\n    marginLeft: 'auto',\n    padding: 8,\n    borderRadius: 20,\n    backgroundColor: 'rgba(255, 255, 255, 0.2)',\n    justifyContent: 'center',\n    alignItems: 'center',\n  },\n  dataSection: {\n    marginTop: 8,\n  },\n  dataGrid: {\n    flexDirection: 'row',\n    justifyContent: 'space-around',\n  },\n  dataItem: {\n    alignItems: 'center',\n    flex: 1,\n  },\n  dataValue: {\n    fontSize: 24,\n    fontWeight: 'bold',\n    color: '#FFFFFF',\n    marginBottom: 4,\n    textShadowColor: 'rgba(0, 0, 0, 0.1)',\n    textShadowOffset: { width: 0, height: 1 },\n    textShadowRadius: 2,\n  },\n  dataLabel: {\n    fontSize: 14,\n    color: '#D1FAE5',\n    textAlign: 'center',\n    textShadowColor: 'rgba(0, 0, 0, 0.05)',\n    textShadowOffset: { width: 0, height: 1 },\n    textShadowRadius: 1,\n  },\n});\n\nexport default LabStatusWidget;\n","import { useCallback, useEffect, useState } from 'react';\nimport { useNetInfo } from '@react-native-community/netinfo';\nimport { getCachedStats, refreshLabStats } from '../services/labReportsStats.service';\nimport type { LabStats } from '../types/labReportsStats';\n\nexport function useLabReportsStats() {\n  const netInfo = useNetInfo();\n  const isConnected = netInfo.isConnected ?? false;\n\n  const [stats, setStats] = useState<LabStats>({ pending: 0, total: 0, percentage: 0 });\n  const [loading, setLoading] = useState(true);\n  const [usingCache, setUsingCache] = useState(false);\n\n  const loadStats = useCallback(async (forceRefresh = false) => {\n    setLoading(true);\n    try {\n      let data: LabStats | null = null;\n\n      if (isConnected && forceRefresh) {\n        data = await refreshLabStats();\n        setUsingCache(false);\n        console.log('✅ Manual refresh completed with fresh data:', data);\n      } else if (isConnected) {\n        data = await getCachedStats();\n        if (data) {\n          setUsingCache(true);\n          console.log('✅ Loaded from cache:', data);\n        } else {\n          data = await refreshLabStats();\n          setUsingCache(false);\n          console.log('✅ Loaded from API:', data);\n        }\n      } else {\n        data = await getCachedStats();\n        if (data) {\n          setUsingCache(true);\n          console.log('✅ Loaded from cache (offline):', data);\n        } else {\n          console.log('⚠️ No cache available offline');\n        }\n      }\n\n      if (data) {\n        setStats(data);\n      }\n    } catch (error) {\n      console.error('❌ Error loading lab stats:', error);\n    } finally {\n      setLoading(false);\n    }\n  }, [isConnected]);\n\n  const refresh = useCallback(async () => {\n    await loadStats(true);\n  }, [loadStats]);\n\n  useEffect(() => {\n    loadStats();\n  }, [loadStats]);\n\n  useEffect(() => {\n    if (isConnected && usingCache) {\n      loadStats(true);\n    }\n  }, [isConnected, usingCache, loadStats]);\n\n  return {\n    stats,\n    loading,\n    refresh,\n    usingCache,\n    isConnected,\n  } as const;\n}\n","export { default as LabStatusWidget } from './components/LabStatusWidget';\n\nexport { useLabReportsStats } from './hooks/useLabReportsStats';\n\nexport type { LabStats, LabStatsCache } from './types/labReportsStats';\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":["LabIcon","size","color","width","height","viewBox","fill","stroke","strokeWidth","strokeLinecap","strokeLinejoin","Path","d","styles","StyleSheet","create","container","borderRadius","padding","shadowColor","shadowOffset","shadowOpacity","shadowRadius","elevation","header","flexDirection","alignItems","marginBottom","iconContainer","backgroundColor","justifyContent","marginRight","borderWidth","borderColor","iconInner","textContainer","flex","title","fontSize","fontWeight","textShadowColor","textShadowOffset","textShadowRadius","subtitle","refreshButton","marginLeft","dataSection","marginTop","dataGrid","dataItem","dataValue","dataLabel","textAlign","LabStatusWidget","navigation","useNavigation","stats","loading","refresh","useLabReportsStats","usingCache","isConnected","spinValue","useRef","Animated","Value","current","useEffect","runMfeCacheBustIfNeeded","catch","loop","timing","toValue","duration","useNativeDriver","start","setValue","spin","interpolate","inputRange","outputRange","containerStyle","opacity","TouchableOpacity","style","onPress","handleHistoryPress","navigate","NAVIGATION","LAB_REPORTS_FLOW","screen","LAB_REPORTS_SCREENS","HOME","params","filter","activeOpacity","View","Text","handleRefreshData","disabled","transform","rotate","ArrowPathIcon","handlePendingPress","pending","total","percentage","useNetInfo","setStats","useState","setLoading","setUsingCache","loadStats","useCallback","forceRefresh","data","refreshLabStats","console","log","getCachedStats","error","asyncGeneratorStep","gen","resolve","reject","_next","_throw","key","arg","info","value","done","Promise","then","exports","_","fn","self","this","args","arguments","apply","err","undefined","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","warn","storageService","get","set","removeByPrefix","remove","authService","logout","reason","mod","NativeModules","HardRestartModule","restart","cleanupError"],"mappings":"8RAAqD,O,IAO9C,O,IACuB,O,IACA,O,IACkB,O,QACtB,Q,IACS,O,IACK,MAOlCA,EAA2CA,SAAC,G,aAChDC,OAAI,IAAG,KAAE,YACTC,OAAK,IAAG,c,OAER,SAAC,UAAG,CACFC,MAAOF,EACPG,OAAQH,EACRI,QAAQ,YACRC,KAAK,OACLC,OAAQL,EACRM,YAAa,EACbC,cAAc,QACdC,eAAe,Q,UAEf,SAAC,EAAAC,KAAI,CAACC,EAAE,2Q,EAyHNC,EAASC,EAAAA,WAAWC,OAAO,CAC/BC,UAAW,CACTb,MAAO,OACPc,aAAc,EACdC,QAAS,GACTC,YAAa,OACbC,aAAc,CACZjB,MAAO,EACPC,OAAQ,GAEViB,cAAe,GACfC,aAAc,EACdC,UAAW,GAEbC,OAAQ,CACNC,cAAe,MACfC,WAAY,SACZC,aAAc,IAEhBC,cAAe,CACbzB,MAAO,GACPC,OAAQ,GACRa,aAAc,EACdY,gBAAiB,2BACjBC,eAAgB,SAChBJ,WAAY,SACZK,YAAa,GACbC,YAAa,EACbC,YAAa,4BAEfC,UAAW,CACT/B,MAAO,GACPC,OAAQ,GACR0B,eAAgB,SAChBJ,WAAY,UAEdS,cAAe,CACbC,KAAM,GAERC,MAAO,CACLC,SAAU,GACVC,WAAY,MACZrC,MAAO,UACPyB,aAAc,EACda,gBAAiB,qBACjBC,iBAAkB,CAAEtC,MAAO,EAAGC,OAAQ,GACtCsC,iBAAkB,GAEpBC,SAAU,CACRL,SAAU,GACVpC,MAAO,UACPsC,gBAAiB,sBACjBC,iBAAkB,CAAEtC,MAAO,EAAGC,OAAQ,GACtCsC,iBAAkB,GAEpBE,cAAe,CACbC,WAAY,OACZ3B,QAAS,EACTD,aAAc,GACdY,gBAAiB,2BACjBC,eAAgB,SAChBJ,WAAY,UAEdoB,YAAa,CACXC,UAAW,GAEbC,SAAU,CACRvB,cAAe,MACfK,eAAgB,gBAElBmB,SAAU,CACRvB,WAAY,SACZU,KAAM,GAERc,UAAW,CACTZ,SAAU,GACVC,WAAY,OACZrC,MAAO,UACPyB,aAAc,EACda,gBAAiB,qBACjBC,iBAAkB,CAAEtC,MAAO,EAAGC,OAAQ,GACtCsC,iBAAkB,GAEpBS,UAAW,CACTb,SAAU,GACVpC,MAAO,UACPkD,UAAW,SACXZ,gBAAiB,sBACjBC,iBAAkB,CAAEtC,MAAO,EAAGC,OAAQ,GACtCsC,iBAAkB,KAItB,EAlN2CW,WACzC,IAAMC,GAAa,EAAAC,EAAAA,iBACnB,GAAM,0BAA2E,IAAzEC,MAAOC,EAAF,EAAEA,QAASC,EAAqCC,EAArCD,QAASE,EAAF,EAAEA,WAAYC,EAAF,EAAEA,YACvCC,GAAY,EAAAC,EAAAA,QAAO,IAAIC,EAAAA,SAASC,MAAM,IAAIC,S,EAShDC,EAAAA,WAAU,YACRC,EAAAA,EAAAA,2BAA0BC,MAAM,W,EAClC,EAAG,CAACR,K,EAEJM,EAAAA,WAAU,WACJV,EACFO,EAAAA,SAASM,KACPN,EAAAA,SAASO,OAAOT,EAAW,CACzBU,QAAS,EACTC,SAAU,IACVC,iBAAiB,KAEnBC,QAEFb,EAAUc,SAAS,EAEvB,EAAG,CAACnB,EAASK,IAEb,IAAMe,EAAOf,EAAUgB,YAAY,CACjCC,WAAY,CAAC,EAAG,GAChBC,YAAa,CAAC,OAAQ,YAqBlBC,EAAiB,CACrBpE,EAAOG,UACP,CACEa,gBAAiBgC,EAAc,UAAY,UAC3CqB,QAASrB,EAAc,EAAI,KAI/B,OACE,UAAC,EAAAsB,iBAAgB,CACfC,MAAOH,EACPI,QAlBuBC,WACzBhC,EAAWiC,SAASC,EAAAA,WAAWC,iBAAkB,CAC/CC,OAAQC,EAAAA,oBAAoBC,KAC5BC,OAAQ,CAAEC,OAAQ,YAEtB,EAcIC,cAAe,G,WAGf,UAAC,EAAAC,KAAI,CAACZ,MAAOvE,EAAOW,O,WAClB,SAAC,EAAAwE,KAAI,CAACZ,MAAOvE,EAAOe,c,UAClB,SAAC,EAAAoE,KAAI,CAACZ,MAAOvE,EAAOqB,U,UAClB,SAAClC,EAAO,CAACC,KAAM,GAAIC,MAAM,iBAG7B,UAAC,EAAA8F,KAAI,CAACZ,MAAOvE,EAAOsB,c,WAClB,SAAC,EAAA8D,KAAI,CAACb,MAAOvE,EAAOwB,M,SAAO,4BAC3B,SAAC,EAAA4D,KAAI,CAACb,MAAOvE,EAAO8B,S,SACjBiB,EAAa,8BAAgC,4BAIlD,SAAC,EAAAuB,iBAAgB,CACfE,QA/CkBa,WACxBxC,GACF,EA8CQ0B,MAAOvE,EAAO+B,cACduD,SAAU1C,E,UAEV,SAAC,EAAAO,SAASgC,KAAI,CAACZ,MAAO,CAAEgB,UAAW,CAAC,CAAEC,OAAQxB,K,UAC5C,SAAC,EAAAyB,cAAa,CAACrG,KAAM,GAAIC,MAAM,oBAMrC,SAAC,EAAA8F,KAAI,CAACZ,MAAOvE,EAAOiC,Y,UAClB,UAAC,EAAAkD,KAAI,CAACZ,MAAOvE,EAAOmC,S,WAClB,UAAC,EAAAmC,iBAAgB,CACfC,MAAOvE,EAAOoC,SACdoC,QA1DiBkB,WACzBjD,EAAWiC,SAASC,EAAAA,WAAWC,iBAAkB,CAC/CC,OAAQC,EAAAA,oBAAoBC,KAC5BC,OAAQ,CAAEC,OAAQ,YAEtB,EAsDUC,cAAe,G,WAEf,SAAC,EAAAE,KAAI,CAACb,MAAOvE,EAAOqC,U,SAAYM,EAAMgD,WACtC,SAAC,EAAAP,KAAI,CAACb,MAAOvE,EAAOsC,U,SAAW,mBAEjC,UAAC,EAAA6C,KAAI,CAACZ,MAAOvE,EAAOoC,S,WAClB,SAAC,EAAAgD,KAAI,CAACb,MAAOvE,EAAOqC,U,SAAYM,EAAMiD,SACtC,SAAC,EAAAR,KAAI,CAACb,MAAOvE,EAAOsC,U,SAAW,uBAEjC,UAAC,EAAA6C,KAAI,CAACZ,MAAOvE,EAAOoC,S,WAClB,UAAC,EAAAgD,KAAI,CAACb,MAAOvE,EAAOqC,U,UAAYM,EAAMkD,WAAW,QACjD,SAAC,EAAAT,KAAI,CAACb,MAAOvE,EAAOsC,U,SAAW,yBAM3C,C,8LCzJiD,O,IACtB,O,IACqB,OAGzC,SAASQ,I,MAERE,EAAiC,OAAtB,GADD,EAAA8C,EAAAA,cACY9C,cAAW,EAEvC,EAAM,mBAAuC,CAAE2C,QAAS,EAAGC,MAAO,EAAGC,WAAY,IAAI,GAA9ElD,EAAK,KAAEoD,EAAYC,EAAAA,GAC1B,EAAM,KAAwBA,EAAAA,EAAAA,WAAS,GAAK,GAArCpD,EAAO,KAAEqD,EAAW,KAC3B,EAAM,oBAAuC,GAAM,GAA5ClD,EAAU,KAAEmD,EAAiBF,EAAAA,GAE9BG,GAAY,EAAAC,EAAAA,aAAY,W,IAAOC,EAAe,UAAH,8C,uBAC/CJ,GAAW,GACX,IACE,IAAIK,EAAwB,KAExBtD,GAAeqD,GACjBC,QAAO,EAAMC,EAAAA,mBACbL,GAAc,GACdM,QAAQC,IAAI,8CAA+CH,IAClDtD,GACTsD,QAAO,EAAMI,EAAAA,oBAEXR,GAAc,GACdM,QAAQC,IAAI,uBAAwBH,KAEpCA,QAAO,EAAMC,EAAAA,mBACbL,GAAc,GACdM,QAAQC,IAAI,qBAAsBH,KAGpCA,QAAO,EAAMI,EAAAA,oBAEXR,GAAc,GACdM,QAAQC,IAAI,iCAAkCH,IAE9CE,QAAQC,IAAI,iCAIZH,GACFP,EAASO,EAEb,CAAE,MAAOK,GACPH,QAAQG,MAAM,6BAA8BA,EAC9C,CAAE,QACAV,GAAW,EACb,CACF,E,IAAG,CAACjD,IAEEH,GAAU,EAAAuD,EAAAA,aAAY,W,6BACpBD,GAAU,EAClB,E,IAAG,CAACA,IAYJ,O,EAVA7C,EAAAA,WAAU,WACR6C,GACF,EAAG,CAACA,K,EAEJ7C,EAAAA,WAAU,WACJN,GAAeD,GACjBoD,GAAU,EAEd,EAAG,CAACnD,EAAaD,EAAYoD,IAEtB,C,MACLxD,E,QACAC,E,QACAC,E,WACAE,E,YACAC,EAEJ,C,+NCzEoBR,EAAAA,O,kCAEXM,EAAAA,kB,uBAFkC,Q,IAER,M,mCCDnC,SAAS8D,EAAmBC,EAAKC,EAASC,EAAQC,EAAOC,EAAQC,EAAKC,GAClE,IACI,IAAIC,EAAOP,EAAIK,GAAKC,GAChBE,EAAQD,EAAKC,KACrB,CAAE,MAAOV,GAEL,YADAI,EAAOJ,EAEX,CACIS,EAAKE,KAAMR,EAAQO,GAClBE,QAAQT,QAAQO,GAAOG,KAAKR,EAAOC,EAC5C,CAgBAQ,EAAQC,EAfR,SAA6BC,GACzB,OAAO,WACH,IAAIC,EAAOC,KAAMC,EAAOC,UACxB,OAAO,IAAIR,QAAQ,SAAST,EAASC,GACjC,IAAIF,EAAMc,EAAGK,MAAMJ,EAAME,GACzB,SAASd,EAAMK,GACXT,EAAmBC,EAAKC,EAASC,EAAQC,EAAOC,EAAQ,OAAQI,EACpE,CACA,SAASJ,EAAOgB,GACZrB,EAAmBC,EAAKC,EAASC,EAAQC,EAAOC,EAAQ,QAASgB,EACrE,CACAjB,OAAMkB,EACV,EACJ,CACJ,C,kCCpBAT,EAAQC,EALR,SAAkCS,GAC9B,OAAOA,GAAOA,EAAIC,WAAaD,EAAM,CACjCE,QAASF,EAEjB,C,qOCEEG,EAAAA,sB,uCADA/E,EAAAA,uB,YAEK,M,sOCiBM+E,C,uCAyFS/E,C,iCAlHqB,O,QACvB,Q,IACwB,OAuBrC,EAA+B,gBAWhCgF,EAAiB,aACjBC,EAAmB,sBAgBnBC,EAAuB,yBACvBC,EAA+B,EAK/BC,EAA8B,6BAG9BC,EAA+B,OAC/BC,EAAyB,gCAK3BC,GAAU,EA8CP,a,uBACL,IAAIA,EAAJ,CAIA,IAEE,WADkBC,EAAAA,QAAQC,SACjBhG,YAEP,YADAwD,QAAQC,IAAI,iEAGhB,CAAE,MAAOE,GAGP,YADAH,QAAQyC,KAAK,6DAA8DtC,EAE7E,CAEA,IAOE,UANsBuC,EAAAA,eAAeC,IACnCZ,EACAC,GACA,MAGcF,EAAwB,OAWxC,UALyBY,EAAAA,eAAeC,IACtCZ,EACAE,MAGiBH,EAIjB,YAHA9B,QAAQC,IACN,qEAKJqC,GAAU,QAIJI,EAAAA,eAAeE,IACnBb,EACAE,EACAH,EACAI,GAGFlC,QAAQC,IACN,yCAAyC6B,eAKrCY,EAAAA,eAAeG,eAAe,OAAQV,SAGtCO,EAAAA,eAAeI,OACnBV,EACAC,SAMIU,EAAAA,YAAYC,eAIZN,EAAAA,eAAeE,IACnBb,EACAC,EACAF,EACA,QAGF9B,QAAQC,IAAI,mEA7HOgD,EA8HL,kBAAkBnB,I,gBAjHlC,IAAMoB,EAAG,MAAG,EAAH,qBAAIC,EAAAA,cAAuBC,kBAIpC,GAAIF,GAA8B,mBAAhBA,EAAIG,QACpB,IAEE,kBADMH,EAAIG,QAAQJ,GAEpB,CAAE,MAAO9C,GACPH,QAAQyC,KAAK,kDAAmDtC,EAClE,MAKAH,QAAQG,MACN,yFAGN,E,GA+FE,CAAE,MAAOA,GACPmC,GAAU,EAGV,UACQI,EAAAA,eAAeI,OAAOf,EAAgBE,EAC9C,CAAE,MAAOqB,GACPtD,QAAQyC,KACN,yDACAa,EAEJ,CACAtD,QAAQG,MAAM,iDAAkDA,EAClE,CA5IF,IAAuB8C,CA6CF,CAgGrB,E"}