{"version":3,"file":"__federation_expose_LabReportsHome.chunk.bundle","sources":["/Users/claudiobaiardi/Documents/GitHub/aldyl/dataoil-app/apps/data-oil-app/labReports/src/App.tsx","/Users/claudiobaiardi/Documents/GitHub/aldyl/dataoil-app/apps/data-oil-app/labReports/src/components/LabReportCard.tsx","/Users/claudiobaiardi/Documents/GitHub/aldyl/dataoil-app/apps/data-oil-app/labReports/src/hooks/useInfiniteReports.ts","/Users/claudiobaiardi/Documents/GitHub/aldyl/dataoil-app/apps/data-oil-app/labReports/src/hooks/useLabReports.ts","/Users/claudiobaiardi/Documents/GitHub/aldyl/dataoil-app/apps/data-oil-app/labReports/src/services/labReports.catalog.api.ts"],"sourcesContent":["import React, { useCallback, useMemo, useState, useEffect } from 'react';\nimport {\n  View,\n  Text,\n  StyleSheet,\n  useColorScheme,\n  StatusBar,\n  FlatList,\n  Pressable,\n} from 'react-native';\nimport { ChevronDownIcon, ChevronUpIcon } from 'react-native-heroicons/solid';\nimport { useRoute, useNavigation } from '@react-navigation/native';\nimport {\n  DateRangePicker,\n  LoadingSpinner,\n  Select,\n  MenuItem,\n} from '@data-oil-front/ui-mobile';\nimport { useLabReports } from './hooks/useLabReports';\nimport LabReportCard from './components/LabReportCard';\nimport type { LabReportRowItem } from './types/labReports';\nimport { useTheme } from '@data-oil-front/core-host';\nimport { getConfiguredLabInstallationOptions } from './utils/labReports.installations';\n\ntype ListRow =\n  | { type: 'item'; item: LabReportRowItem }\n  | { type: 'state'; state: 'loading' | 'empty' };\n\nexport default function LabReportsHomeScreen() {\n  const route = useRoute<any>();\n  const navigation = useNavigation<any>();\n\n  const { primaryColor } = useTheme();\n  const [showFilters, setShowFilters] = useState(false);\n\n  const toggleFilters = useCallback(() => {\n    setShowFilters(prev => !prev);\n  }, []);\n\n  const {\n    pendingRange,\n    pendingInstallationType,\n    historyRange,\n    historyInstallationType,\n    activeRows,\n    historyRows,\n    daysWithReports,\n    applyDate,\n    applyInstallationType,\n    clearFilter,\n    openActive,\n    openHistory,\n    loadingActive,\n    loadingHistory,\n    totalHistoryCount,\n    totalHistoryFilteredCount,\n    ensureHistoryLoaded,\n    historyLoaded,\n    loadMoreHistory,\n    hasMoreHistory,\n    loadingMoreHistory,\n  } = useLabReports();\n\n  const isDarkMode = useColorScheme() === 'dark';\n  const installationOptions = getConfiguredLabInstallationOptions()\n\n  const [activeTab, setActiveTab] = useState<'pending' | 'history'>(() => {\n    if (route.params?.filter === 'history') return 'history';\n    return 'pending';\n  });\n\n  useEffect(() => {\n    const params = route.params;\n    const hasParams = params?.resetDate || params?.filter;\n\n    if (hasParams) {\n      if (params.resetDate) {\n        clearFilter('pending');\n        clearFilter('history');\n      }\n      if (params.filter === 'pending') {\n        setActiveTab('pending');\n      } else if (params.filter === 'history') {\n        setActiveTab('history');\n        ensureHistoryLoaded();\n      }\n\n      navigation.setParams({ resetDate: undefined, filter: undefined });\n    }\n  }, [route.params, clearFilter, ensureHistoryLoaded, navigation]);\n\n  const currentRange = useMemo(\n    () => (activeTab === 'pending' ? pendingRange : historyRange),\n    [activeTab, pendingRange, historyRange],\n  );\n\n  const currentInstallationType = useMemo(\n    () =>\n      activeTab === 'pending'\n        ? pendingInstallationType\n        : historyInstallationType,\n    [activeTab, pendingInstallationType, historyInstallationType],\n  );\n\n  const pendingCountLabel = useMemo(\n    () => (activeRows.length > 0 ? ` (${activeRows.length})` : ''),\n    [activeRows.length],\n  );\n\n  const isFiltered = useMemo(() => {\n    const filters = activeTab === 'pending' ? { range: pendingRange, type: pendingInstallationType } : { range: historyRange, type: historyInstallationType };\n    return !!(filters.range.startDate || filters.type);\n  }, [activeTab, pendingRange, pendingInstallationType, historyRange, historyInstallationType]);\n\n  const historyCountLabel = useMemo(() => {\n    const count = isFiltered ? totalHistoryFilteredCount : totalHistoryCount;\n    return count > 0 ? ` (${count})` : '';\n  }, [isFiltered, totalHistoryFilteredCount, totalHistoryCount]);\n\n  const currentData = useMemo(\n    () => (activeTab === 'pending' ? activeRows : historyRows),\n    [activeTab, activeRows, historyRows],\n  );\n\n  const currentOnPress = useMemo(\n    () => (activeTab === 'pending' ? openActive : openHistory),\n    [activeTab, openActive, openHistory],\n  );\n\n  const currentLoading = useMemo(\n    () => (activeTab === 'pending' ? loadingActive : loadingHistory),\n    [activeTab, loadingActive, loadingHistory],\n  );\n\n  const listRows: ListRow[] = useMemo(() => {\n    const rows: ListRow[] = [];\n\n    const isFetching = currentLoading || (activeTab === 'history' && loadingMoreHistory);\n\n    if (currentData.length === 0) {\n      rows.push({ type: 'state', state: isFetching ? 'loading' : 'empty' });\n      return rows;\n    }\n\n    rows.push(...currentData.map(item => ({ type: 'item' as const, item })));\n    return rows;\n  }, [currentData, currentLoading, loadingMoreHistory, activeTab]);\n\n  const handleTabChange = useCallback(\n    (tab: 'pending' | 'history') => {\n      setActiveTab(tab);\n      if (tab === 'history') {\n        ensureHistoryLoaded();\n      }\n    },\n    [ensureHistoryLoaded],\n  );\n\n  const handleEndReached = useCallback(() => {\n    if (activeTab !== 'history') return;\n    if (!historyLoaded) return;\n    if (loadingHistory || loadingMoreHistory) return;\n    if (!hasMoreHistory) return;\n    loadMoreHistory();\n  }, [\n    activeTab,\n    hasMoreHistory,\n    historyLoaded,\n    loadMoreHistory,\n    loadingHistory,\n    loadingMoreHistory,\n  ]);\n\n  const handleOnScrollBeginDrag = useCallback(() => {\n    if (showFilters) {\n      setShowFilters(false);\n    }\n  }, [showFilters]);\n\n  return (\n    <View style={styles.container}>\n      <StatusBar barStyle={isDarkMode ? 'light-content' : 'dark-content'} />\n      <View style={styles.tabsHeader}>\n        <View style={styles.tabsWrap}>\n          <Pressable\n            accessibilityRole=\"button\"\n            onPress={() => handleTabChange('pending')}\n            style={({ pressed }) => [\n              styles.tabBtn,\n              activeTab === 'pending' ? styles.tabBtnActive : null,\n              pressed && { opacity: 0.7 },\n            ]}\n          >\n            <Text\n              style={[\n                styles.tabText,\n                activeTab === 'pending' ? styles.tabTextActive : null,\n              ]}\n            >\n              Pendientes{pendingCountLabel}\n            </Text>\n          </Pressable>\n          <Pressable\n            accessibilityRole=\"button\"\n            onPress={() => handleTabChange('history')}\n            style={({ pressed }) => [\n              styles.tabBtn,\n              activeTab === 'history' ? styles.tabBtnActive : null,\n              pressed && { opacity: 0.7 },\n            ]}\n          >\n            <Text\n              style={[\n                styles.tabText,\n                activeTab === 'history' ? styles.tabTextActive : null,\n              ]}\n            >\n              Historial{historyCountLabel}\n            </Text>\n          </Pressable>\n        </View>\n      </View>\n      <View style={styles.stickyHeader}>\n        <Pressable\n          style={({ pressed }) => [\n            styles.toggleHeader,\n            pressed && { opacity: 0.7 },\n          ]}\n          onPress={toggleFilters}\n          hitSlop={8}\n        >\n          <Text style={styles.sectionTitle}>Filtros</Text>\n          {showFilters ? (\n            <ChevronUpIcon size={24} color={primaryColor} />\n          ) : (\n            <ChevronDownIcon size={24} color={primaryColor} />\n          )}\n        </Pressable>\n\n        {showFilters && (\n          <View style={styles.filters}>\n            <View style={styles.filtersCol}>\n              <View style={styles.filterCol}>\n                <DateRangePicker\n                  label=\"Rango de fechas\"\n                  value={currentRange}\n                  onChange={val => applyDate(activeTab, val)}\n                  onDateRangeChange={val => applyDate(activeTab, val)}\n                  onClear={() => clearFilter(activeTab)}\n                  placeholder=\"Desde - Hasta\"\n                />\n              </View>\n              <View style={styles.filterCol}>\n                <Select\n                  label=\"Instalación\"\n                  value={currentInstallationType}\n                  onChange={(val: any) => applyInstallationType(activeTab, val)}\n                  placeholder=\"Todas\"\n                >\n                  <MenuItem value={null}>Todas</MenuItem>\n                  {installationOptions.map(option => (\n                    <MenuItem key={option.tableName} value={option.tableName}>\n                      {option.label}\n                    </MenuItem>\n                  ))}\n                </Select>\n              </View>\n            </View>\n            {activeTab === 'pending' && daysWithReports.length > 0 ? (\n              <View style={styles.banner}>\n                <Text style={styles.bannerText}>\n                  📅 Este mes tiene{' '}\n                  <Text style={styles.bannerStrong}>\n                    {daysWithReports.length}\n                  </Text>{' '}\n                  día{daysWithReports.length > 1 ? 's' : ''} con reportes\n                  pendientes\n                </Text>\n                <View style={styles.daysWrap}>\n                  {daysWithReports.slice(0, 10).map(day => (\n                    <View key={day} style={styles.dayPill}>\n                      <Text style={styles.dayPillText}>\n                        {day.split('-')[2]}\n                      </Text>\n                    </View>\n                  ))}\n                  {daysWithReports.length > 10 ? (\n                    <View style={styles.dayPill}>\n                      <Text style={styles.dayPillText}>\n                        +{daysWithReports.length - 10} más\n                      </Text>\n                    </View>\n                  ) : null}\n                </View>\n              </View>\n            ) : null}\n          </View>\n        )}\n      </View>\n      <FlatList\n        onScrollBeginDrag={handleOnScrollBeginDrag}\n        data={listRows}\n        keyboardShouldPersistTaps=\"handled\"\n        keyExtractor={(row: ListRow, index: number) => {\n          if (row.type === 'state') return `state:${row.state}`;\n          const normalizedItemId = String(row.item._itemId ?? '');\n          if (normalizedItemId && !normalizedItemId.includes('undefined')) {\n            return normalizedItemId;\n          }\n          return `fallback:${String(row.item._itemId ?? 'na')}:${String(row.item.Fecha ?? 'na')}:${index}`;\n        }}\n        renderItem={({ item: row }: { item: ListRow }) => {\n          if (row.type === 'state') {\n            if (row.state === 'loading') {\n              return (\n                <View style={styles.empty}>\n                  <LoadingSpinner size=\"large\" color=\"#6B7280\" />\n                </View>\n              );\n            }\n            return (\n              <View style={styles.empty}>\n                <Text style={styles.emptyIcon}>\n                  {activeTab === 'pending' ? '📋' : '📊'}\n                </Text>\n                <Text style={styles.emptyTitle}>\n                  {isFiltered\n                    ? 'No se encontraron resultados'\n                    : activeTab === 'pending'\n                    ? 'No hay reportes pendientes'\n                    : totalHistoryCount > 0\n                    ? 'Buscando reportes antiguos...'\n                    : 'No hay reportes en el historial'}\n                </Text>\n                <Text style={styles.emptyText}>\n                  {isFiltered\n                    ? 'Prueba ajustando los filtros aplicados'\n                    : activeTab === 'pending'\n                    ? 'Todos los reportes han sido procesados'\n                    : totalHistoryCount > 0\n                    ? 'Estamos cargando registros previos'\n                    : 'Los reportes procesados aparecerán aquí'}\n                </Text>\n              </View>\n            );\n          }\n\n          return (\n            <View style={styles.cardWrap}>\n              <LabReportCard\n                item={row.item}\n                status={activeTab === 'pending' ? 'pending' : 'done'}\n                onPress={currentOnPress}\n              />\n            </View>\n          );\n        }}\n        ItemSeparatorComponent={ItemSeparator}\n        onEndReached={handleEndReached}\n        onEndReachedThreshold={0.4}\n        initialNumToRender={12}\n        maxToRenderPerBatch={12}\n        windowSize={7}\n        ListFooterComponent={\n          activeTab === 'history' && historyLoaded && loadingMoreHistory && currentData.length > 0 ? (\n            <View style={styles.footerLoading}>\n              <LoadingSpinner size=\"large\" color=\"#6B7280\" />\n              <Text style={styles.footerLoadingText}>Cargando más reportes...</Text>\n            </View>\n          ) : null\n        }\n        contentContainerStyle={contentContainerStyle}\n        showsVerticalScrollIndicator={true}\n      />\n\n      {}\n      {}\n    </View>\n  );\n}\n\nconst styles = StyleSheet.create({\n  container: {\n    flex: 1,\n    backgroundColor: '#FFFFFF',\n  },\n  tabsHeader: {\n    paddingHorizontal: 16,\n    paddingVertical: 8,\n    backgroundColor: '#FFFFFF',\n    zIndex: 10,\n    elevation: 12,\n  },\n  toggleHeader: {\n    alignItems: 'center',\n    justifyContent: 'center',\n    paddingVertical: 12,\n  },\n  filters: {\n    gap: 12,\n    paddingHorizontal: 16,\n    paddingTop: 8,\n    paddingBottom: 8,\n    backgroundColor: '#FFFFFF',\n  },\n  filtersCol: {\n    gap: 12,\n    paddingBottom: 4,\n  },\n  filterCol: {\n    width: '100%',\n  },\n  stickyHeader: {\n    backgroundColor: '#FFFFFF',\n    zIndex: 10,\n    elevation: 12,\n    marginBottom: 16,\n  },\n  sectionTitle: {\n    fontSize: 12,\n    fontWeight: '700',\n    color: '#111827',\n  },\n  banner: {\n    backgroundColor: '#EFF6FF',\n    padding: 12,\n    borderWidth: 1,\n    borderColor: '#BFDBFE',\n    borderRadius: 10,\n    gap: 6,\n  },\n  bannerText: {\n    color: '#1D4ED8',\n    fontSize: 14,\n  },\n  bannerStrong: {\n    fontWeight: '700',\n  },\n  daysWrap: {\n    flexDirection: 'row',\n    flexWrap: 'wrap',\n    gap: 6,\n  },\n  dayPill: {\n    backgroundColor: '#DBEAFE',\n    borderRadius: 8,\n    paddingHorizontal: 8,\n    paddingVertical: 4,\n  },\n  dayPillText: {\n    color: '#1D4ED8',\n    fontSize: 14,\n  },\n  empty: {\n    alignItems: 'center',\n    paddingVertical: 24,\n    gap: 6,\n  },\n  emptyIcon: {\n    fontSize: 48,\n    color: '#9CA3AF',\n  },\n  emptyTitle: {\n    fontSize: 16,\n    color: '#6B7280',\n  },\n  emptyText: {\n    fontSize: 14,\n    color: '#9CA3AF',\n  },\n  sectionHeader: {\n    flexDirection: 'row',\n    alignItems: 'center',\n    justifyContent: 'space-between',\n    marginTop: 8,\n    marginBottom: 8,\n  },\n  listTitle: {\n    fontSize: 14,\n    fontWeight: '700',\n    color: '#111827',\n  },\n  tabsWrap: {\n    flexDirection: 'row',\n    backgroundColor: '#F3F4F6',\n    borderRadius: 12,\n    padding: 4,\n    gap: 4,\n  },\n  tabBtn: {\n    flex: 1,\n    paddingVertical: 10,\n    borderRadius: 10,\n    alignItems: 'center',\n    justifyContent: 'center',\n  },\n  tabBtnActive: {\n    backgroundColor: '#FFFFFF',\n    borderWidth: 1,\n    borderColor: '#E5E7EB',\n  },\n  tabText: {\n    fontSize: 13,\n    fontWeight: '700',\n    color: '#6B7280',\n  },\n  tabTextActive: {\n    color: '#111827',\n  },\n  cardWrap: {\n    paddingHorizontal: 16,\n  },\n  footerLoading: {\n    paddingVertical: 16,\n    alignItems: 'center',\n    gap: 8,\n  },\n  footerLoadingText: {\n    fontSize: 14,\n    color: '#6B7280',\n  },\n});\n\nfunction ItemSeparator() {\n  return <View style={separatorStyle} />;\n}\nconst separatorStyle = { height: 8 } as const;\nconst contentContainerStyle = { paddingBottom: 16 } as const;\n","import React from 'react';\nimport { View, Text, StyleSheet, TouchableOpacity } from 'react-native';\nimport type { LabReportRowItem } from '../types/labReports';\nimport { Tag } from '@data-oil-front/ui-mobile';\n\nexport interface LabReportCardProps {\n  item: LabReportRowItem;\n  status: 'pending' | 'done';\n  onPress?: (item: LabReportRowItem) => void;\n}\n\nexport default function LabReportCard({ item, status, onPress }: LabReportCardProps) {\n  return (\n    <TouchableOpacity\n      style={styles.card}\n      activeOpacity={0.85}\n      onPress={() => onPress?.(item)}\n    >\n      <View style={[styles.header]}>\n        <View style={styles.titleWrap}>\n          <Text style={styles.installationTitle} numberOfLines={2} ellipsizeMode=\"tail\">Instalación: <Text style={styles.installationType}>{item.Instalación}</Text></Text>\n        </View>\n        <Tag\n          label={status === 'pending' ? 'Pendiente' : 'Completado'}\n          backgroundColor={status === 'pending' ? '#FEF3C7' : '#D1FAE5'}\n          textColor={status === 'pending' ? '#92400E' : '#065F46'}\n          size=\"small\"\n          style={styles.statusPill}\n        />\n      </View>\n\n      <View style={styles.row}> \n        <Text style={styles.label}>Nombre de Instalación:</Text>\n        <Text style={styles.value}>{item['Nombre de Instalación']}</Text>\n      </View>\n      {item['%AyS'] ? (\n        <View style={styles.row}> \n          <Text style={styles.label}>% Ay S:</Text>\n          <Text style={styles.value}>{item['%AyS']}</Text>\n        </View>\n      ) : null}\n      {item['°API'] ? (\n        <View style={styles.row}> \n          <Text style={styles.label}>° A P I:</Text>\n          <Text style={styles.value}>{item['°API']}</Text>\n        </View>\n      ) : null}\n      <View style={styles.row}> \n        <Text style={styles.label}>Fecha:</Text>\n        <Text style={styles.value}>{item.Fecha}</Text>\n      </View>\n    </TouchableOpacity>\n  );\n}\n\nconst styles = StyleSheet.create({\n  card: {\n    backgroundColor: '#FFFFFF',\n    borderWidth: 1,\n    borderColor: '#E5E7EB',\n    borderRadius: 14,\n    padding: 14,\n    gap: 8,\n    shadowColor: '#0F172A',\n    shadowOpacity: 0.06,\n    shadowRadius: 8,\n    shadowOffset: { width: 0, height: 4 },\n    elevation: 2,\n  },\n  cardDone: {\n    borderLeftWidth: 4,\n    borderLeftColor: '#10B981',\n  },\n  cardPending: {\n    borderLeftWidth: 4,\n    borderLeftColor: '#F59E0B',\n  },\n  header: {\n    flexDirection: 'row',\n    alignItems: 'flex-start',\n    justifyContent: 'space-between',\n    marginBottom: 4,\n    backgroundColor: '#F9FAFB',\n    paddingHorizontal: 10,\n    paddingVertical: 8,\n    borderRadius: 10,\n  },\n  titleWrap: {\n    flex: 1,\n    paddingRight: 12,\n  },\n  installationTitle: {\n    color: '#111827',\n    fontSize: 16,\n    fontWeight: '700',\n    flexShrink: 1,\n  },\n  installationType: {\n    fontWeight: '700',\n  },\n  row: {\n    flexDirection: 'row',\n    alignItems: 'flex-start',\n    justifyContent: 'space-between',\n    gap: 8,\n    paddingVertical: 6,\n    borderTopWidth: 1,\n    borderTopColor: '#F3F4F6',\n  },\n  label: {\n    color: '#6B7280',\n    fontSize: 14,\n    flex: 1,\n  },\n  value: {\n    color: '#0F172A',\n    fontSize: 15,\n    fontWeight: '700',\n    flex: 1,\n    textAlign: 'right',\n    flexShrink: 1,\n  },\n  statusPill: {\n    alignSelf: 'flex-start',\n    marginLeft: 8,\n  },\n});\n\n\n","import { useCallback, useMemo, useRef, useState } from 'react';\nimport dayjs from 'dayjs';\nimport type { LabReport } from '../types/labReports';\nimport { fetchReportsHistoryWindow, fetchReportsCount } from '../services/labReports.api';\nimport { resolveFacilityTypeFromTable } from '../utils/labReports.mappers';\n\nconst INITIAL_WINDOW_MONTHS = 2;\nconst LOAD_MORE_WINDOW_MONTHS = 1;\nconst MAX_EMPTY_WINDOWS_PER_LOAD = 12;\n\nexport interface InfiniteFilters {\n  installationType?: string | null;\n  dateRange?: { startDate: Date | null; endDate: Date | null } | null;\n}\n\nfunction uniqById(items: LabReport[]): LabReport[] {\n  const map = new Map<number, LabReport>();\n  for (const it of items) {\n    map.set(it.id, it);\n  }\n  return Array.from(map.values()).sort(\n    (a, b) =>\n      new Date(b.date_created).getTime() - new Date(a.date_created).getTime(),\n  );\n}\n\nexport function useInfiniteReports() {\n  const [items, setItems] = useState<LabReport[]>([]);\n  const [totalCount, setTotalCount] = useState<number>(0);\n  const [totalFilteredCount, setTotalFilteredCount] = useState<number>(0);\n  const [loadingInitial, setLoadingInitial] = useState(false);\n  const [loadingMore, setLoadingMore] = useState(false);\n  const [error, setError] = useState<Error | null>(null);\n  const [loadedOnce, setLoadedOnce] = useState(false);\n  const [exhausted, setExhausted] = useState(false);\n\n  const currentFiltersRef = useRef<InfiniteFilters>({});\n\n  const cursorToRef = useRef<Date>(new Date());\n\n  const lastRequestIdRef = useRef(0);\n\n  const hasMore = useMemo(\n    () => !exhausted && items.length < totalFilteredCount,\n    [exhausted, items.length, totalFilteredCount],\n  );\n\n  const loadWindow = useCallback(\n    async (fromISO: string, toISO: string, facilityType?: string | null) => {\n      const res = await fetchReportsHistoryWindow({\n        fromISO,\n        toISO,\n        facilityType,\n      });\n      setTotalCount(prev => Math.max(prev, res.totalTableCount ?? 0));\n      return res.result ?? [];\n    },\n    [],\n  );\n\n  const loadInitial = useCallback(\n    async (filters: InfiniteFilters = {}) => {\n      const requestId = ++lastRequestIdRef.current;\n      setLoadingInitial(true);\n      setError(null);\n      setExhausted(false);\n      currentFiltersRef.current = filters;\n      try {\n        const { dateRange, installationType } = filters;\n        const facilityType = resolveFacilityTypeFromTable(\n          installationType || undefined,\n        );\n\n        const totalFiltered = await fetchReportsCount({\n          facilityType,\n          fromISO: dateRange?.startDate ? dayjs(dateRange.startDate).startOf('day').toISOString() : undefined,\n          toISO: dateRange?.endDate ? dayjs(dateRange.endDate).endOf('day').toISOString() : undefined,\n        });\n\n        if (requestId !== lastRequestIdRef.current) return;\n        setTotalFilteredCount(totalFiltered);\n\n        let to: Date;\n        let from: Date;\n\n        if (dateRange?.startDate && dateRange?.endDate) {\n          to = dayjs(dateRange.endDate).endOf('day').toDate();\n          const rangeStart = dayjs(dateRange.startDate).startOf('day').toDate();\n          from = dayjs(to).subtract(INITIAL_WINDOW_MONTHS, 'month').toDate();\n          if (from < rangeStart) from = rangeStart;\n        } else if (dateRange?.startDate) {\n          to = new Date();\n          from = dayjs(dateRange.startDate).startOf('day').toDate();\n          const windowLimit = dayjs(to)\n            .subtract(INITIAL_WINDOW_MONTHS, 'month')\n            .toDate();\n          if (from < windowLimit) from = windowLimit;\n        } else {\n          to = new Date();\n          from = dayjs(to).subtract(INITIAL_WINDOW_MONTHS, 'month').toDate();\n        }\n\n        cursorToRef.current = to;\n\n        let windowItems = await loadWindow(\n          from.toISOString(),\n          to.toISOString(),\n          facilityType,\n        );\n\n        if (requestId !== lastRequestIdRef.current) return;\n\n        if (windowItems.length === 0 && !dateRange?.startDate) {\n          let attempts = 0;\n          let currentTo = from;\n          while (attempts < MAX_EMPTY_WINDOWS_PER_LOAD) {\n            const currentFrom = dayjs(currentTo)\n              .subtract(LOAD_MORE_WINDOW_MONTHS, 'month')\n              .toDate();\n            const moreItems = await loadWindow(\n              currentFrom.toISOString(),\n              currentTo.toISOString(),\n              facilityType,\n            );\n\n            if (requestId !== lastRequestIdRef.current) return;\n\n            if (moreItems.length > 0) {\n              windowItems = moreItems;\n              break;\n            }\n            currentTo = currentFrom;\n            attempts += 1;\n          }\n        }\n\n        setItems(uniqById(windowItems));\n        setLoadedOnce(true);\n      } catch (e) {\n        if (requestId === lastRequestIdRef.current) {\n          setError(e as Error);\n          setLoadedOnce(true);\n        }\n      } finally {\n        if (requestId === lastRequestIdRef.current) {\n          setLoadingInitial(false);\n        }\n      }\n    },\n    [loadWindow],\n  );\n\n  const loadMore = useCallback(async () => {\n    if (loadingInitial || loadingMore) return;\n    if (!hasMore) return;\n\n    const requestId = lastRequestIdRef.current;\n    setLoadingMore(true);\n    setError(null);\n    try {\n      const { dateRange, installationType } = currentFiltersRef.current;\n      const facilityType = resolveFacilityTypeFromTable(\n        installationType || undefined,\n      );\n      const rangeStart = dateRange?.startDate\n        ? dayjs(dateRange.startDate).startOf('day').toDate()\n        : null;\n\n      const last = items[items.length - 1];\n      const initialTo = last?.date_created\n        ? new Date(last.date_created)\n        : cursorToRef.current;\n\n      let to = initialTo;\n      let attempts = 0;\n\n      while (attempts < MAX_EMPTY_WINDOWS_PER_LOAD) {\n        let from = dayjs(to).subtract(LOAD_MORE_WINDOW_MONTHS, 'month').toDate();\n\n        if (rangeStart && from < rangeStart) {\n          from = rangeStart;\n        }\n\n        if (rangeStart && to <= rangeStart) {\n          setExhausted(true);\n          break;\n        }\n\n        const windowItems = await loadWindow(\n          from.toISOString(),\n          to.toISOString(),\n          facilityType,\n        );\n\n        if (requestId !== lastRequestIdRef.current) return;\n\n        if (windowItems.length > 0) {\n          setItems(prev => uniqById([...prev, ...windowItems]));\n          break;\n        }\n\n        if (items.length >= totalFilteredCount && totalFilteredCount > 0) {\n          setExhausted(true);\n          break;\n        }\n        if (rangeStart && from <= rangeStart) {\n          setExhausted(true);\n          break;\n        }\n\n        to = from;\n        attempts += 1;\n      }\n    } catch (e) {\n      if (requestId === lastRequestIdRef.current) {\n        setError(e as Error);\n      }\n    } finally {\n      if (requestId === lastRequestIdRef.current) {\n        setLoadingMore(false);\n      }\n    }\n  }, [hasMore, items, loadWindow, loadingInitial, loadingMore, totalFilteredCount]);\n\n  const reset = useCallback(() => {\n    lastRequestIdRef.current++;\n    setItems([]);\n    setTotalCount(0);\n    setTotalFilteredCount(0);\n    setLoadingInitial(false);\n    setLoadingMore(false);\n    setError(null);\n    setLoadedOnce(false);\n    setExhausted(false);\n    cursorToRef.current = new Date();\n    currentFiltersRef.current = {};\n  }, []);\n\n  return {\n    items,\n    totalCount,\n    totalFilteredCount,\n    hasMore,\n    loadingInitial,\n    loadingMore,\n    error,\n    loadedOnce,\n    loadInitial,\n    loadMore,\n    reset,\n  } as const;\n}\n","import { useCallback, useEffect, useMemo, useState } from 'react';\nimport dayjs from 'dayjs';\nimport { useNavigation } from '@react-navigation/native';\nimport { DateRange } from '@data-oil-front/ui-mobile';\nimport { LAB_REPORTS_SCREENS } from '@data-oil-front/core-utils';\nimport type {\n  Catalogs,\n  LabReport,\n  LabReportRowItem,\n} from '../types/labReports';\nimport { fetchCatalogs } from '../services/labReports.catalog.api';\nimport {\n  fetchPendingReports,\n  fetchPendingReportsRange,\n  fetchDaysWithReports,\n} from '../services/labReports.api';\nimport { formatReportRow } from '../utils/labReports.mappers';\nimport { useInfiniteReports } from './useInfiniteReports';\n\ntype Nav = ReturnType<typeof useNavigation>;\n\nexport function useLabReports() {\n  const navigation = useNavigation() as Nav;\n\n  const [pendingRange, setPendingRange] = useState<DateRange>({\n    startDate: null,\n    endDate: null,\n  });\n  const [pendingInstallationType, setPendingInstallationType] = useState<\n    string | null\n  >(null);\n\n  const [historyRange, setHistoryRange] = useState<DateRange>({\n    startDate: null,\n    endDate: null,\n  });\n  const [historyInstallationType, setHistoryInstallationType] = useState<\n    string | null\n  >(null);\n\n  const [loadingCount, setLoadingCount] = useState(0);\n  const [loadingActive, setLoadingActive] = useState(false);\n  const [catalogs, setCatalogs] = useState<Catalogs>({\n    locations: [],\n    fields: [],\n    facilitiesList: [],\n  });\n  const [active, setActive] = useState<LabReport[]>([]);\n  const [activeRows, setActiveRows] = useState<LabReportRowItem[]>([]);\n  const [historyRows, setHistoryRows] = useState<LabReportRowItem[]>([]);\n  const [daysWith, setDaysWith] = useState<string[]>([]);\n\n  const historyInfinite = useInfiniteReports();\n  const history = historyInfinite.items;\n  const historyLoaded = historyInfinite.loadedOnce;\n  const loadingHistory = historyInfinite.loadingInitial;\n  const totalCount = historyInfinite.totalCount;\n\n  const loading = useMemo(() => loadingCount > 0, [loadingCount]);\n\n  const startLoading = useCallback(() => {\n    setLoadingCount(c => c + 1);\n  }, []);\n\n  const stopLoading = useCallback(() => {\n    setLoadingCount(c => Math.max(0, c - 1));\n  }, []);\n\n  const monthKey = useMemo(\n    () => dayjs(pendingRange.startDate || undefined).format('YYYY-MM'),\n    [pendingRange.startDate],\n  );\n\n  const loadCatalogs = useCallback(async () => {\n    startLoading();\n    try {\n      const cats = await fetchCatalogs();\n      setCatalogs(cats);\n    } catch (e) {\n    } finally {\n      stopLoading();\n    }\n  }, [startLoading, stopLoading]);\n\n  const loadActiveReports = useCallback(\n    async (rangeOverride?: DateRange | null, tableOverride?: string | null) => {\n      startLoading();\n      setLoadingActive(true);\n      try {\n        const rangeToUse =\n          rangeOverride !== undefined ? rangeOverride : pendingRange;\n        const tableToUse =\n          tableOverride !== undefined\n            ? tableOverride || undefined\n            : pendingInstallationType || undefined;\n\n        if (!rangeToUse?.startDate) {\n          const pending = await fetchPendingReports(undefined, tableToUse);\n          setActive(pending);\n          return;\n        }\n\n        const startDateISO = dayjs(rangeToUse.startDate).format('YYYY-MM-DD');\n        const endDateISO = dayjs(\n          rangeToUse.endDate || rangeToUse.startDate,\n        ).format('YYYY-MM-DD');\n\n        const pending = await fetchPendingReportsRange(\n          startDateISO,\n          endDateISO,\n          tableToUse,\n        );\n        setActive(pending);\n      } catch (e) {\n      } finally {\n        setLoadingActive(false);\n        stopLoading();\n      }\n    },\n    [pendingRange, pendingInstallationType, startLoading, stopLoading],\n  );\n\n  const loadHistoryReports = useCallback(async () => {\n    startLoading();\n    try {\n      await historyInfinite.loadInitial({\n        dateRange: historyRange,\n        installationType: historyInstallationType,\n      });\n    } finally {\n      stopLoading();\n    }\n  }, [\n    historyInfinite,\n    historyRange,\n    historyInstallationType,\n    startLoading,\n    stopLoading,\n  ]);\n\n  const loadDays = useCallback(async () => {\n    startLoading();\n    try {\n      const days = await fetchDaysWithReports(monthKey);\n      setDaysWith(days);\n    } catch (e) {\n    } finally {\n      stopLoading();\n    }\n  }, [monthKey, startLoading, stopLoading]);\n\n  useEffect(() => {\n    loadCatalogs();\n    loadActiveReports();\n    loadDays();\n    // eslint-disable-next-line react-hooks/exhaustive-deps\n  }, []);\n\n  useEffect(() => {\n    loadDays();\n  }, [loadDays]);\n\n  useEffect(() => {\n    (async () => {\n      const rows = await Promise.all(\n        active.map(it =>\n          Promise.resolve(formatReportRow(it, catalogs, 'active')),\n        ),\n      );\n      setActiveRows(rows);\n    })();\n  }, [active, catalogs]);\n\n  useEffect(() => {\n    (async () => {\n      const rows = await Promise.all(\n        history.map(item =>\n          Promise.resolve(formatReportRow(item, catalogs, 'history')),\n        ),\n      );\n      setHistoryRows(rows);\n    })();\n  }, [history, catalogs]);\n\n  const applyDate = useCallback(\n    (tab: 'pending' | 'history', range?: DateRange | null) => {\n      if (tab === 'pending') {\n        if (range !== undefined && range !== null) {\n          setPendingRange(range);\n        }\n        loadActiveReports(range);\n      } else {\n        if (range !== undefined && range !== null) {\n          setHistoryRange(range);\n        }\n        historyInfinite.reset();\n        historyInfinite.loadInitial({\n          dateRange: range,\n          installationType: historyInstallationType,\n        });\n      }\n    },\n    [loadActiveReports, historyInfinite, historyInstallationType],\n  );\n\n  const clearFilter = useCallback(\n    (tab: 'pending' | 'history') => {\n      const emptyRange = { startDate: null, endDate: null };\n      if (tab === 'pending') {\n        setPendingRange(emptyRange);\n        setPendingInstallationType(null);\n        loadActiveReports(emptyRange, null);\n      } else {\n        setHistoryRange(emptyRange);\n        setHistoryInstallationType(null);\n        historyInfinite.reset();\n        historyInfinite.loadInitial({\n          dateRange: emptyRange,\n          installationType: null,\n        });\n      }\n    },\n    [loadActiveReports, historyInfinite],\n  );\n\n  const applyInstallationType = useCallback(\n    (tab: 'pending' | 'history', type: string | null) => {\n      if (tab === 'pending') {\n        setPendingInstallationType(type);\n        loadActiveReports(undefined, type);\n      } else {\n        setHistoryInstallationType(type);\n        historyInfinite.reset();\n        historyInfinite.loadInitial({\n          dateRange: historyRange,\n          installationType: type,\n        });\n      }\n    },\n    [loadActiveReports, historyInfinite, historyRange],\n  );\n\n  const refresh = useCallback(() => {\n    loadActiveReports();\n    loadDays();\n    if (historyLoaded) {\n      historyInfinite.reset();\n      loadHistoryReports();\n    }\n  }, [\n    loadActiveReports,\n    loadDays,\n    historyLoaded,\n    loadHistoryReports,\n    historyInfinite,\n  ]);\n\n  const ensureHistoryLoaded = useCallback(() => {\n    if (historyLoaded) return;\n    loadHistoryReports();\n  }, [historyLoaded, loadHistoryReports]);\n\n  const loadMoreHistory = useCallback(() => {\n    if (!historyLoaded) return;\n    historyInfinite.loadMore();\n  }, [historyInfinite, historyLoaded]);\n\n  const openActive = useCallback(\n    (row: LabReportRowItem) => {\n      const itemIdStr = String(row._itemId);\n      const [table, id] = itemIdStr.includes(':')\n        ? itemIdStr.split(':')\n        : [null, itemIdStr];\n\n      const found = active.find(\n        x =>\n          String(x.id) === id &&\n          (!table || x._table === table || determineTableForNav(x) === table),\n      );\n      if (!found) return;\n\n      const tableToUse = found._table || determineTableForNav(found);\n      // @ts-ignore\n      navigation.navigate(LAB_REPORTS_SCREENS.ACTIVE_FORM, { id: found.id, table: tableToUse });\n    },\n    [active, navigation],\n  );\n\n  const openHistory = useCallback(\n    (row: LabReportRowItem) => {\n      const itemIdStr = String(row._itemId);\n      const id = itemIdStr.includes(':') ? itemIdStr.split(':')[1] : itemIdStr;\n\n      // @ts-ignore\n      navigation.navigate(LAB_REPORTS_SCREENS.VIEW_REPORT, { id: Number(id) });\n    },\n    [navigation],\n  );\n\n  return {\n    pendingRange,\n    pendingInstallationType,\n    historyRange,\n    historyInstallationType,\n    loading,\n    loadingActive,\n    loadingHistory,\n    active,\n    history,\n    activeRows,\n    historyRows,\n    daysWithReports: daysWith,\n    catalogs,\n    historyLoaded,\n    hasMoreHistory: historyInfinite.hasMore,\n    loadingMoreHistory: historyInfinite.loadingMore,\n    historyError: historyInfinite.error,\n    totalFilteredCount: historyInfinite.totalFilteredCount,\n    applyDate,\n    applyInstallationType,\n    clearFilter,\n    refresh,\n    ensureHistoryLoaded,\n    loadMoreHistory,\n    openActive,\n    openHistory,\n    totalHistoryCount: totalCount,\n    totalHistoryFilteredCount: historyInfinite.totalFilteredCount,\n  } as const;\n}\n\nfunction determineTableForNav(item: LabReport): string {\n  if ('heading_pressure' in item) {\n    return 'daily_report_well';\n  }\n  if ('total_depth' in item) {\n    return 'daily_report_pit';\n  }\n  if ('tank_level' in item && 'oil_volume' in item) {\n    return 'daily_report_storage_tank';\n  }\n  if ('tank_level' in item && 'water_volume' in item) {\n    return 'daily_report_upt_tank';\n  }\n  if ('tank_level' in item && 'flow_station_tank_id' in item) {\n    return 'daily_report_flow_station_tank';\n  }\n  if (\n    'treatment_plant_dynamic_storage_tank_id' in item &&\n    'temperature' in item\n  ) {\n    return 'daily_report_storage_tank';\n  }\n  if ('treatment_plant_dynamic_storage_tank_id' in item) {\n    return 'daily_report_dynamic_settlement_tank';\n  }\n  if ('upt_tank_id' in item) {\n    return 'daily_report_upt_tank';\n  }\n\n  return 'daily_report_measurement_point';\n}\n","import {\n  TABLE_NAMES,\n  API_VERBS,\n  ApiPostBody,\n} from '@data-oil-front/core-utils';\nimport type {\n  Catalogs,\n  FieldItem,\n  FacilityListItem,\n  LocationItem,\n} from '../types/labReports';\nimport { configService } from '@data-oil-front/core-host';\nimport { purePost } from '@data-oil-front/core-utils';\n\nasync function post<T>(\n  body: Partial<ApiPostBody>,\n  options?: RequestInit,\n): Promise<T> {\n  const config = await configService.getEffectiveConfig();\n  const url = config?.API_BASE_URL;\n\n  if (!url) {\n    throw new Error('[API Client] API_BASE_URL is missing in config.');\n  }\n\n  const response = await purePost<T>(url, body, options);\n\n  if (!response.success) {\n    const message = 'message' in response ? response.message : 'Unknown API error';\n    throw new Error(message);\n  }\n\n  if (!('data' in response)) {\n    throw new Error('Invalid API response shape.');\n  }\n\n  return response.data as T;\n}\n\nexport async function fetchCatalogs(): Promise<Catalogs> {\n  const [locationsRes, fieldsRes, facilitiesListRes] = await Promise.all([\n    post<LocationItem[]>({\n      verb: API_VERBS.SELECT,\n      table: TABLE_NAMES.LOCATION,\n      fields: [],\n      values: [],\n      filter: [],\n    }),\n    post<FieldItem[]>({\n      verb: API_VERBS.SELECT,\n      table: TABLE_NAMES.FIELD,\n      fields: [],\n      values: [],\n      filter: [],\n    }),\n    post<FacilityListItem[]>({\n      verb: API_VERBS.SELECT,\n      table: TABLE_NAMES.GET_FACILITIES_LIST,\n      fields: [],\n      values: [],\n      filter: [],\n    }),\n  ]);\n\n  return {\n    locations: locationsRes ?? [],\n    fields: fieldsRes ?? [],\n    facilitiesList: facilitiesListRes ?? [],\n  };\n}\n"],"names":["LabReportsHomeScreen","route","useRoute","navigation","useNavigation","useTheme","primaryColor","showFilters","setShowFilters","useState","toggleFilters","useCallback","prev","pendingRange","pendingInstallationType","historyRange","historyInstallationType","activeRows","historyRows","daysWithReports","applyDate","useLabReports","applyInstallationType","clearFilter","openActive","openHistory","loadingActive","loadingHistory","totalHistoryCount","totalHistoryFilteredCount","ensureHistoryLoaded","historyLoaded","loadMoreHistory","hasMoreHistory","loadingMoreHistory","isDarkMode","useColorScheme","installationOptions","getConfiguredLabInstallationOptions","params","filter","activeTab","setActiveTab","useEffect","resetDate","setParams","undefined","currentRange","useMemo","currentInstallationType","pendingCountLabel","length","isFiltered","filters","range","type","startDate","historyCountLabel","count","currentData","currentOnPress","currentLoading","listRows","ListRow","rows","isFetching","push","state","map","item","handleTabChange","tab","handleEndReached","handleOnScrollBeginDrag","View","style","styles","container","StatusBar","barStyle","tabsHeader","tabsWrap","Pressable","accessibilityRole","onPress","pressed","tabBtn","tabBtnActive","opacity","Text","tabText","tabTextActive","stickyHeader","toggleHeader","hitSlop","sectionTitle","ChevronUpIcon","size","color","ChevronDownIcon","filtersCol","filterCol","DateRangePicker","label","value","onChange","val","onDateRangeChange","onClear","placeholder","Select","MenuItem","option","tableName","banner","bannerText","bannerStrong","daysWrap","slice","day","dayPill","dayPillText","split","FlatList","onScrollBeginDrag","data","keyboardShouldPersistTaps","keyExtractor","row","index","normalizedItemId","String","_itemId","includes","Fecha","renderItem","empty","LoadingSpinner","emptyIcon","emptyTitle","emptyText","cardWrap","status","ItemSeparatorComponent","ItemSeparator","onEndReached","onEndReachedThreshold","initialNumToRender","maxToRenderPerBatch","windowSize","ListFooterComponent","footerLoading","footerLoadingText","contentContainerStyle","showsVerticalScrollIndicator","StyleSheet","create","flex","backgroundColor","paddingHorizontal","paddingVertical","zIndex","elevation","alignItems","justifyContent","gap","paddingTop","paddingBottom","width","marginBottom","fontSize","fontWeight","padding","borderWidth","borderColor","borderRadius","flexDirection","flexWrap","sectionHeader","marginTop","listTitle","separatorStyle","height","LabReportCard","TouchableOpacity","card","activeOpacity","header","titleWrap","installationTitle","numberOfLines","ellipsizeMode","installationType","Instalación","Tag","textColor","statusPill","shadowColor","shadowOpacity","shadowRadius","shadowOffset","cardDone","borderLeftWidth","borderLeftColor","cardPending","paddingRight","flexShrink","borderTopWidth","borderTopColor","textAlign","alignSelf","marginLeft","INITIAL_WINDOW_MONTHS","LOAD_MORE_WINDOW_MONTHS","MAX_EMPTY_WINDOWS_PER_LOAD","uniqById","items","Map","it","set","id","Array","from","values","sort","a","b","Date","date_created","getTime","useInfiniteReports","setItems","totalCount","setTotalCount","totalFilteredCount","setTotalFilteredCount","loadingInitial","setLoadingInitial","loadingMore","setLoadingMore","setError","loadedOnce","setLoadedOnce","exhausted","setExhausted","currentFiltersRef","useRef","cursorToRef","lastRequestIdRef","hasMore","loadWindow","fromISO","toISO","facilityType","res","fetchReportsHistoryWindow","Math","max","totalTableCount","result","loadInitial","InfiniteFilters","requestId","current","to","dateRange","resolveFacilityTypeFromTable","totalFiltered","fetchReportsCount","dayjs","startOf","toISOString","endDate","endOf","toDate","rangeStart","subtract","windowLimit","windowItems","attempts","currentTo","currentFrom","moreItems","e","loadMore","last","reset","error","setPendingRange","setPendingInstallationType","setHistoryRange","setHistoryInstallationType","loadingCount","setLoadingCount","setLoadingActive","locations","fields","facilitiesList","catalogs","setCatalogs","active","setActive","setActiveRows","setHistoryRows","daysWith","setDaysWith","historyInfinite","history","loading","startLoading","c","stopLoading","monthKey","format","loadCatalogs","cats","fetchCatalogs","loadActiveReports","rangeOverride","tableOverride","rangeToUse","tableToUse","pending","fetchPendingReports","startDateISO","endDateISO","fetchPendingReportsRange","loadHistoryReports","loadDays","days","fetchDaysWithReports","Promise","all","resolve","formatReportRow","emptyRange","refresh","itemIdStr","table","found","find","x","_table","determineTableForNav","navigate","LAB_REPORTS_SCREENS","ACTIVE_FORM","VIEW_REPORT","Number","historyError","post","body","options","config","configService","getEffectiveConfig","url","API_BASE_URL","Error","response","purePost","success","message","verb","API_VERBS","SELECT","TABLE_NAMES","LOCATION","FIELD","GET_FACILITIES_LIST","locationsRes","fieldsRes","facilitiesListRes"],"mappings":"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"}