@pol-studios/powersync 1.0.25 → 1.0.32

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (118) hide show
  1. package/README.md +0 -1
  2. package/dist/{CacheSettingsManager-uz-kbnRH.d.ts → CacheSettingsManager-0H_7thHW.d.ts} +21 -3
  3. package/dist/attachments/index.d.ts +30 -30
  4. package/dist/attachments/index.js +13 -4
  5. package/dist/{background-sync-ChCXW-EV.d.ts → background-sync-BujnI3IR.d.ts} +1 -1
  6. package/dist/{chunk-55DKCJV4.js → chunk-2RDWLXJW.js} +408 -78
  7. package/dist/chunk-2RDWLXJW.js.map +1 -0
  8. package/dist/{chunk-P4HZA6ZT.js → chunk-4665ZSE5.js} +2 -2
  9. package/dist/chunk-4665ZSE5.js.map +1 -0
  10. package/dist/{chunk-XOY2CJ67.js → chunk-4F5B5CZ7.js} +3 -3
  11. package/dist/chunk-5WRI5ZAA.js +31 -0
  12. package/dist/{chunk-BGBQYQV3.js → chunk-65A3SYJZ.js} +193 -299
  13. package/dist/chunk-65A3SYJZ.js.map +1 -0
  14. package/dist/chunk-6SZ64KCZ.js +755 -0
  15. package/dist/chunk-6SZ64KCZ.js.map +1 -0
  16. package/dist/{chunk-YSTEESEG.js → chunk-74TBHWJ4.js} +122 -11
  17. package/dist/chunk-74TBHWJ4.js.map +1 -0
  18. package/dist/chunk-ANXWYQEJ.js +1 -0
  19. package/dist/chunk-ANXWYQEJ.js.map +1 -0
  20. package/dist/{chunk-CAB26E6F.js → chunk-C4J4MLER.js} +29 -24
  21. package/dist/chunk-C4J4MLER.js.map +1 -0
  22. package/dist/{chunk-C5ODS3XH.js → chunk-EOW7JK7Q.js} +9 -16
  23. package/dist/chunk-EOW7JK7Q.js.map +1 -0
  24. package/dist/chunk-HRAVPIAZ.js +220 -0
  25. package/dist/chunk-HRAVPIAZ.js.map +1 -0
  26. package/dist/{chunk-XAEII4ZX.js → chunk-NUGQOTEM.js} +32 -4
  27. package/dist/chunk-NUGQOTEM.js.map +1 -0
  28. package/dist/chunk-OGUFUZSY.js +5415 -0
  29. package/dist/chunk-OGUFUZSY.js.map +1 -0
  30. package/dist/{chunk-VB737IVN.js → chunk-P4D6BQ4X.js} +328 -706
  31. package/dist/chunk-P4D6BQ4X.js.map +1 -0
  32. package/dist/{chunk-CACKC6XG.js → chunk-PGEDE6IM.js} +136 -89
  33. package/dist/chunk-PGEDE6IM.js.map +1 -0
  34. package/dist/{chunk-A4IBBWGO.js → chunk-RALHHPTU.js} +1 -1
  35. package/dist/chunk-RIDSPLE5.js +42 -0
  36. package/dist/chunk-RIDSPLE5.js.map +1 -0
  37. package/dist/{chunk-Z6VOBGTU.js → chunk-UOMHWUHV.js} +2 -12
  38. package/dist/chunk-UOMHWUHV.js.map +1 -0
  39. package/dist/{chunk-WGHNIAF7.js → chunk-YONQYTVH.js} +2 -2
  40. package/dist/chunk-ZAN22NGL.js +13 -0
  41. package/dist/chunk-ZAN22NGL.js.map +1 -0
  42. package/dist/config/index.d.ts +200 -0
  43. package/dist/config/index.js +23 -0
  44. package/dist/config/index.js.map +1 -0
  45. package/dist/connector/index.d.ts +23 -5
  46. package/dist/connector/index.js +4 -2
  47. package/dist/core/index.d.ts +2 -2
  48. package/dist/core/index.js +1 -0
  49. package/dist/error/index.js +1 -0
  50. package/dist/generator/index.js +2 -0
  51. package/dist/generator/index.js.map +1 -1
  52. package/dist/index.d.ts +19 -16
  53. package/dist/index.js +88 -46
  54. package/dist/index.native.d.ts +18 -14
  55. package/dist/index.native.js +93 -44
  56. package/dist/index.web.d.ts +17 -14
  57. package/dist/index.web.js +88 -46
  58. package/dist/maintenance/index.d.ts +2 -2
  59. package/dist/maintenance/index.js +3 -2
  60. package/dist/platform/index.d.ts +1 -1
  61. package/dist/platform/index.js +2 -0
  62. package/dist/platform/index.js.map +1 -1
  63. package/dist/platform/index.native.d.ts +1 -1
  64. package/dist/platform/index.native.js +1 -0
  65. package/dist/platform/index.web.d.ts +1 -1
  66. package/dist/platform/index.web.js +1 -0
  67. package/dist/pol-attachment-queue-DqBvLAEY.d.ts +255 -0
  68. package/dist/provider/index.d.ts +319 -124
  69. package/dist/provider/index.js +21 -16
  70. package/dist/provider/index.native.d.ts +108 -0
  71. package/dist/provider/index.native.js +121 -0
  72. package/dist/provider/index.native.js.map +1 -0
  73. package/dist/provider/index.web.d.ts +16 -0
  74. package/dist/provider/index.web.js +112 -0
  75. package/dist/provider/index.web.js.map +1 -0
  76. package/dist/react/index.d.ts +16 -65
  77. package/dist/react/index.js +2 -9
  78. package/dist/storage/index.d.ts +5 -4
  79. package/dist/storage/index.js +12 -9
  80. package/dist/storage/index.native.d.ts +5 -4
  81. package/dist/storage/index.native.js +8 -5
  82. package/dist/storage/index.web.d.ts +5 -4
  83. package/dist/storage/index.web.js +11 -8
  84. package/dist/storage/upload/index.d.ts +4 -3
  85. package/dist/storage/upload/index.js +4 -2
  86. package/dist/storage/upload/index.native.d.ts +4 -3
  87. package/dist/storage/upload/index.native.js +4 -2
  88. package/dist/storage/upload/index.web.d.ts +2 -1
  89. package/dist/storage/upload/index.web.js +4 -2
  90. package/dist/{supabase-connector-D2oIl2t8.d.ts → supabase-connector-HMxBA9Kg.d.ts} +23 -25
  91. package/dist/sync/index.d.ts +183 -11
  92. package/dist/sync/index.js +13 -3
  93. package/dist/{types-CyvBaAl8.d.ts → types-6QHGELuY.d.ts} +4 -1
  94. package/dist/{types-CDqWh56B.d.ts → types-B9MptP7E.d.ts} +13 -1
  95. package/dist/types-BhAEsJj-.d.ts +330 -0
  96. package/dist/{types-D0WcHrq6.d.ts → types-CGMibJKD.d.ts} +8 -0
  97. package/dist/{types-DiBvmGEi.d.ts → types-DqJnP50o.d.ts} +22 -24
  98. package/dist/{pol-attachment-queue-BE2HU3Us.d.ts → types-JCEhw2Lf.d.ts} +139 -346
  99. package/package.json +18 -4
  100. package/dist/chunk-24RDMMCL.js +0 -44
  101. package/dist/chunk-24RDMMCL.js.map +0 -1
  102. package/dist/chunk-55DKCJV4.js.map +0 -1
  103. package/dist/chunk-654ERHA7.js +0 -1
  104. package/dist/chunk-BGBQYQV3.js.map +0 -1
  105. package/dist/chunk-C5ODS3XH.js.map +0 -1
  106. package/dist/chunk-CAB26E6F.js.map +0 -1
  107. package/dist/chunk-CACKC6XG.js.map +0 -1
  108. package/dist/chunk-P4HZA6ZT.js.map +0 -1
  109. package/dist/chunk-TIFL2KWE.js +0 -358
  110. package/dist/chunk-TIFL2KWE.js.map +0 -1
  111. package/dist/chunk-VB737IVN.js.map +0 -1
  112. package/dist/chunk-XAEII4ZX.js.map +0 -1
  113. package/dist/chunk-YSTEESEG.js.map +0 -1
  114. package/dist/chunk-Z6VOBGTU.js.map +0 -1
  115. /package/dist/{chunk-XOY2CJ67.js.map → chunk-4F5B5CZ7.js.map} +0 -0
  116. /package/dist/{chunk-654ERHA7.js.map → chunk-5WRI5ZAA.js.map} +0 -0
  117. /package/dist/{chunk-A4IBBWGO.js.map → chunk-RALHHPTU.js.map} +0 -0
  118. /package/dist/{chunk-WGHNIAF7.js.map → chunk-YONQYTVH.js.map} +0 -0
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/provider/OfflineDataProvider.tsx"],"sourcesContent":["import { c as _c } from \"react/compiler-runtime\";\n/**\n * OfflineDataProvider Component for @pol-studios/powersync\n *\n * Batteries-included offline data provider that combines:\n * - PowerSyncProvider for offline-first data sync\n * - DataLayerProvider integration from @pol-studios/db\n * - ConflictProvider for conflict resolution UI\n * - StorageQueueProvider for attachment queue access\n * - Background sync system setup\n * - Error recovery UI with retry capability\n * - Online-only mode fallback (no PowerSync URL)\n *\n * @example\n * ```tsx\n * <OfflineDataProvider\n * config={{\n * schema: AppSchema,\n * supabaseClient: supabase,\n * queryClient: queryClient,\n * powerSyncUrl: env.powerSyncUrl,\n * attachments: {\n * source: { type: 'supabase-bucket', bucket: 'my-bucket' },\n * watchPaths: (db, supabase, onUpdate) => {\n * db.watch(\n * // Filter directly in the query - only emit paths you want to download\n * `SELECT storagePath FROM photos\n * WHERE storagePath IS NOT NULL\n * AND storagePath NOT LIKE '%.mp4'`,\n * [],\n * { onResult: (r) => onUpdate(r.rows._array.map(x => x.storagePath)) }\n * );\n * },\n * },\n * }}\n * dataLayer={{ config: dataLayerConfig }}\n * renderInitError={(error, retry) => <MyErrorUI error={error} onRetry={retry} />}\n * >\n * <App />\n * </OfflineDataProvider>\n * ```\n */\n\nimport React, { useCallback, useEffect, useMemo, useRef, useState } from 'react';\nimport { View, Text, StyleSheet, Pressable } from 'react-native';\nimport type { CrudEntry, AbstractPowerSyncDatabase } from '../core/types';\nimport type { OfflineDataProviderProps, OfflineDataAttachmentConfig, PowerSyncSyncStatusSnapshot, BackgroundSyncConfig } from './OfflineDataProvider.types';\nimport type { BackgroundSyncSystem } from '../sync/background-sync';\nimport { DataLayerProvider } from '@pol-studios/db';\n\n/**\n * SyncControl interface matching @pol-studios/db DataLayerProvider expectations.\n * This is defined locally to avoid circular dependencies.\n */\ninterface DataLayerSyncControl {\n triggerSync: () => Promise<void>;\n startLiveSync: () => Promise<void>;\n stopLiveSync: () => void;\n setScope: (scopeName: string, values: string[]) => Promise<void>;\n retryFailedUploads?: () => Promise<void>;\n clearFailedUploads?: () => void;\n failedUploads?: unknown[];\n addPendingMutation: (entry: {\n id: string;\n table: string;\n op: string;\n opData?: unknown;\n createdAt?: Date;\n }) => void;\n removePendingMutation: (id: string) => void;\n}\nimport { PowerSyncProvider } from './PowerSyncProvider';\nimport { PowerSyncErrorBoundary } from '../error';\nimport { createNativePlatformAdapter } from '../platform/index.native';\nimport type { LoggerAdapter, PlatformAdapter } from '../platform/types';\nimport { ProviderBridge } from './ProviderBridge';\nimport { createSupabaseUploadHandler } from '../storage/upload/index.native';\n\n// ─── Default Logger ───────────────────────────────────────────────────────────\n\n/**\n * Default console logger for when no platform is provided.\n */\nconst defaultLogger: LoggerAdapter = {\n debug: (...args) => console.debug('[OfflineData]', ...args),\n info: (...args) => console.info('[OfflineData]', ...args),\n warn: (...args) => console.warn('[OfflineData]', ...args),\n error: (...args) => console.error('[OfflineData]', ...args)\n};\n\n// ─── Error Recovery UI Styles ─────────────────────────────────────────────────\n\nconst errorStyles = StyleSheet.create({\n container: {\n flex: 1,\n justifyContent: 'center',\n alignItems: 'center',\n backgroundColor: '#f5f5f5',\n padding: 20\n },\n content: {\n backgroundColor: 'white',\n borderRadius: 12,\n padding: 24,\n maxWidth: 400,\n width: '100%',\n shadowColor: '#000',\n shadowOffset: {\n width: 0,\n height: 2\n },\n shadowOpacity: 0.1,\n shadowRadius: 8,\n elevation: 4\n },\n title: {\n fontSize: 20,\n fontWeight: '600',\n color: '#1a1a1a',\n marginBottom: 12,\n textAlign: 'center'\n },\n message: {\n fontSize: 14,\n color: '#666',\n marginBottom: 16,\n textAlign: 'center',\n lineHeight: 20\n },\n errorDetail: {\n fontSize: 12,\n color: '#999',\n marginBottom: 20,\n textAlign: 'center',\n fontFamily: 'monospace'\n },\n retryButton: {\n backgroundColor: '#007AFF',\n borderRadius: 8,\n paddingVertical: 12,\n paddingHorizontal: 24,\n alignItems: 'center'\n },\n retryButtonText: {\n color: 'white',\n fontSize: 16,\n fontWeight: '600'\n }\n});\n\n// ─── Default Error Recovery UI ───────────────────────────────────────────────\n\n/**\n * Default error recovery UI shown when initialization fails.\n */\nfunction DefaultErrorRecoveryUI(t0) {\n const $ = _c(10);\n const {\n error,\n onRetry\n } = t0;\n let t1;\n let t2;\n if ($[0] === Symbol.for(\"react.memo_cache_sentinel\")) {\n t1 = <Text style={errorStyles.title}>Database Error</Text>;\n t2 = <Text style={errorStyles.message}>The local database encountered an error. This can happen if the app was interrupted during startup.</Text>;\n $[0] = t1;\n $[1] = t2;\n } else {\n t1 = $[0];\n t2 = $[1];\n }\n let t3;\n if ($[2] !== error.message) {\n t3 = <Text style={errorStyles.errorDetail}>{error.message}</Text>;\n $[2] = error.message;\n $[3] = t3;\n } else {\n t3 = $[3];\n }\n let t4;\n if ($[4] === Symbol.for(\"react.memo_cache_sentinel\")) {\n t4 = <Text style={errorStyles.retryButtonText}>Retry</Text>;\n $[4] = t4;\n } else {\n t4 = $[4];\n }\n let t5;\n if ($[5] !== onRetry) {\n t5 = <Pressable style={errorStyles.retryButton} onPress={onRetry}>{t4}</Pressable>;\n $[5] = onRetry;\n $[6] = t5;\n } else {\n t5 = $[6];\n }\n let t6;\n if ($[7] !== t3 || $[8] !== t5) {\n t6 = <View style={errorStyles.container}><View style={errorStyles.content}>{t1}{t2}{t3}{t5}</View></View>;\n $[7] = t3;\n $[8] = t5;\n $[9] = t6;\n } else {\n t6 = $[9];\n }\n return t6;\n}\n\n// ─── Main Provider Component ──────────────────────────────────────────────────\n\n/**\n * Batteries-included offline data provider.\n *\n * Combines PowerSyncProvider with error boundary, DataLayerProvider integration,\n * and sensible defaults for a complete offline-first data solution.\n *\n * Key features:\n * - Automatic PowerSync setup and initialization\n * - Integration with @pol-studios/db DataLayerProvider\n * - ConflictProvider and StorageQueueProvider wiring\n * - Background sync system support\n * - Error recovery UI with retry capability\n * - Online-only mode fallback when no PowerSync URL is provided\n *\n * @example\n * ```tsx\n * // Basic usage\n * <OfflineDataProvider\n * config={{\n * schema: AppSchema,\n * supabaseClient: supabase,\n * queryClient: queryClient,\n * powerSyncUrl: process.env.EXPO_PUBLIC_POWERSYNC_URL,\n * }}\n * >\n * <App />\n * </OfflineDataProvider>\n *\n * // With DataLayer integration\n * <OfflineDataProvider\n * config={{ ... }}\n * dataLayer={{ config: dataLayerConfig }}\n * >\n * <App />\n * </OfflineDataProvider>\n *\n * // With custom error UI\n * <OfflineDataProvider\n * config={{ ... }}\n * renderInitError={(error, retry) => <MyErrorUI error={error} onRetry={retry} />}\n * >\n * <App />\n * </OfflineDataProvider>\n * ```\n */\nexport function OfflineDataProvider(t0) {\n const $ = _c(132);\n const {\n config,\n polConfig,\n supabaseClient: polConfigSupabase,\n queryClient: polConfigQueryClient,\n children,\n dataLayer,\n backgroundSync,\n skipConflictProvider: t1,\n skipStorageQueueProvider: t2,\n storageBackend,\n platform: customPlatformProp,\n attachments: attachmentsOverride,\n renderInitError,\n renderError,\n onReady,\n onError,\n onSyncStatusChange,\n onBackgroundSyncSystemReady: onBackgroundSyncSystemReadyProp\n } = t0;\n const skipConflictProvider = t1 === undefined ? false : t1;\n const skipStorageQueueProvider = t2 === undefined ? false : t2;\n let t3;\n bb0: {\n if (polConfig) {\n if (!polConfigSupabase) {\n throw new Error(\"[OfflineDataProvider] supabaseClient is required when using polConfig\");\n }\n if (!polConfigQueryClient) {\n throw new Error(\"[OfflineDataProvider] queryClient is required when using polConfig\");\n }\n let t4;\n if ($[0] !== attachmentsOverride?.watchPaths || $[1] !== polConfig.attachments) {\n t4 = polConfig.attachments ? {\n source: polConfig.attachments.source,\n watchPaths: attachmentsOverride?.watchPaths ?? polConfig.attachments.watchPaths\n } : undefined;\n $[0] = attachmentsOverride?.watchPaths;\n $[1] = polConfig.attachments;\n $[2] = t4;\n } else {\n t4 = $[2];\n }\n const attachmentsConfig = t4;\n const t5 = polConfig.dbFilename ?? \"powersync.db\";\n let t6;\n if ($[3] !== polConfig.__schemaRouter || $[4] !== polConfig.connector) {\n t6 = polConfig.connector ? {\n schemaRouter: polConfig.__schemaRouter,\n conflictDetection: polConfig.connector.conflictDetection ? {\n enabled: polConfig.connector.conflictDetection\n } : undefined,\n uploadErrorMiddleware: polConfig.connector.uploadErrorMiddleware\n } : {\n schemaRouter: polConfig.__schemaRouter\n };\n $[3] = polConfig.__schemaRouter;\n $[4] = polConfig.connector;\n $[5] = t6;\n } else {\n t6 = $[5];\n }\n let t7;\n if ($[6] !== polConfig.sync) {\n t7 = polConfig.sync ? {\n autoConnect: polConfig.sync.autoConnect,\n enableHealthMonitoring: polConfig.sync.enableHealthMonitoring,\n enableMetrics: polConfig.sync.enableMetrics\n } : undefined;\n $[6] = polConfig.sync;\n $[7] = t7;\n } else {\n t7 = $[7];\n }\n const t8 = polConfig.sync?.backgroundSync;\n let t9;\n if ($[8] !== attachmentsConfig || $[9] !== customPlatformProp || $[10] !== polConfig.__generatedSchema || $[11] !== polConfig.powerSyncUrl || $[12] !== polConfigQueryClient || $[13] !== polConfigSupabase || $[14] !== t5 || $[15] !== t6 || $[16] !== t7 || $[17] !== t8) {\n t9 = {\n schema: polConfig.__generatedSchema,\n supabaseClient: polConfigSupabase,\n queryClient: polConfigQueryClient,\n powerSyncUrl: polConfig.powerSyncUrl,\n dbFilename: t5,\n attachments: attachmentsConfig,\n platform: customPlatformProp,\n connector: t6,\n sync: t7,\n backgroundSyncFromPolConfig: t8\n };\n $[8] = attachmentsConfig;\n $[9] = customPlatformProp;\n $[10] = polConfig.__generatedSchema;\n $[11] = polConfig.powerSyncUrl;\n $[12] = polConfigQueryClient;\n $[13] = polConfigSupabase;\n $[14] = t5;\n $[15] = t6;\n $[16] = t7;\n $[17] = t8;\n $[18] = t9;\n } else {\n t9 = $[18];\n }\n t3 = t9;\n break bb0;\n }\n if (!config) {\n throw new Error(\"[OfflineDataProvider] Either config or polConfig is required\");\n }\n const t4 = config.dbFilename ?? \"powersync.db\";\n const t5 = customPlatformProp ?? config.platform;\n let t6;\n if ($[19] !== config.attachments || $[20] !== config.connector || $[21] !== config.powerSyncUrl || $[22] !== config.queryClient || $[23] !== config.schema || $[24] !== config.supabaseClient || $[25] !== config.sync || $[26] !== t4 || $[27] !== t5) {\n t6 = {\n schema: config.schema,\n supabaseClient: config.supabaseClient,\n queryClient: config.queryClient,\n powerSyncUrl: config.powerSyncUrl,\n dbFilename: t4,\n attachments: config.attachments,\n platform: t5,\n connector: config.connector,\n sync: config.sync,\n backgroundSyncFromPolConfig: undefined\n };\n $[19] = config.attachments;\n $[20] = config.connector;\n $[21] = config.powerSyncUrl;\n $[22] = config.queryClient;\n $[23] = config.schema;\n $[24] = config.supabaseClient;\n $[25] = config.sync;\n $[26] = t4;\n $[27] = t5;\n $[28] = t6;\n } else {\n t6 = $[28];\n }\n t3 = t6;\n }\n const resolvedConfig = t3;\n const {\n schema,\n supabaseClient,\n queryClient,\n powerSyncUrl,\n dbFilename,\n attachments,\n platform: customPlatform,\n connector: connectorConfig,\n sync: syncConfig,\n backgroundSyncFromPolConfig\n } = resolvedConfig;\n let t4;\n if ($[29] !== backgroundSync || $[30] !== backgroundSyncFromPolConfig) {\n t4 = backgroundSync ?? (backgroundSyncFromPolConfig ? {\n enabled: backgroundSyncFromPolConfig.enabled,\n minimumInterval: backgroundSyncFromPolConfig.minimumInterval\n } : undefined);\n $[29] = backgroundSync;\n $[30] = backgroundSyncFromPolConfig;\n $[31] = t4;\n } else {\n t4 = $[31];\n }\n const effectiveBackgroundSync = t4;\n const [initError, setInitError] = useState(null);\n const [retryKey, setRetryKey] = useState(0);\n const [powerSyncInstance, setPowerSyncInstance] = useState(null);\n const [powerSyncSyncStatus, setPowerSyncSyncStatus] = useState(undefined);\n const addPendingMutationRef = useRef(null);\n const removePendingMutationRef = useRef(null);\n const backgroundSyncSystemRef = useRef(null);\n let t5;\n if ($[32] !== customPlatform) {\n t5 = customPlatform ?? createNativePlatformAdapter(defaultLogger);\n $[32] = customPlatform;\n $[33] = t5;\n } else {\n t5 = $[33];\n }\n const platform = t5;\n let t10;\n let t11;\n let t6;\n let t7;\n let t8;\n let t9;\n if ($[34] !== platform.logger) {\n t6 = async () => {\n platform.logger.warn(\"Sync not available: Use useSyncControl from PowerSync context\");\n };\n t7 = async () => {\n platform.logger.warn(\"Live sync not available: Use useSyncControl from PowerSync context\");\n };\n t8 = () => {\n platform.logger.warn(\"Live sync not available: Use useSyncControl from PowerSync context\");\n };\n t9 = async () => {\n platform.logger.warn(\"Scope control not available: Use useSyncControl from PowerSync context\");\n };\n t10 = async () => {\n platform.logger.warn(\"Retry not available: Use useSyncControl from PowerSync context\");\n };\n t11 = () => {\n platform.logger.warn(\"Clear failed uploads not available: Use useSyncControl from PowerSync context\");\n };\n $[34] = platform.logger;\n $[35] = t10;\n $[36] = t11;\n $[37] = t6;\n $[38] = t7;\n $[39] = t8;\n $[40] = t9;\n } else {\n t10 = $[35];\n t11 = $[36];\n t6 = $[37];\n t7 = $[38];\n t8 = $[39];\n t9 = $[40];\n }\n let t12;\n let t13;\n let t14;\n if ($[41] === Symbol.for(\"react.memo_cache_sentinel\")) {\n t12 = [];\n t13 = entry => {\n if (addPendingMutationRef.current) {\n addPendingMutationRef.current(entry as CrudEntry);\n }\n };\n t14 = id => {\n if (removePendingMutationRef.current) {\n removePendingMutationRef.current(id);\n }\n };\n $[41] = t12;\n $[42] = t13;\n $[43] = t14;\n } else {\n t12 = $[41];\n t13 = $[42];\n t14 = $[43];\n }\n let t15;\n if ($[44] !== t10 || $[45] !== t11 || $[46] !== t6 || $[47] !== t7 || $[48] !== t8 || $[49] !== t9) {\n t15 = {\n triggerSync: t6,\n startLiveSync: t7,\n stopLiveSync: t8,\n setScope: t9,\n retryFailedUploads: t10,\n clearFailedUploads: t11,\n failedUploads: t12,\n addPendingMutation: t13,\n removePendingMutation: t14\n };\n $[44] = t10;\n $[45] = t11;\n $[46] = t6;\n $[47] = t7;\n $[48] = t8;\n $[49] = t9;\n $[50] = t15;\n } else {\n t15 = $[50];\n }\n const syncControl = t15;\n let t16;\n bb1: {\n if (!attachments) {\n t16 = undefined;\n break bb1;\n }\n const fullAttachments = attachments as OfflineDataAttachmentConfig;\n const bucket = fullAttachments.source?.type === \"supabase-bucket\" ? fullAttachments.source.bucket : undefined;\n let t17;\n if ($[51] !== bucket || $[52] !== storageBackend || $[53] !== supabaseClient) {\n t17 = supabaseClient && bucket ? createSupabaseUploadHandler(supabaseClient, {\n defaultBucket: bucket,\n resolver: storageBackend?.resolveBucket?.bind(storageBackend)\n }) : undefined;\n $[51] = bucket;\n $[52] = storageBackend;\n $[53] = supabaseClient;\n $[54] = t17;\n } else {\n t17 = $[54];\n }\n const nativeUploadHandler = t17;\n const t18 = storageBackend as unknown as import('../attachments/types').AttachmentStorageAdapter;\n let t19;\n if ($[55] !== fullAttachments.compression || $[56] !== fullAttachments.download || $[57] !== fullAttachments.maxCacheBytes || $[58] !== fullAttachments.onUploadComplete || $[59] !== fullAttachments.onUploadFailed || $[60] !== fullAttachments.source || $[61] !== fullAttachments.watchPaths || $[62] !== nativeUploadHandler || $[63] !== t18) {\n t19 = {\n source: fullAttachments.source,\n watchPaths: fullAttachments.watchPaths,\n onUploadComplete: fullAttachments.onUploadComplete,\n onUploadFailed: fullAttachments.onUploadFailed,\n maxCacheBytes: fullAttachments.maxCacheBytes,\n compression: fullAttachments.compression,\n download: fullAttachments.download,\n remoteStorage: t18,\n uploadHandler: nativeUploadHandler\n };\n $[55] = fullAttachments.compression;\n $[56] = fullAttachments.download;\n $[57] = fullAttachments.maxCacheBytes;\n $[58] = fullAttachments.onUploadComplete;\n $[59] = fullAttachments.onUploadFailed;\n $[60] = fullAttachments.source;\n $[61] = fullAttachments.watchPaths;\n $[62] = nativeUploadHandler;\n $[63] = t18;\n $[64] = t19;\n } else {\n t19 = $[64];\n }\n t16 = t19;\n }\n const attachmentConfig = t16;\n const t17 = powerSyncUrl ?? \"\";\n const t18 = syncConfig?.autoConnect ?? true;\n const t19 = syncConfig?.enableHealthMonitoring ?? true;\n const t20 = syncConfig?.enableMetrics ?? true;\n let t21;\n if ($[65] !== t18 || $[66] !== t19 || $[67] !== t20) {\n t21 = {\n autoConnect: t18,\n enableHealthMonitoring: t19,\n enableMetrics: t20\n };\n $[65] = t18;\n $[66] = t19;\n $[67] = t20;\n $[68] = t21;\n } else {\n t21 = $[68];\n }\n let t22;\n if ($[69] !== attachmentConfig || $[70] !== connectorConfig || $[71] !== dbFilename || $[72] !== platform || $[73] !== queryClient || $[74] !== schema || $[75] !== supabaseClient || $[76] !== t17 || $[77] !== t21) {\n t22 = {\n platform,\n schema,\n powerSyncUrl: t17,\n supabaseClient,\n queryClient,\n dbFilename,\n connector: connectorConfig,\n attachments: attachmentConfig,\n sync: t21\n };\n $[69] = attachmentConfig;\n $[70] = connectorConfig;\n $[71] = dbFilename;\n $[72] = platform;\n $[73] = queryClient;\n $[74] = schema;\n $[75] = supabaseClient;\n $[76] = t17;\n $[77] = t21;\n $[78] = t22;\n } else {\n t22 = $[78];\n }\n const powerSyncConfig = t22;\n let t23;\n if ($[79] !== onError || $[80] !== platform.logger) {\n t23 = err => {\n platform.logger.error(\"PowerSync error:\", err);\n const errorMessage = err.message ?? \"\";\n if (errorMessage.includes(\"not open\") || errorMessage.includes(\"closed\") || errorMessage.includes(\"failed to open\") || errorMessage.includes(\"initialization failed\")) {\n setInitError(err);\n }\n onError?.(err);\n };\n $[79] = onError;\n $[80] = platform.logger;\n $[81] = t23;\n } else {\n t23 = $[81];\n }\n const handlePowerSyncError = t23;\n let t24;\n if ($[82] !== platform.logger) {\n t24 = () => {\n platform.logger.info(\"Retrying PowerSync initialization...\");\n setInitError(null);\n setRetryKey(_temp);\n };\n $[82] = platform.logger;\n $[83] = t24;\n } else {\n t24 = $[83];\n }\n const handleRetry = t24;\n let t25;\n if ($[84] !== effectiveBackgroundSync || $[85] !== onBackgroundSyncSystemReadyProp || $[86] !== platform.logger) {\n t25 = system => {\n backgroundSyncSystemRef.current = system;\n const bgSyncCallbacks = (effectiveBackgroundSync as BackgroundSyncConfig | undefined)?.callbacks;\n bgSyncCallbacks?.onSyncStart?.();\n onBackgroundSyncSystemReadyProp?.(system);\n platform.logger.info(\"[Background Sync] System ready\");\n };\n $[84] = effectiveBackgroundSync;\n $[85] = onBackgroundSyncSystemReadyProp;\n $[86] = platform.logger;\n $[87] = t25;\n } else {\n t25 = $[87];\n }\n const handleBackgroundSyncSystemReady = t25;\n let t26;\n if ($[88] !== renderError || $[89] !== renderInitError) {\n t26 = (error, retry) => {\n const customRenderer = renderInitError ?? renderError;\n if (customRenderer) {\n return customRenderer(error, retry);\n }\n return <DefaultErrorRecoveryUI error={error} onRetry={retry} />;\n };\n $[88] = renderError;\n $[89] = renderInitError;\n $[90] = t26;\n } else {\n t26 = $[90];\n }\n const errorFallback = t26;\n let t27;\n if ($[91] !== powerSyncSyncStatus || $[92] !== powerSyncUrl) {\n t27 = !powerSyncUrl ? {\n hasSynced: true,\n connected: true,\n connecting: false,\n isOnline: true\n } : powerSyncSyncStatus;\n $[91] = powerSyncSyncStatus;\n $[92] = powerSyncUrl;\n $[93] = t27;\n } else {\n t27 = $[93];\n }\n const effectiveSyncStatus = t27;\n let t28;\n let t29;\n if ($[94] !== effectiveSyncStatus || $[95] !== onSyncStatusChange) {\n t28 = () => {\n if (effectiveSyncStatus) {\n onSyncStatusChange?.(effectiveSyncStatus);\n }\n };\n t29 = [effectiveSyncStatus, onSyncStatusChange];\n $[94] = effectiveSyncStatus;\n $[95] = onSyncStatusChange;\n $[96] = t28;\n $[97] = t29;\n } else {\n t28 = $[96];\n t29 = $[97];\n }\n useEffect(t28, t29);\n let t30;\n let t31;\n if ($[98] !== children || $[99] !== dataLayer?.config || $[100] !== dataLayer?.skip || $[101] !== effectiveBackgroundSync || $[102] !== effectiveSyncStatus || $[103] !== errorFallback || $[104] !== handleBackgroundSyncSystemReady || $[105] !== handlePowerSyncError || $[106] !== handleRetry || $[107] !== initError || $[108] !== onReady || $[109] !== platform.logger || $[110] !== polConfig || $[111] !== powerSyncConfig || $[112] !== powerSyncInstance || $[113] !== powerSyncUrl || $[114] !== queryClient || $[115] !== renderError || $[116] !== renderInitError || $[117] !== retryKey || $[118] !== skipConflictProvider || $[119] !== skipStorageQueueProvider || $[120] !== supabaseClient || $[121] !== syncControl) {\n t31 = Symbol.for(\"react.early_return_sentinel\");\n bb2: {\n const renderContent = () => {\n if (!powerSyncUrl) {\n return <>{children}</>;\n }\n if (initError) {\n const customRenderer_0 = renderInitError ?? renderError;\n if (customRenderer_0) {\n return <>{customRenderer_0(initError, handleRetry)}</>;\n }\n return <DefaultErrorRecoveryUI error={initError} onRetry={handleRetry} />;\n }\n return <PowerSyncErrorBoundary fallback={errorFallback} onError={handlePowerSyncError}><PowerSyncProvider key={retryKey} config={powerSyncConfig as unknown as import('./types').PowerSyncConfig} onReady={() => {\n platform.logger.info(\"PowerSync initialized and ready\");\n setInitError(null);\n onReady?.();\n }} onError={handlePowerSyncError}><ProviderBridge skipConflictProvider={skipConflictProvider} skipStorageQueueProvider={skipStorageQueueProvider} backgroundSync={effectiveBackgroundSync} onBackgroundSyncSystemReady={handleBackgroundSyncSystemReady} onDbReady={(db, syncStatus) => {\n setPowerSyncInstance(db);\n setPowerSyncSyncStatus(syncStatus);\n }} onSyncStatusChange={syncStatus_0 => {\n setPowerSyncSyncStatus(syncStatus_0);\n }} onAddPendingMutationReady={add => {\n addPendingMutationRef.current = add;\n }} onRemovePendingMutationReady={remove => {\n removePendingMutationRef.current = remove;\n }}>{children}</ProviderBridge></PowerSyncProvider></PowerSyncErrorBoundary>;\n };\n let t32;\n bb3: {\n if (!polConfig) {\n t32 = null;\n break bb3;\n }\n let tables;\n if ($[124] !== polConfig.__tableStrategies) {\n tables = {};\n for (const [tableName, strategyInfo] of Object.entries(polConfig.__tableStrategies)) {\n tables[tableName] = {\n strategy: strategyInfo.strategy,\n alias: strategyInfo.alias\n };\n }\n $[124] = polConfig.__tableStrategies;\n $[125] = tables;\n } else {\n tables = $[125];\n }\n let t33;\n if ($[126] === Symbol.for(\"react.memo_cache_sentinel\")) {\n t33 = {};\n $[126] = t33;\n } else {\n t33 = $[126];\n }\n let t34;\n if ($[127] === Symbol.for(\"react.memo_cache_sentinel\")) {\n t34 = {};\n $[127] = t34;\n } else {\n t34 = $[127];\n }\n let t35;\n if ($[128] === Symbol.for(\"react.memo_cache_sentinel\")) {\n t35 = {\n syncMode: \"live\" as const\n };\n $[128] = t35;\n } else {\n t35 = $[128];\n }\n let t36;\n if ($[129] !== polConfig.databaseSchema || $[130] !== tables) {\n t36 = {\n schema: polConfig.databaseSchema,\n connections: t33,\n tables,\n scopes: t34,\n defaults: t35\n };\n $[129] = polConfig.databaseSchema;\n $[130] = tables;\n $[131] = t36;\n } else {\n t36 = $[131];\n }\n t32 = t36;\n }\n const autoGeneratedDataLayerConfig = t32;\n const effectiveDataLayerConfig = dataLayer?.config ?? autoGeneratedDataLayerConfig;\n if (__DEV__) {\n console.log(\"[OfflineDataProvider] DataLayer wrapping check:\", {\n hasPolConfig: !!polConfig,\n hasAutoGeneratedConfig: !!autoGeneratedDataLayerConfig,\n hasDataLayerConfig: !!dataLayer?.config,\n hasEffectiveConfig: !!effectiveDataLayerConfig,\n dataLayerSkip: dataLayer?.skip,\n willWrapWithDataLayer: !!effectiveDataLayerConfig && !dataLayer?.skip\n });\n }\n if (effectiveDataLayerConfig && !dataLayer?.skip) {\n t31 = <DataLayerProvider config={effectiveDataLayerConfig as any} powerSyncInstance={powerSyncInstance} supabaseClient={supabaseClient} queryClient={queryClient} powerSyncSyncStatus={effectiveSyncStatus} syncControl={syncControl}>{renderContent()}</DataLayerProvider>;\n break bb2;\n }\n t30 = renderContent();\n }\n $[98] = children;\n $[99] = dataLayer?.config;\n $[100] = dataLayer?.skip;\n $[101] = effectiveBackgroundSync;\n $[102] = effectiveSyncStatus;\n $[103] = errorFallback;\n $[104] = handleBackgroundSyncSystemReady;\n $[105] = handlePowerSyncError;\n $[106] = handleRetry;\n $[107] = initError;\n $[108] = onReady;\n $[109] = platform.logger;\n $[110] = polConfig;\n $[111] = powerSyncConfig;\n $[112] = powerSyncInstance;\n $[113] = powerSyncUrl;\n $[114] = queryClient;\n $[115] = renderError;\n $[116] = renderInitError;\n $[117] = retryKey;\n $[118] = skipConflictProvider;\n $[119] = skipStorageQueueProvider;\n $[120] = supabaseClient;\n $[121] = syncControl;\n $[122] = t30;\n $[123] = t31;\n } else {\n t30 = $[122];\n t31 = $[123];\n }\n if (t31 !== Symbol.for(\"react.early_return_sentinel\")) {\n return t31;\n }\n return t30;\n}\nfunction _temp(prev) {\n return prev + 1;\n}\nexport default OfflineDataProvider;"],"mappings":"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","names":["t4","t5","t6","t7","t8","t9","t17","t18","t19"]}
@@ -290,6 +290,31 @@ function useSyncMode() {
290
290
  }
291
291
  return t2;
292
292
  }
293
+ function useUploadRetry() {
294
+ const $ = _c(7);
295
+ const context = useSyncModeContext();
296
+ let t0;
297
+ if ($[0] !== context.discardFailedEntryAndReconnect || $[1] !== context.isWaitingForUploadRetry || $[2] !== context.manualUploadRetry || $[3] !== context.maxUploadRetriesReached || $[4] !== context.nextUploadRetryAt || $[5] !== context.uploadRetryCount) {
298
+ t0 = {
299
+ isWaiting: context.isWaitingForUploadRetry,
300
+ nextRetryAt: context.nextUploadRetryAt,
301
+ maxRetriesReached: context.maxUploadRetriesReached,
302
+ retryCount: context.uploadRetryCount,
303
+ manualRetry: context.manualUploadRetry,
304
+ discardEntryAndReconnect: context.discardFailedEntryAndReconnect
305
+ };
306
+ $[0] = context.discardFailedEntryAndReconnect;
307
+ $[1] = context.isWaitingForUploadRetry;
308
+ $[2] = context.manualUploadRetry;
309
+ $[3] = context.maxUploadRetriesReached;
310
+ $[4] = context.nextUploadRetryAt;
311
+ $[5] = context.uploadRetryCount;
312
+ $[6] = t0;
313
+ } else {
314
+ t0 = $[6];
315
+ }
316
+ return t0;
317
+ }
293
318
  function useConnectionHealth() {
294
319
  const context = useContext(ConnectionHealthContext);
295
320
  if (!context) {
@@ -470,7 +495,7 @@ function useUploadStatus() {
470
495
  failedTransactions,
471
496
  hasUploadErrors,
472
497
  permanentErrorCount,
473
- clearAllFailures
498
+ clearFailure
474
499
  } = useFailedTransactionsContext();
475
500
  const {
476
501
  triggerSync
@@ -487,19 +512,19 @@ function useUploadStatus() {
487
512
  }
488
513
  const retryAll = t0;
489
514
  let t1;
490
- if ($[2] !== clearAllFailures) {
491
- t1 = () => {
492
- clearAllFailures();
515
+ if ($[2] !== clearFailure) {
516
+ t1 = (failureId) => {
517
+ clearFailure(failureId);
493
518
  };
494
- $[2] = clearAllFailures;
519
+ $[2] = clearFailure;
495
520
  $[3] = t1;
496
521
  } else {
497
522
  t1 = $[3];
498
523
  }
499
- const dismissAll = t1;
524
+ const dismissFailure = t1;
500
525
  const t2 = permanentErrorCount > 0;
501
526
  let t3;
502
- if ($[4] !== dismissAll || $[5] !== failedTransactions || $[6] !== hasUploadErrors || $[7] !== pendingCount || $[8] !== permanentErrorCount || $[9] !== retryAll || $[10] !== t2) {
527
+ if ($[4] !== dismissFailure || $[5] !== failedTransactions || $[6] !== hasUploadErrors || $[7] !== pendingCount || $[8] !== permanentErrorCount || $[9] !== retryAll || $[10] !== t2) {
503
528
  t3 = {
504
529
  pendingCount,
505
530
  failedCount: failedTransactions.length,
@@ -508,9 +533,9 @@ function useUploadStatus() {
508
533
  hasPermanentErrors: t2,
509
534
  failedTransactions,
510
535
  retryAll,
511
- dismissAll
536
+ dismissFailure
512
537
  };
513
- $[4] = dismissAll;
538
+ $[4] = dismissFailure;
514
539
  $[5] = failedTransactions;
515
540
  $[6] = hasUploadErrors;
516
541
  $[7] = pendingCount;
@@ -634,6 +659,89 @@ function useSyncActivity() {
634
659
  }
635
660
  var useFailedTransactions = useFailedTransactionsContext;
636
661
  var useCompletedTransactions = useCompletedTransactionsContext;
662
+ var BLOCK_REASON_DESCRIPTIONS = {
663
+ offline_mode: "Offline mode enabled",
664
+ pull_only_mode: "Download-only mode enabled",
665
+ network_unreachable: "No internet connection",
666
+ auto_offline: "Went offline due to network loss",
667
+ disconnected: "Not connected to sync service",
668
+ connecting: "Connecting to sync service...",
669
+ uploading: "Upload in progress",
670
+ none: null
671
+ };
672
+ function useUploadBlockedReason() {
673
+ const $ = _c(5);
674
+ const {
675
+ syncMode,
676
+ isAutoOffline,
677
+ networkReachable
678
+ } = useSyncModeContext();
679
+ const {
680
+ uploading
681
+ } = useSyncActivityContext();
682
+ const {
683
+ connected,
684
+ connecting
685
+ } = useConnectionStatus();
686
+ let reason = "none";
687
+ if (syncMode === "offline") {
688
+ reason = isAutoOffline ? "auto_offline" : "offline_mode";
689
+ } else {
690
+ if (syncMode === "pull-only") {
691
+ reason = "pull_only_mode";
692
+ } else {
693
+ if (!networkReachable) {
694
+ reason = "network_unreachable";
695
+ } else {
696
+ if (!connected && !connecting) {
697
+ reason = "disconnected";
698
+ } else {
699
+ if (connecting) {
700
+ reason = "connecting";
701
+ } else {
702
+ if (uploading) {
703
+ reason = "uploading";
704
+ }
705
+ }
706
+ }
707
+ }
708
+ }
709
+ }
710
+ const isBlocked = reason !== "none" && reason !== "uploading";
711
+ const description = BLOCK_REASON_DESCRIPTIONS[reason];
712
+ let t0;
713
+ if ($[0] !== description || $[1] !== isBlocked || $[2] !== reason || $[3] !== uploading) {
714
+ t0 = {
715
+ isBlocked,
716
+ reason,
717
+ description,
718
+ isUploading: uploading
719
+ };
720
+ $[0] = description;
721
+ $[1] = isBlocked;
722
+ $[2] = reason;
723
+ $[3] = uploading;
724
+ $[4] = t0;
725
+ } else {
726
+ t0 = $[4];
727
+ }
728
+ return t0;
729
+ }
730
+ function useRetryCountdown() {
731
+ const $ = _c(1);
732
+ let t0;
733
+ if ($[0] === /* @__PURE__ */ Symbol.for("react.memo_cache_sentinel")) {
734
+ t0 = {
735
+ nextRetryAt: null,
736
+ timeUntilRetryMs: 0,
737
+ formattedCountdown: null
738
+ };
739
+ $[0] = t0;
740
+ } else {
741
+ t0 = $[0];
742
+ }
743
+ return t0;
744
+ }
637
745
 
638
746
  export {
639
747
  PowerSyncContext,
@@ -657,6 +765,7 @@ export {
657
765
  useSyncModeContext,
658
766
  useSyncControl,
659
767
  useSyncMode,
768
+ useUploadRetry,
660
769
  useConnectionHealth,
661
770
  useSyncMetrics,
662
771
  useAttachmentQueue,
@@ -671,6 +780,8 @@ export {
671
780
  useUploadStatus,
672
781
  useSyncActivity,
673
782
  useFailedTransactions,
674
- useCompletedTransactions
783
+ useCompletedTransactions,
784
+ useUploadBlockedReason,
785
+ useRetryCountdown
675
786
  };
676
- //# sourceMappingURL=chunk-YSTEESEG.js.map
787
+ //# sourceMappingURL=chunk-74TBHWJ4.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/provider/context.ts","../src/provider/hooks.ts"],"sourcesContent":["/**\n * React Contexts for @pol-studios/powersync\n *\n * This module creates the React contexts used by the PowerSyncProvider.\n */\n\nimport { createContext } from 'react';\nimport type { PowerSyncContextValue, SyncStatusContextValue, ConnectionHealthContextValue, SyncMetricsContextValue, ConnectionStatusContextValue, SyncActivityContextValue, PendingMutationsContextValue, FailedTransactionsContextValue, CompletedTransactionsContextValue, SyncModeContextValue } from './types';\nimport type { PolAttachmentQueue } from '../attachments/pol-attachment-queue';\n\n// ─── Main PowerSync Context ──────────────────────────────────────────────────\n\n/**\n * Main context for PowerSync database instance and related state.\n *\n * Provides access to:\n * - PowerSync database instance\n * - SupabaseConnector instance\n * - AttachmentQueue instance (if configured)\n * - Initialization state\n *\n * @example\n * ```typescript\n * const { db, isReady, error } = useContext(PowerSyncContext);\n * ```\n */\nexport const PowerSyncContext = createContext<PowerSyncContextValue | null>(null);\nPowerSyncContext.displayName = 'PowerSyncContext';\n\n// ─── Sync Status Context ─────────────────────────────────────────────────────\n\n/**\n * Context for sync status updates.\n *\n * Provides access to:\n * - Current sync status (connected, syncing, etc.)\n * - Pending mutations count\n * - Paused state\n * - Last synced timestamp\n *\n * @example\n * ```typescript\n * const { status, pendingCount, isPaused } = useContext(SyncStatusContext);\n * ```\n */\nexport const SyncStatusContext = createContext<SyncStatusContextValue | null>(null);\nSyncStatusContext.displayName = 'SyncStatusContext';\n\n// ─── Split Contexts (Performance Optimization) ───────────────────────────────\n// These focused contexts allow components to subscribe to only the data they need.\n\n/**\n * Context for connection status only.\n * Subscribe to this instead of SyncStatusContext when you only need connection state.\n */\nexport const ConnectionStatusContext = createContext<ConnectionStatusContextValue | null>(null);\nConnectionStatusContext.displayName = 'ConnectionStatusContext';\n\n/**\n * Context for sync activity (uploading/downloading).\n * Subscribe to this instead of SyncStatusContext when you only need sync progress.\n */\nexport const SyncActivityContext = createContext<SyncActivityContextValue | null>(null);\nSyncActivityContext.displayName = 'SyncActivityContext';\n\n/**\n * Context for pending mutations.\n * Subscribe to this instead of SyncStatusContext when you only need pending upload info.\n */\nexport const PendingMutationsContext = createContext<PendingMutationsContextValue | null>(null);\nPendingMutationsContext.displayName = 'PendingMutationsContext';\n\n/**\n * Context for failed transactions.\n * Subscribe to this instead of SyncStatusContext when you only need error info.\n */\nexport const FailedTransactionsContext = createContext<FailedTransactionsContextValue | null>(null);\nFailedTransactionsContext.displayName = 'FailedTransactionsContext';\n\n/**\n * Context for completed transactions.\n * Subscribe to this instead of SyncStatusContext when you only need sync history.\n */\nexport const CompletedTransactionsContext = createContext<CompletedTransactionsContextValue | null>(null);\nCompletedTransactionsContext.displayName = 'CompletedTransactionsContext';\n\n/**\n * Context for sync mode control.\n * Subscribe to this instead of SyncStatusContext when you only need sync mode.\n */\nexport const SyncModeContext = createContext<SyncModeContextValue | null>(null);\nSyncModeContext.displayName = 'SyncModeContext';\n\n// ─── Connection Health Context ───────────────────────────────────────────────\n\n/**\n * Context for connection health monitoring.\n *\n * Provides access to:\n * - Health status (healthy, degraded, disconnected)\n * - Latency measurements\n * - Health check timestamps\n * - Failure counts\n *\n * @example\n * ```typescript\n * const { health } = useContext(ConnectionHealthContext);\n * if (health.status === 'degraded') {\n * showWarning('Connection is slow');\n * }\n * ```\n */\nexport const ConnectionHealthContext = createContext<ConnectionHealthContextValue | null>(null);\nConnectionHealthContext.displayName = 'ConnectionHealthContext';\n\n// ─── Sync Metrics Context ────────────────────────────────────────────────────\n\n/**\n * Context for sync metrics and statistics.\n *\n * Provides access to:\n * - Sync operation counts\n * - Sync durations\n * - Data transfer amounts\n * - Error tracking\n *\n * @example\n * ```typescript\n * const { metrics } = useContext(SyncMetricsContext);\n * console.log(`Total syncs: ${metrics.totalSyncs}`);\n * ```\n */\nexport const SyncMetricsContext = createContext<SyncMetricsContextValue | null>(null);\nSyncMetricsContext.displayName = 'SyncMetricsContext';\n\n// ─── Attachment Queue Context ────────────────────────────────────────────────\n\n/**\n * Context for the attachment queue (if configured).\n *\n * Provides direct access to the AttachmentQueue instance for:\n * - Checking attachment sync stats\n * - Pausing/resuming downloads\n * - Getting local URIs for attachments\n *\n * @example\n * ```typescript\n * const attachmentQueue = useContext(AttachmentQueueContext);\n * if (attachmentQueue) {\n * const stats = await attachmentQueue.getStats();\n * console.log(`Downloaded: ${stats.syncedCount}/${stats.totalExpected}`);\n * }\n * ```\n */\nexport const AttachmentQueueContext = createContext<PolAttachmentQueue | null>(null);\nAttachmentQueueContext.displayName = 'AttachmentQueueContext';","import { c as _c } from \"react/compiler-runtime\";\n/**\n * React Hooks for @pol-studios/powersync\n *\n * This module provides React hooks for accessing PowerSync functionality\n * within the provider's context.\n */\n\nimport { useContext, useCallback, useMemo, useRef, useState, useEffect } from 'react';\nimport type { AbstractPowerSyncDatabase, SyncStatus, ConnectionHealth, SyncMetrics, CrudEntry, EntitySyncState, FailedTransaction, CompletedTransaction, SyncError, UploadBlockReason } from '../core/types';\nimport type { PlatformAdapter } from '../platform/types';\nimport type { PowerSyncContextValue, SyncStatusContextValue, ConnectionHealthContextValue, SyncMetricsContextValue, ConnectionStatusContextValue, SyncActivityContextValue, PendingMutationsContextValue, FailedTransactionsContextValue, CompletedTransactionsContextValue, SyncModeContextValue } from './types';\nimport type { SyncScope, SyncControlActions } from '../sync/types';\nimport type { PolAttachmentQueue } from '../attachments/pol-attachment-queue';\nimport type { SupabaseConnector } from '../connector/supabase-connector';\nimport { PowerSyncContext, SyncStatusContext, ConnectionHealthContext, SyncMetricsContext, AttachmentQueueContext, ConnectionStatusContext, SyncActivityContext, PendingMutationsContext, FailedTransactionsContext, CompletedTransactionsContext, SyncModeContext } from './context';\nimport type { SyncMode } from '../core/types';\n// Note: STORAGE_KEY_PAUSED and STORAGE_KEY_SYNC_MODE are handled by the status tracker\n\n// Track warned call sites to avoid console spam during re-renders.\n// Intentionally module-scoped: This is a dev-only debugging feature that tracks\n// which call sites have already been warned about using deprecated hooks.\n// The Set persists across React lifecycles by design to prevent duplicate warnings.\nconst warnedSyncStatusCallSites = __DEV__ ? new Set<string>() : null;\n\n// Duration to show 'synced' state after entity finishes syncing\nconst SYNCED_DISPLAY_DURATION_MS = 3000;\n\n// ─── Main Hook ───────────────────────────────────────────────────────────────\n\n/**\n * Hook to access the PowerSync database and related services.\n *\n * @returns PowerSync context value with database, connector, and state\n * @throws Error if used outside of PowerSyncProvider\n *\n * @example\n * ```typescript\n * function MyComponent() {\n * const { db, isReady, error } = usePowerSync();\n *\n * if (!isReady) return <LoadingSpinner />;\n * if (error) return <Error message={error.message} />;\n *\n * // Use db for queries\n * const users = await db.getAll('SELECT * FROM users');\n * }\n * ```\n */\nexport function usePowerSync() {\n const context = useContext(PowerSyncContext);\n if (!context) {\n throw new Error(\"usePowerSync must be used within a PowerSyncProvider\");\n }\n return context as PowerSyncContextValue<TSchema>;\n}\n\n// ─── Sync Status Hook ────────────────────────────────────────────────────────\n\n/**\n * @deprecated This hook causes re-renders on any status change.\n * Use focused hooks instead:\n *\n * | Old (useSyncStatus) | New hook |\n * |--------------------------------|-----------------------------|\n * | connected, hasSynced | useConnectionStatus() |\n * | uploading, downloading | useSyncActivityContext() |\n * | pendingCount, pendingMutations | usePendingMutationsContext()|\n * | failedTransactions | useFailedTransactions() |\n * | syncMode, setSyncMode | useSyncMode() |\n * | triggerSync, pause, resume | useSyncControl() |\n *\n * @returns Sync status with connection state, pending uploads, and progress\n * @throws Error if used outside of PowerSyncProvider\n *\n * @example\n * ```typescript\n * function SyncIndicator() {\n * const { status, pendingCount, isPaused } = useSyncStatus();\n *\n * if (status.downloading) {\n * const { current, target, percentage } = status.downloadProgress ?? {};\n * return <Progress value={percentage} label={`${current}/${target}`} />;\n * }\n *\n * if (pendingCount > 0) {\n * return <Badge>{pendingCount} pending uploads</Badge>;\n * }\n *\n * return <Text>Synced</Text>;\n * }\n * ```\n */\nexport function useSyncStatus() {\n if (__DEV__ && warnedSyncStatusCallSites) {\n const stack = new Error().stack?.split(\"\\n\")[2] ?? \"unknown\";\n if (!warnedSyncStatusCallSites.has(stack)) {\n warnedSyncStatusCallSites.add(stack);\n console.warn(\"[useSyncStatus] Deprecated: This hook causes re-renders on any status change. Use focused hooks: useConnectionStatus, useSyncActivityContext, usePendingMutationsContext, etc. See migration guide in JSDoc.\");\n }\n }\n const context = useContext(SyncStatusContext);\n if (!context) {\n throw new Error(\"useSyncStatus must be used within a PowerSyncProvider\");\n }\n return context;\n}\n\n// ─── Focused Context Hooks (Performance Optimization) ────────────────────────\n// These hooks subscribe to only specific data, preventing unnecessary re-renders.\n\n/**\n * Hook to access connection status only.\n * Use this instead of useSyncStatus when you only need connection state.\n *\n * @returns Connection status with connected, connecting, hasSynced states\n * @throws Error if used outside of PowerSyncProvider\n *\n * @example\n * ```typescript\n * function ConnectionBadge() {\n * const { connected, connecting } = useConnectionStatus();\n *\n * if (connecting) return <Badge>Connecting...</Badge>;\n * return <Badge color={connected ? 'green' : 'red'}>{connected ? 'Online' : 'Offline'}</Badge>;\n * }\n * ```\n */\nexport function useConnectionStatus() {\n const context = useContext(ConnectionStatusContext);\n if (!context) {\n throw new Error(\"useConnectionStatus must be used within a PowerSyncProvider\");\n }\n return context;\n}\n\n/**\n * Hook to access sync activity (uploading/downloading).\n * Use this instead of useSyncStatus when you only need sync progress.\n *\n * @returns Sync activity with uploading, downloading, and downloadProgress\n * @throws Error if used outside of PowerSyncProvider\n *\n * @example\n * ```typescript\n * function SyncProgressBar() {\n * const { downloading, downloadProgress } = useSyncActivityContext();\n *\n * if (!downloading) return null;\n * return <ProgressBar value={downloadProgress?.percentage ?? 0} />;\n * }\n * ```\n */\nexport function useSyncActivityContext() {\n const context = useContext(SyncActivityContext);\n if (!context) {\n throw new Error(\"useSyncActivityContext must be used within a PowerSyncProvider\");\n }\n return context;\n}\n\n/**\n * Hook to access pending mutations.\n * Use this instead of useSyncStatus when you only need pending upload info.\n *\n * @returns Pending mutations with count and discard functions\n * @throws Error if used outside of PowerSyncProvider\n *\n * @example\n * ```typescript\n * function PendingChangesIndicator() {\n * const { pendingCount } = usePendingMutationsContext();\n *\n * if (pendingCount === 0) return null;\n * return <Badge>{pendingCount} pending</Badge>;\n * }\n * ```\n */\nexport function usePendingMutationsContext() {\n const context = useContext(PendingMutationsContext);\n if (!context) {\n throw new Error(\"usePendingMutationsContext must be used within a PowerSyncProvider\");\n }\n return context;\n}\n\n/**\n * Hook to access failed transactions.\n * Use this instead of useSyncStatus when you only need error info.\n *\n * @returns Failed transactions with error counts and clear/retry functions\n * @throws Error if used outside of PowerSyncProvider\n *\n * @example\n * ```typescript\n * function SyncErrorBanner() {\n * const { hasUploadErrors, permanentErrorCount, retryFailure, failedTransactions } = useFailedTransactionsContext();\n *\n * if (!hasUploadErrors) return null;\n * return (\n * <Banner onRetry={() => failedTransactions.forEach(f => retryFailure(f.id))}>\n * {permanentErrorCount} changes failed to sync\n * </Banner>\n * );\n * }\n * ```\n */\nexport function useFailedTransactionsContext() {\n const context = useContext(FailedTransactionsContext);\n if (!context) {\n throw new Error(\"useFailedTransactionsContext must be used within a PowerSyncProvider\");\n }\n return context;\n}\n\n/**\n * Hook to access completed transactions history.\n * Use this instead of useSyncStatus when you only need sync history.\n *\n * @returns Completed transactions with clear function\n * @throws Error if used outside of PowerSyncProvider\n *\n * @example\n * ```typescript\n * function RecentSyncs() {\n * const { completedTransactions, clearCompletedHistory } = useCompletedTransactionsContext();\n *\n * return (\n * <View>\n * {completedTransactions.map(t => (\n * <Text key={t.id}>Synced {t.affectedEntityIds.length} items</Text>\n * ))}\n * <Button onPress={clearCompletedHistory}>Clear</Button>\n * </View>\n * );\n * }\n * ```\n */\nexport function useCompletedTransactionsContext() {\n const context = useContext(CompletedTransactionsContext);\n if (!context) {\n throw new Error(\"useCompletedTransactionsContext must be used within a PowerSyncProvider\");\n }\n return context;\n}\n\n/**\n * Hook to access sync mode control.\n * Use this instead of useSyncStatus when you only need sync mode.\n *\n * @returns Sync mode with isPaused state and control functions\n * @throws Error if used outside of PowerSyncProvider\n *\n * @example\n * ```typescript\n * function SyncModeToggle() {\n * const { syncMode, isPaused, setSyncMode } = useSyncModeContext();\n *\n * return (\n * <Toggle\n * value={!isPaused}\n * onValueChange={(on) => setSyncMode(on ? 'push-pull' : 'offline')}\n * label={isPaused ? 'Offline' : syncMode}\n * />\n * );\n * }\n * ```\n */\nexport function useSyncModeContext() {\n const context = useContext(SyncModeContext);\n if (!context) {\n throw new Error(\"useSyncModeContext must be used within a PowerSyncProvider\");\n }\n return context;\n}\n\n// ─── Sync Control Hook ───────────────────────────────────────────────────────\n\n/**\n * Hook to control sync operations.\n *\n * @returns Actions for triggering, pausing, and resuming sync\n *\n * @example\n * ```typescript\n * function SyncControls() {\n * const { triggerSync, syncNow, pause, resume, disconnect, setSyncMode } = useSyncControl();\n * const { isPaused, syncMode } = useSyncStatus();\n *\n * return (\n * <View>\n * <Button onPress={syncNow}>Sync Now</Button>\n * {isPaused ? (\n * <Button onPress={resume}>Resume</Button>\n * ) : (\n * <Button onPress={pause}>Pause</Button>\n * )}\n * </View>\n * );\n * }\n * ```\n */\nexport function useSyncControl() {\n const $ = _c(35);\n const {\n db,\n connector,\n platform\n } = usePowerSync();\n const {\n setSyncMode: setContextSyncMode,\n setForceNextUpload\n } = useSyncModeContext();\n const scopeRef = useRef(null);\n let t0;\n if ($[0] !== connector || $[1] !== db || $[2] !== platform || $[3] !== setContextSyncMode) {\n t0 = async mode => {\n await setContextSyncMode(mode);\n if (mode === \"offline\") {\n if (db?.connected) {\n platform.logger.info(\"[useSyncControl] Mode changed to offline - disconnecting\");\n await db.disconnect();\n }\n } else {\n if (db && connector && !db.connected) {\n platform.logger.info(\"[useSyncControl] Mode changed to\", mode, \"- reconnecting\");\n await db.connect(connector);\n }\n }\n };\n $[0] = connector;\n $[1] = db;\n $[2] = platform;\n $[3] = setContextSyncMode;\n $[4] = t0;\n } else {\n t0 = $[4];\n }\n const setSyncMode = t0;\n let t1;\n if ($[5] !== connector || $[6] !== db || $[7] !== platform || $[8] !== setForceNextUpload) {\n t1 = async () => {\n if (!db || !connector) {\n platform.logger.warn(\"[useSyncControl] Cannot sync - database not initialized\");\n return;\n }\n setForceNextUpload(true);\n platform.logger.info(\"[useSyncControl] Sync Now triggered - forcing full sync\");\n if (db.connected) {\n await db.disconnect();\n }\n await db.connect(connector);\n platform.logger.info(\"[useSyncControl] Connected, sync should start automatically\");\n };\n $[5] = connector;\n $[6] = db;\n $[7] = platform;\n $[8] = setForceNextUpload;\n $[9] = t1;\n } else {\n t1 = $[9];\n }\n const syncNow = t1;\n let t2;\n if ($[10] !== connector || $[11] !== db || $[12] !== platform || $[13] !== setContextSyncMode) {\n t2 = async () => {\n if (!db || !connector) {\n platform.logger.warn(\"[useSyncControl] Cannot trigger sync - not initialized\");\n return;\n }\n await setContextSyncMode(\"push-pull\");\n if (db.connected) {\n platform.logger.info(\"[useSyncControl] Disconnecting to force fresh sync...\");\n await db.disconnect();\n }\n platform.logger.info(\"[useSyncControl] Connecting...\");\n await db.connect(connector);\n platform.logger.info(\"[useSyncControl] Connected, sync should start automatically\");\n };\n $[10] = connector;\n $[11] = db;\n $[12] = platform;\n $[13] = setContextSyncMode;\n $[14] = t2;\n } else {\n t2 = $[14];\n }\n const triggerSync = t2;\n let t3;\n if ($[15] !== platform || $[16] !== setSyncMode) {\n t3 = async () => {\n await setSyncMode(\"offline\");\n platform.logger.info(\"[useSyncControl] Sync paused\");\n };\n $[15] = platform;\n $[16] = setSyncMode;\n $[17] = t3;\n } else {\n t3 = $[17];\n }\n const pause = t3;\n let t4;\n if ($[18] !== platform || $[19] !== setSyncMode) {\n t4 = async () => {\n await setSyncMode(\"push-pull\");\n platform.logger.info(\"[useSyncControl] Sync resumed\");\n };\n $[18] = platform;\n $[19] = setSyncMode;\n $[20] = t4;\n } else {\n t4 = $[20];\n }\n const resume = t4;\n let t5;\n if ($[21] !== db || $[22] !== platform) {\n t5 = async () => {\n if (!db) {\n platform.logger.warn(\"[useSyncControl] Cannot disconnect - not initialized\");\n return;\n }\n platform.logger.info(\"[useSyncControl] Disconnecting...\");\n await db.disconnect();\n platform.logger.info(\"[useSyncControl] Disconnected\");\n };\n $[21] = db;\n $[22] = platform;\n $[23] = t5;\n } else {\n t5 = $[23];\n }\n const disconnect = t5;\n let t6;\n if ($[24] !== connector || $[25] !== platform) {\n t6 = scope => {\n scopeRef.current = scope;\n if (connector && scope) {\n connector.setActiveProjectIds(scope.ids);\n platform.logger.info(\"[useSyncControl] Scope set:\", scope);\n }\n };\n $[24] = connector;\n $[25] = platform;\n $[26] = t6;\n } else {\n t6 = $[26];\n }\n const setScope = t6;\n let t7;\n if ($[27] !== disconnect || $[28] !== pause || $[29] !== resume || $[30] !== setScope || $[31] !== setSyncMode || $[32] !== syncNow || $[33] !== triggerSync) {\n t7 = {\n triggerSync,\n syncNow,\n pause,\n resume,\n disconnect,\n setScope,\n setSyncMode\n };\n $[27] = disconnect;\n $[28] = pause;\n $[29] = resume;\n $[30] = setScope;\n $[31] = setSyncMode;\n $[32] = syncNow;\n $[33] = triggerSync;\n $[34] = t7;\n } else {\n t7 = $[34];\n }\n return t7;\n}\n\n// ─── Sync Mode Hook ──────────────────────────────────────────────────────────\n\n/**\n * Hook to get and set the current sync mode.\n *\n * @returns Object with current mode, setter, and capability flags\n *\n * @example\n * ```typescript\n * function SyncModeSelector() {\n * const { mode, setMode, canUpload, canDownload } = useSyncMode();\n *\n * return (\n * <View>\n * <Text>Current mode: {mode}</Text>\n * <Text>Can upload: {canUpload ? 'Yes' : 'No'}</Text>\n * <Button onPress={() => setMode('pull-only')}>Download Only</Button>\n * </View>\n * );\n * }\n * ```\n */\nexport function useSyncMode() {\n const $ = _c(6);\n const {\n syncMode,\n setSyncMode,\n networkReachable\n } = useSyncModeContext();\n const t0 = networkReachable && syncMode === \"push-pull\";\n const t1 = syncMode !== \"offline\";\n let t2;\n if ($[0] !== networkReachable || $[1] !== setSyncMode || $[2] !== syncMode || $[3] !== t0 || $[4] !== t1) {\n t2 = {\n mode: syncMode,\n setMode: setSyncMode,\n canUpload: t0,\n canDownload: t1,\n networkReachable\n };\n $[0] = networkReachable;\n $[1] = setSyncMode;\n $[2] = syncMode;\n $[3] = t0;\n $[4] = t1;\n $[5] = t2;\n } else {\n t2 = $[5];\n }\n return t2;\n}\n\n// ─── Upload Retry Hook ────────────────────────────────────────────────────────\n\n/**\n * Hook to access upload retry state for exponential backoff handling.\n *\n * When an upload fails, the provider disconnects and waits with exponential backoff\n * before reconnecting. After 7 failed attempts (256s backoff), it stays disconnected\n * and lets the user decide.\n *\n * @returns Upload retry state and control functions\n * @throws Error if used outside of PowerSyncProvider\n *\n * @example\n * ```typescript\n * function UploadRetryBanner() {\n * const {\n * isWaiting,\n * nextRetryAt,\n * maxRetriesReached,\n * retryCount,\n * manualRetry,\n * discardAndReconnect,\n * } = useUploadRetry();\n *\n * if (maxRetriesReached) {\n * return (\n * <View>\n * <Text>Upload failed after {retryCount} attempts</Text>\n * <Button onPress={manualRetry}>Try Again</Button>\n * <Button onPress={discardAndReconnect}>Discard Changes</Button>\n * </View>\n * );\n * }\n *\n * if (isWaiting && nextRetryAt) {\n * return (\n * <View>\n * <Text>Retrying in {Math.ceil((nextRetryAt.getTime() - Date.now()) / 1000)}s</Text>\n * </View>\n * );\n * }\n *\n * return null;\n * }\n * ```\n */\nexport function useUploadRetry() {\n const $ = _c(7);\n const context = useSyncModeContext();\n let t0;\n if ($[0] !== context.discardFailedEntryAndReconnect || $[1] !== context.isWaitingForUploadRetry || $[2] !== context.manualUploadRetry || $[3] !== context.maxUploadRetriesReached || $[4] !== context.nextUploadRetryAt || $[5] !== context.uploadRetryCount) {\n t0 = {\n isWaiting: context.isWaitingForUploadRetry,\n nextRetryAt: context.nextUploadRetryAt,\n maxRetriesReached: context.maxUploadRetriesReached,\n retryCount: context.uploadRetryCount,\n manualRetry: context.manualUploadRetry,\n discardEntryAndReconnect: context.discardFailedEntryAndReconnect\n };\n $[0] = context.discardFailedEntryAndReconnect;\n $[1] = context.isWaitingForUploadRetry;\n $[2] = context.manualUploadRetry;\n $[3] = context.maxUploadRetriesReached;\n $[4] = context.nextUploadRetryAt;\n $[5] = context.uploadRetryCount;\n $[6] = t0;\n } else {\n t0 = $[6];\n }\n return t0;\n}\n\n// ─── Connection Health Hook ──────────────────────────────────────────────────\n\n/**\n * Hook to access connection health status.\n *\n * @returns Current connection health with latency and failure tracking\n * @throws Error if used outside of PowerSyncProvider\n *\n * @example\n * ```typescript\n * function ConnectionIndicator() {\n * const health = useConnectionHealth();\n *\n * const statusColor = {\n * healthy: 'green',\n * degraded: 'yellow',\n * disconnected: 'red',\n * }[health.status];\n *\n * return (\n * <View>\n * <StatusDot color={statusColor} />\n * {health.latency && <Text>{health.latency}ms</Text>}\n * </View>\n * );\n * }\n * ```\n */\nexport function useConnectionHealth() {\n const context = useContext(ConnectionHealthContext);\n if (!context) {\n throw new Error(\"useConnectionHealth must be used within a PowerSyncProvider\");\n }\n return context.health;\n}\n\n// ─── Sync Metrics Hook ───────────────────────────────────────────────────────\n\n/**\n * Hook to access sync metrics.\n *\n * @returns Sync metrics including success rates, timing, and data transfer\n * @throws Error if used outside of PowerSyncProvider\n *\n * @example\n * ```typescript\n * function SyncStats() {\n * const metrics = useSyncMetrics();\n *\n * const successRate = metrics.totalSyncs > 0\n * ? (metrics.successfulSyncs / metrics.totalSyncs * 100).toFixed(1)\n * : 100;\n *\n * return (\n * <View>\n * <Text>Total syncs: {metrics.totalSyncs}</Text>\n * <Text>Success rate: {successRate}%</Text>\n * <Text>Avg duration: {metrics.averageSyncDuration ?? 'N/A'}ms</Text>\n * </View>\n * );\n * }\n * ```\n */\nexport function useSyncMetrics() {\n const context = useContext(SyncMetricsContext);\n if (!context) {\n throw new Error(\"useSyncMetrics must be used within a PowerSyncProvider\");\n }\n return context.metrics;\n}\n\n// ─── Attachment Queue Hook ───────────────────────────────────────────────────\n\n/**\n * Hook to access the attachment queue (if configured).\n *\n * @returns AttachmentQueue instance or null if not configured\n *\n * @example\n * ```typescript\n * function PhotoStats() {\n * const attachmentQueue = useAttachmentQueue();\n * const [stats, setStats] = useState(null);\n *\n * useEffect(() => {\n * if (!attachmentQueue) return;\n *\n * return attachmentQueue.onProgress((newStats) => {\n * setStats(newStats);\n * });\n * }, [attachmentQueue]);\n *\n * if (!stats) return null;\n *\n * return (\n * <View>\n * <Text>Photos: {stats.syncedCount}/{stats.totalExpected}</Text>\n * <Text>Cache used: {formatBytes(stats.syncedSize)}</Text>\n * </View>\n * );\n * }\n * ```\n */\nexport function useAttachmentQueue() {\n return useContext(AttachmentQueueContext);\n}\n\n// ─── Attachment Queue Ready Hook ─────────────────────────────────────────────\n\n/**\n * Hook to check if the attachment queue has finished initializing.\n *\n * This is useful when you need to wait for the attachment queue to be ready\n * before performing upload operations. The attachment queue initializes\n * asynchronously after the database is ready, so there's a brief period\n * where `isReady` is true but `attachmentQueueReady` is false.\n *\n * @returns Whether the attachment queue is ready (true if initialized or if attachments not configured)\n *\n * @example\n * ```typescript\n * function UploadButton() {\n * const attachmentQueue = useAttachmentQueue();\n * const attachmentQueueReady = useAttachmentQueueReady();\n *\n * if (!attachmentQueueReady) {\n * return <Button disabled>Initializing...</Button>;\n * }\n *\n * if (!attachmentQueue) {\n * return <Text>Uploads not configured</Text>;\n * }\n *\n * return <Button onPress={handleUpload}>Upload</Button>;\n * }\n * ```\n */\nexport function useAttachmentQueueReady() {\n const {\n attachmentQueueReady\n } = usePowerSync();\n return attachmentQueueReady;\n}\n\n// ─── Database Query Hook ─────────────────────────────────────────────────────\n\n/**\n * Hook to get the PowerSync database instance.\n * Throws if not ready.\n *\n * @returns The PowerSync database instance\n * @throws Error if not initialized or used outside of PowerSyncProvider\n *\n * @example\n * ```typescript\n * function UserList() {\n * const db = useDatabase();\n * const [users, setUsers] = useState([]);\n *\n * useEffect(() => {\n * db.getAll('SELECT * FROM users').then(setUsers);\n * }, [db]);\n *\n * return <FlatList data={users} />;\n * }\n * ```\n */\nexport function useDatabase() {\n const {\n db,\n isReady,\n error\n } = usePowerSync();\n if (error) {\n throw error;\n }\n if (!isReady || !db) {\n throw new Error(\"PowerSync database is not ready\");\n }\n return db;\n}\n\n// ─── Platform Adapter Hook ───────────────────────────────────────────────────\n\n/**\n * Hook to access the platform adapter.\n *\n * @returns The platform adapter instance\n *\n * @example\n * ```typescript\n * function FileViewer({ filePath }) {\n * const { platform } = usePowerSync();\n *\n * const handleOpen = async () => {\n * const content = await platform.fileSystem.readFile(filePath);\n * // Process content...\n * };\n *\n * return <Button onPress={handleOpen}>Open File</Button>;\n * }\n * ```\n */\nexport function usePlatform() {\n const {\n platform\n } = usePowerSync();\n return platform;\n}\n\n// ─── Online Status Hook ──────────────────────────────────────────────────────\n\n/**\n * Hook to track online/offline status using the platform's network adapter.\n *\n * @returns Whether the device is currently connected to the internet\n *\n * @example\n * ```typescript\n * function OfflineBanner() {\n * const isOnline = useOnlineStatus();\n *\n * if (isOnline) return null;\n *\n * return <Banner type=\"warning\">You are offline</Banner>;\n * }\n * ```\n */\nexport function useOnlineStatus() {\n const $ = _c(4);\n const {\n platform\n } = usePowerSync();\n const [isOnline, setIsOnline] = useState(true);\n let t0;\n if ($[0] !== platform.network) {\n t0 = () => {\n platform.network.isConnected().then(setIsOnline);\n const unsubscribe = platform.network.addConnectionListener(setIsOnline);\n return unsubscribe;\n };\n $[0] = platform.network;\n $[1] = t0;\n } else {\n t0 = $[1];\n }\n let t1;\n if ($[2] !== platform) {\n t1 = [platform];\n $[2] = platform;\n $[3] = t1;\n } else {\n t1 = $[3];\n }\n useEffect(t0, t1);\n return isOnline;\n}\n\n// ─── Pending Mutations Hook ──────────────────────────────────────────────────\n\n/**\n * Hook to get pending mutations that need to be uploaded.\n *\n * @returns Array of pending CRUD entries and count\n *\n * @example\n * ```typescript\n * function PendingChanges() {\n * const { mutations, count } = usePendingMutations();\n *\n * if (count === 0) return null;\n *\n * return (\n * <View>\n * <Text>{count} changes pending upload</Text>\n * <FlatList\n * data={mutations}\n * renderItem={({ item }) => (\n * <Text>{item.op} on {item.table}</Text>\n * )}\n * />\n * </View>\n * );\n * }\n * ```\n */\nexport function usePendingMutations() {\n const $ = _c(3);\n const {\n pendingMutations,\n pendingCount\n } = usePendingMutationsContext();\n let t0;\n if ($[0] !== pendingCount || $[1] !== pendingMutations) {\n t0 = {\n mutations: pendingMutations,\n count: pendingCount\n };\n $[0] = pendingCount;\n $[1] = pendingMutations;\n $[2] = t0;\n } else {\n t0 = $[2];\n }\n return t0;\n}\n\n// ─── Is Syncing Hook ─────────────────────────────────────────────────────────\n\n/**\n * Hook to check if sync is currently active.\n *\n * @returns Whether sync is currently in progress (uploading or downloading)\n *\n * @example\n * ```typescript\n * function SyncButton() {\n * const isSyncing = useIsSyncing();\n * const { triggerSync } = useSyncControl();\n *\n * return (\n * <Button\n * onPress={triggerSync}\n * disabled={isSyncing}\n * >\n * {isSyncing ? 'Syncing...' : 'Sync Now'}\n * </Button>\n * );\n * }\n * ```\n */\nexport function useIsSyncing() {\n const {\n uploading,\n downloading\n } = useSyncActivityContext();\n return uploading || downloading;\n}\n\n// ─── Download Progress Hook ──────────────────────────────────────────────────\n\n/**\n * Hook to get download progress during sync.\n *\n * @returns Download progress or null if not downloading\n *\n * @example\n * ```typescript\n * function DownloadProgress() {\n * const progress = useDownloadProgress();\n *\n * if (!progress) return null;\n *\n * return (\n * <ProgressBar\n * value={progress.percentage}\n * label={`${progress.current}/${progress.target} operations`}\n * />\n * );\n * }\n * ```\n */\nexport function useDownloadProgress() {\n const {\n downloadProgress\n } = useSyncActivityContext();\n return downloadProgress;\n}\n\n// ─── Entity Sync Status Hook ─────────────────────────────────────────────────\n\n/**\n * Return type for useEntitySyncStatus hook.\n */\nexport interface EntitySyncStatusResult {\n /** Current sync state for this entity */\n state: EntitySyncState;\n /** Error details if state is 'error' */\n error: SyncError | null;\n /** Number of pending operations for this entity */\n pendingOperations: number;\n /** The failed transaction if any */\n failedTransaction: FailedTransaction | null;\n /** Dismiss the failure (remove from tracking) */\n dismiss: () => void;\n}\n\n/**\n * Hook to get sync status for a specific entity.\n *\n * Combines local mutation state (from pending mutations) with\n * failure state to provide a unified status for UI.\n *\n * @param entityId - The entity ID to check status for\n * @returns Unified sync state and actions\n *\n * @example\n * ```typescript\n * function EquipmentHeader({ unitId }) {\n * const { state, error, dismiss } = useEntitySyncStatus(unitId);\n *\n * const borderColor = {\n * idle: 'transparent',\n * saving: 'orange',\n * syncing: 'amber',\n * synced: 'green',\n * error: 'red',\n * }[state];\n * }\n * ```\n */\nexport function useEntitySyncStatus(entityId: string | undefined): EntitySyncStatusResult {\n // Use focused context hooks instead of deprecated useSyncStatus\n const {\n pendingMutations\n } = usePendingMutationsContext();\n const {\n failedTransactions,\n clearFailure\n } = useFailedTransactionsContext();\n const [, forceUpdate] = useState(0);\n\n // Track recently synced entities with timestamps using a ref (avoids module-level mutable state)\n const recentlySyncedRef = useRef<Map<string, number>>(new Map());\n\n // Find if entity is in pending mutations\n // Check both entry.id (PowerSync's internal CRUD entry ID) and entry.opData?.id (the actual record ID)\n const entityPendingMutations = useMemo(() => {\n if (!entityId) return [];\n return pendingMutations.filter(entry => entry.id === entityId || String(entry.opData?.id) === entityId);\n }, [entityId, pendingMutations]);\n\n // Find if entity has a failed transaction\n const failedTransaction = useMemo(() => {\n if (!entityId) return null;\n return failedTransactions.find(ft => ft.affectedEntityIds.includes(entityId)) ?? null;\n }, [entityId, failedTransactions]);\n\n // Track transition from syncing to synced\n const wasSyncingRef = useRef(false);\n const isCurrentlySyncing = entityPendingMutations.length > 0;\n\n // When entity transitions from syncing to not syncing (and no error),\n // mark it as recently synced\n useEffect(() => {\n if (!entityId) return;\n if (wasSyncingRef.current && !isCurrentlySyncing && !failedTransaction) {\n recentlySyncedRef.current.set(entityId, Date.now());\n\n // Schedule cleanup after the display duration\n const timer = setTimeout(() => {\n const syncedAt = recentlySyncedRef.current.get(entityId);\n if (syncedAt && Date.now() - syncedAt >= SYNCED_DISPLAY_DURATION_MS) {\n recentlySyncedRef.current.delete(entityId);\n forceUpdate(n => n + 1);\n }\n }, SYNCED_DISPLAY_DURATION_MS);\n return () => {\n clearTimeout(timer);\n recentlySyncedRef.current.delete(entityId);\n };\n }\n wasSyncingRef.current = isCurrentlySyncing;\n }, [entityId, isCurrentlySyncing, failedTransaction]);\n\n // Determine current state\n const state = useMemo((): EntitySyncState => {\n if (!entityId) return 'idle';\n\n // Check for ANY failure (highest priority)\n // Both permanent and transient failures should show error state\n // The UI can use failedTransaction.isPermanent to distinguish if needed\n if (failedTransaction) {\n return 'error';\n }\n\n // Check if currently syncing\n if (entityPendingMutations.length > 0) {\n return 'syncing';\n }\n\n // Check if recently synced\n const syncedAt_0 = recentlySyncedRef.current.get(entityId);\n if (syncedAt_0 && Date.now() - syncedAt_0 < SYNCED_DISPLAY_DURATION_MS) {\n return 'synced';\n }\n return 'idle';\n }, [entityId, failedTransaction, entityPendingMutations.length]);\n\n // Get error from failed transaction\n const error = failedTransaction?.error ?? null;\n\n // Dismiss function - clears the failure from tracking\n const dismiss = useCallback(() => {\n if (failedTransaction) {\n clearFailure(failedTransaction.id);\n }\n }, [failedTransaction, clearFailure]);\n return {\n state,\n error,\n pendingOperations: entityPendingMutations.length,\n failedTransaction,\n dismiss\n };\n}\n\n// ─── Upload Status Hook ──────────────────────────────────────────────────────\n\n/**\n * Return type for useUploadStatus hook.\n */\nexport interface UploadStatusResult {\n /** Number of operations waiting to upload */\n pendingCount: number;\n /** Number of failed transactions */\n failedCount: number;\n /** Number of permanent failures needing user action */\n permanentFailureCount: number;\n /** Whether there are any errors */\n hasErrors: boolean;\n /** Whether there are permanent errors needing attention */\n hasPermanentErrors: boolean;\n /** All failed transactions */\n failedTransactions: FailedTransaction[];\n /** Trigger sync retry (reconnect) */\n retryAll: () => Promise<void>;\n /** Dismiss a specific failure by its ID */\n dismissFailure: (failureId: string) => void;\n}\n\n/**\n * Hook to get overall upload status across all entities.\n *\n * @returns Upload status with counts and actions\n *\n * @example\n * ```typescript\n * function SyncStatusBar() {\n * const { pendingCount, failedCount, hasPermanentErrors, retryAll } = useUploadStatus();\n *\n * if (hasPermanentErrors) {\n * return <Banner onRetry={retryAll}>\n * {failedCount} changes failed to sync\n * </Banner>;\n * }\n * }\n * ```\n */\nexport function useUploadStatus() {\n const $ = _c(12);\n const {\n pendingCount\n } = usePendingMutationsContext();\n const {\n failedTransactions,\n hasUploadErrors,\n permanentErrorCount,\n clearFailure\n } = useFailedTransactionsContext();\n const {\n triggerSync\n } = useSyncControl();\n let t0;\n if ($[0] !== triggerSync) {\n t0 = async () => {\n await triggerSync();\n };\n $[0] = triggerSync;\n $[1] = t0;\n } else {\n t0 = $[1];\n }\n const retryAll = t0;\n let t1;\n if ($[2] !== clearFailure) {\n t1 = failureId => {\n clearFailure(failureId);\n };\n $[2] = clearFailure;\n $[3] = t1;\n } else {\n t1 = $[3];\n }\n const dismissFailure = t1;\n const t2 = permanentErrorCount > 0;\n let t3;\n if ($[4] !== dismissFailure || $[5] !== failedTransactions || $[6] !== hasUploadErrors || $[7] !== pendingCount || $[8] !== permanentErrorCount || $[9] !== retryAll || $[10] !== t2) {\n t3 = {\n pendingCount,\n failedCount: failedTransactions.length,\n permanentFailureCount: permanentErrorCount,\n hasErrors: hasUploadErrors,\n hasPermanentErrors: t2,\n failedTransactions,\n retryAll,\n dismissFailure\n };\n $[4] = dismissFailure;\n $[5] = failedTransactions;\n $[6] = hasUploadErrors;\n $[7] = pendingCount;\n $[8] = permanentErrorCount;\n $[9] = retryAll;\n $[10] = t2;\n $[11] = t3;\n } else {\n t3 = $[11];\n }\n return t3;\n}\n\n// ─── Sync Activity Hook ──────────────────────────────────────────────────────\n\n/**\n * Return type for useSyncActivity hook.\n */\nexport interface SyncActivityResult {\n /** Pending CRUD entries waiting to be synced */\n pending: CrudEntry[];\n /** Failed transactions that need attention */\n failed: FailedTransaction[];\n /** Recently completed transactions */\n completed: CompletedTransaction[];\n /** New completed transactions since last notification display (for toasts/banners) */\n newCompleted: CompletedTransaction[];\n /** Counts summary */\n counts: {\n pending: number;\n failed: number;\n completed: number;\n newCompleted: number;\n };\n /** Whether there is any sync activity to show (pending or failed) */\n hasActivity: boolean;\n /** Retry all failed transactions */\n retryAll: () => Promise<void>;\n /** Retry a specific failed transaction */\n retryFailure: (failureId: string) => Promise<void>;\n /** Dismiss a specific failure */\n dismissFailure: (failureId: string) => void;\n /** Clear all completed transactions from the list */\n clearCompleted: () => void;\n /** Clear a specific completed transaction from the list */\n clearCompletedItem: (completedId: string) => void;\n /** Mark notifications as seen (for auto-dismiss functionality) */\n markNotificationsAsSeen: () => void;\n}\n\n/**\n * Hook to get comprehensive sync activity including pending, failed, and completed transactions.\n *\n * Uses the provider's completed transaction tracking via the status tracker.\n *\n * @returns Sync activity with all transaction states and actions\n *\n * @example\n * ```typescript\n * function SyncActivityBanner() {\n * const { pending, failed, completed, counts, hasActivity, retryAll, clearCompleted } = useSyncActivity();\n *\n * if (!hasActivity && completed.length === 0) return null;\n *\n * return (\n * <View>\n * <Text>{counts.pending} syncing, {counts.failed} failed</Text>\n * {failed.length > 0 && <Button onPress={retryAll}>Retry All</Button>}\n * </View>\n * );\n * }\n * ```\n */\nexport function useSyncActivity() {\n const $ = _c(24);\n const {\n pendingMutations\n } = usePendingMutationsContext();\n const {\n failedTransactions,\n clearFailure,\n retryFailure\n } = useFailedTransactionsContext();\n const {\n completedTransactions,\n clearCompletedHistory,\n clearCompletedItem,\n newCompletedTransactions,\n markNotificationsAsSeen\n } = useCompletedTransactionsContext();\n const {\n uploading: isUploading,\n downloading: isDownloading\n } = useSyncActivityContext();\n const {\n triggerSync\n } = useSyncControl();\n let t0;\n if ($[0] !== triggerSync) {\n t0 = async () => {\n await triggerSync();\n };\n $[0] = triggerSync;\n $[1] = t0;\n } else {\n t0 = $[1];\n }\n const retryAll = t0;\n let t1;\n if ($[2] !== clearFailure) {\n t1 = failureId => {\n clearFailure(failureId);\n };\n $[2] = clearFailure;\n $[3] = t1;\n } else {\n t1 = $[3];\n }\n const dismissFailure = t1;\n let t2;\n if ($[4] !== clearCompletedHistory) {\n t2 = () => {\n clearCompletedHistory();\n };\n $[4] = clearCompletedHistory;\n $[5] = t2;\n } else {\n t2 = $[5];\n }\n const clearCompleted = t2;\n let t3;\n if ($[6] !== completedTransactions.length || $[7] !== failedTransactions.length || $[8] !== newCompletedTransactions.length || $[9] !== pendingMutations.length) {\n t3 = {\n pending: pendingMutations.length,\n failed: failedTransactions.length,\n completed: completedTransactions.length,\n newCompleted: newCompletedTransactions.length\n };\n $[6] = completedTransactions.length;\n $[7] = failedTransactions.length;\n $[8] = newCompletedTransactions.length;\n $[9] = pendingMutations.length;\n $[10] = t3;\n } else {\n t3 = $[10];\n }\n const counts = t3;\n const hasActivity = isUploading || isDownloading || failedTransactions.length > 0;\n let t4;\n if ($[11] !== clearCompleted || $[12] !== clearCompletedItem || $[13] !== completedTransactions || $[14] !== counts || $[15] !== dismissFailure || $[16] !== failedTransactions || $[17] !== hasActivity || $[18] !== markNotificationsAsSeen || $[19] !== newCompletedTransactions || $[20] !== pendingMutations || $[21] !== retryAll || $[22] !== retryFailure) {\n t4 = {\n pending: pendingMutations,\n failed: failedTransactions,\n completed: completedTransactions,\n newCompleted: newCompletedTransactions,\n counts,\n hasActivity,\n retryAll,\n retryFailure,\n dismissFailure,\n clearCompleted,\n clearCompletedItem,\n markNotificationsAsSeen\n };\n $[11] = clearCompleted;\n $[12] = clearCompletedItem;\n $[13] = completedTransactions;\n $[14] = counts;\n $[15] = dismissFailure;\n $[16] = failedTransactions;\n $[17] = hasActivity;\n $[18] = markNotificationsAsSeen;\n $[19] = newCompletedTransactions;\n $[20] = pendingMutations;\n $[21] = retryAll;\n $[22] = retryFailure;\n $[23] = t4;\n } else {\n t4 = $[23];\n }\n return t4;\n}\n\n// ============================================================================\n// Renamed Hooks (cleaner API)\n// ============================================================================\n\n// Note: useSyncActivity and usePendingMutations already exist as higher-level hooks\n// with different return types (lines 707 and 1049). The focused context hooks\n// (useSyncActivityContext, usePendingMutationsContext) retain the \"Context\" suffix\n// to distinguish them from the convenience hooks.\n\n/**\n * Get failed transactions state and retry/dismiss functions.\n * Alias for useFailedTransactionsContext.\n */\nexport const useFailedTransactions = useFailedTransactionsContext;\n\n/**\n * Get completed transactions state and clear function.\n * Alias for useCompletedTransactionsContext.\n */\nexport const useCompletedTransactions = useCompletedTransactionsContext;\n\n// ─── Upload Blocked Reason Hook ──────────────────────────────────────────────\n\n/**\n * Return type for useUploadBlockedReason hook.\n */\nexport interface UploadBlockedReasonResult {\n /** Whether uploads are currently blocked */\n isBlocked: boolean;\n /** The reason uploads are blocked */\n reason: UploadBlockReason;\n /** Human-readable description of why uploads are blocked */\n description: string | null;\n /** Whether an upload is actively in progress */\n isUploading: boolean;\n}\n\n/**\n * User-friendly descriptions for upload block reasons.\n */\nconst BLOCK_REASON_DESCRIPTIONS: Record<UploadBlockReason, string | null> = {\n offline_mode: 'Offline mode enabled',\n pull_only_mode: 'Download-only mode enabled',\n network_unreachable: 'No internet connection',\n auto_offline: 'Went offline due to network loss',\n disconnected: 'Not connected to sync service',\n connecting: 'Connecting to sync service...',\n uploading: 'Upload in progress',\n none: null\n};\n\n/**\n * Hook to get why uploads are blocked.\n * Derives block reason from existing sync mode, network, and connection state.\n *\n * @returns Upload blocked status with reason and description\n *\n * @example\n * ```typescript\n * function UploadBlockedBanner() {\n * const { isBlocked, reason, description } = useUploadBlockedReason();\n *\n * if (!isBlocked) return null;\n *\n * return <Banner>{description}</Banner>;\n * }\n * ```\n */\nexport function useUploadBlockedReason() {\n const $ = _c(5);\n const {\n syncMode,\n isAutoOffline,\n networkReachable\n } = useSyncModeContext();\n const {\n uploading\n } = useSyncActivityContext();\n const {\n connected,\n connecting\n } = useConnectionStatus();\n let reason = \"none\";\n if (syncMode === \"offline\") {\n reason = isAutoOffline ? \"auto_offline\" : \"offline_mode\";\n } else {\n if (syncMode === \"pull-only\") {\n reason = \"pull_only_mode\";\n } else {\n if (!networkReachable) {\n reason = \"network_unreachable\";\n } else {\n if (!connected && !connecting) {\n reason = \"disconnected\";\n } else {\n if (connecting) {\n reason = \"connecting\";\n } else {\n if (uploading) {\n reason = \"uploading\";\n }\n }\n }\n }\n }\n }\n const isBlocked = reason !== \"none\" && reason !== \"uploading\";\n const description = BLOCK_REASON_DESCRIPTIONS[reason];\n let t0;\n if ($[0] !== description || $[1] !== isBlocked || $[2] !== reason || $[3] !== uploading) {\n t0 = {\n isBlocked,\n reason,\n description,\n isUploading: uploading\n };\n $[0] = description;\n $[1] = isBlocked;\n $[2] = reason;\n $[3] = uploading;\n $[4] = t0;\n } else {\n t0 = $[4];\n }\n return t0;\n}\n\n// ─── Retry Countdown Hook ────────────────────────────────────────────────────\n\n/**\n * Return type for useRetryCountdown hook.\n */\nexport interface RetryCountdownResult {\n /** The soonest next retry time from all failed transactions */\n nextRetryAt: Date | null;\n /** Milliseconds until the next retry (0 if already past) */\n timeUntilRetryMs: number;\n /** Formatted countdown string (e.g., \"5s\", \"1m 30s\", \"2m\") or null if no retry scheduled */\n formattedCountdown: string | null;\n}\n\n/**\n * Format milliseconds into a human-readable countdown string.\n */\nfunction formatCountdown(ms: number): string {\n if (ms <= 0) return '0s';\n const totalSeconds = Math.ceil(ms / 1000);\n const minutes = Math.floor(totalSeconds / 60);\n const seconds = totalSeconds % 60;\n if (minutes === 0) {\n return `${seconds}s`;\n } else if (seconds === 0) {\n return `${minutes}m`;\n } else {\n return `${minutes}m ${seconds}s`;\n }\n}\n\n/**\n * Hook for retry countdown display.\n *\n * @deprecated The nextRetryAt and backoffMs fields have been removed from FailedTransaction.\n * PowerSync SDK now controls retry timing internally. This hook is retained for backward\n * compatibility but will always return null values.\n *\n * @returns Retry countdown information (always returns null values)\n */\nexport function useRetryCountdown() {\n const $ = _c(1);\n let t0;\n if ($[0] === Symbol.for(\"react.memo_cache_sentinel\")) {\n t0 = {\n nextRetryAt: null,\n timeUntilRetryMs: 0,\n formattedCountdown: null\n };\n $[0] = t0;\n } else {\n t0 = $[0];\n }\n return t0;\n}"],"mappings":"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","names":[]}
@@ -0,0 +1 @@
1
+ //# sourceMappingURL=chunk-ANXWYQEJ.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
@@ -1,21 +1,16 @@
1
1
  import {
2
- DEFAULT_UPLOAD_NOTIFICATION,
2
+ DEFAULT_UPLOAD_NOTIFICATION
3
+ } from "./chunk-ZAN22NGL.js";
4
+ import {
3
5
  resolveBucket
4
- } from "./chunk-Z6VOBGTU.js";
6
+ } from "./chunk-UOMHWUHV.js";
5
7
  import {
6
8
  AbortError
7
9
  } from "./chunk-FV2HXEIY.js";
8
10
 
9
11
  // src/storage/upload/SupabaseUploadHandler.native.ts
10
12
  import { Platform } from "react-native";
11
- var Upload = null;
12
- async function loadUploadModule() {
13
- if (!Upload) {
14
- const module = await import("react-native-background-upload");
15
- Upload = module.default;
16
- }
17
- return Upload;
18
- }
13
+ import Upload from "react-native-background-upload";
19
14
  var SupabaseUploadHandler = class {
20
15
  supabase;
21
16
  defaultBucket;
@@ -40,22 +35,30 @@ var SupabaseUploadHandler = class {
40
35
  if (signal?.aborted) {
41
36
  throw new AbortError();
42
37
  }
38
+ if (!this.supabase?.storage?.from) {
39
+ throw new Error(`Supabase client is not properly initialized: storage=${!!this.supabase?.storage}, from=${typeof this.supabase?.storage?.from}`);
40
+ }
43
41
  const bucket = this.resolveBucket(storagePath);
44
- const {
45
- data,
46
- error
47
- } = await this.supabase.storage.from(bucket).createSignedUploadUrl(storagePath);
42
+ let data = null;
43
+ let error = null;
44
+ try {
45
+ const result = await this.supabase.storage.from(bucket).createSignedUploadUrl(storagePath);
46
+ data = result.data;
47
+ error = result.error;
48
+ } catch (e) {
49
+ const err = e instanceof Error ? e : new Error(String(e));
50
+ throw new Error(`createSignedUploadUrl threw unexpectedly for ${storagePath}: ${err.message} (stack: ${err.stack?.split("\n").slice(0, 3).join(" | ")})`);
51
+ }
48
52
  if (error || !data?.signedUrl) {
49
53
  throw new Error(error?.message || "Failed to create signed upload URL");
50
54
  }
51
55
  if (signal?.aborted) {
52
56
  throw new AbortError();
53
57
  }
54
- const UploadModule = await loadUploadModule();
55
58
  return new Promise((resolve, reject) => {
56
- const uploadId = `upload_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`;
59
+ const uploadId = `upload_${Date.now()}_${Math.random().toString(36).slice(2, 11)}`;
57
60
  let isSettled = false;
58
- const completedSub = UploadModule.addListener("completed", uploadId, (eventData) => {
61
+ const completedSub = Upload.addListener("completed", uploadId, (eventData) => {
59
62
  if (isSettled) return;
60
63
  isSettled = true;
61
64
  cleanup();
@@ -65,13 +68,13 @@ var SupabaseUploadHandler = class {
65
68
  reject(new Error(`Upload failed with status ${eventData.responseCode}`));
66
69
  }
67
70
  });
68
- const errorSub = UploadModule.addListener("error", uploadId, (eventData) => {
71
+ const errorSub = Upload.addListener("error", uploadId, (eventData) => {
69
72
  if (isSettled) return;
70
73
  isSettled = true;
71
74
  cleanup();
72
- reject(new Error(eventData.error));
75
+ reject(new Error(`Upload error event for ${storagePath}: ${eventData.error}`));
73
76
  });
74
- const cancelledSub = UploadModule.addListener("cancelled", uploadId, () => {
77
+ const cancelledSub = Upload.addListener("cancelled", uploadId, () => {
75
78
  if (isSettled) return;
76
79
  isSettled = true;
77
80
  cleanup();
@@ -87,7 +90,7 @@ var SupabaseUploadHandler = class {
87
90
  };
88
91
  const abortHandler = () => {
89
92
  if (isSettled) return;
90
- UploadModule.cancelUpload(uploadId).catch(() => {
93
+ Upload.cancelUpload(uploadId).catch(() => {
91
94
  });
92
95
  };
93
96
  if (signal) {
@@ -96,7 +99,7 @@ var SupabaseUploadHandler = class {
96
99
  });
97
100
  }
98
101
  const isAndroid = Platform.OS === "android";
99
- UploadModule.startUpload({
102
+ Upload.startUpload({
100
103
  url: data.signedUrl,
101
104
  path: localFileUri,
102
105
  method: "PUT",
@@ -113,7 +116,9 @@ var SupabaseUploadHandler = class {
113
116
  if (isSettled) return;
114
117
  isSettled = true;
115
118
  cleanup();
116
- reject(err);
119
+ const contextualError = new Error(`Upload startUpload failed for ${storagePath}: ${err.message}`);
120
+ contextualError.stack = err.stack;
121
+ reject(contextualError);
117
122
  });
118
123
  });
119
124
  }
@@ -139,4 +144,4 @@ export {
139
144
  SupabaseUploadHandler,
140
145
  createSupabaseUploadHandler
141
146
  };
142
- //# sourceMappingURL=chunk-CAB26E6F.js.map
147
+ //# sourceMappingURL=chunk-C4J4MLER.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/storage/upload/SupabaseUploadHandler.native.ts"],"sourcesContent":["/**\n * Supabase Upload Handler for React Native\n *\n * Implements UploadHandler interface using react-native-background-upload\n * for iOS background upload capability.\n */\n\nimport { Platform } from 'react-native';\nimport Upload from 'react-native-background-upload';\nimport type { SupabaseClient } from '@supabase/supabase-js';\nimport type { SupabaseStorageOptions } from '../types';\nimport { resolveBucket } from '../types';\nimport type { SupabaseUploadHandlerOptions, UploadNotificationConfig, BucketConfig } from './types';\nimport { DEFAULT_UPLOAD_NOTIFICATION } from './types';\nimport { AbortError } from '../../utils/retry';\n\n/**\n * React Native upload handler using react-native-background-upload.\n *\n * Features:\n * - iOS background upload support\n * - AbortSignal cancellation support\n * - Android notification support\n * - Signed URL-based uploads\n *\n * @example\n * ```typescript\n * const handler = createSupabaseUploadHandler(supabaseClient, {\n * defaultBucket: 'attachments',\n * bucketMap: new Map([['avatars/', 'user-avatars']]),\n * });\n *\n * await handler.uploadFile(\n * 'photos/image.jpg',\n * 'file:///path/to/image.jpg',\n * 'image/jpeg'\n * );\n * ```\n */\nexport class SupabaseUploadHandler {\n private supabase: SupabaseClient;\n private defaultBucket: string;\n private bucketMap?: Map<string, string>;\n private bucketResolver?: (storagePath: string) => string | undefined;\n private notificationConfig: UploadNotificationConfig;\n constructor(options: SupabaseUploadHandlerOptions, notificationConfig?: Partial<UploadNotificationConfig>) {\n this.supabase = options.supabaseClient;\n this.defaultBucket = options.bucketConfig.defaultBucket;\n this.bucketMap = options.bucketConfig.bucketMap;\n this.bucketResolver = options.bucketConfig.resolver;\n this.notificationConfig = {\n ...DEFAULT_UPLOAD_NOTIFICATION,\n ...notificationConfig\n };\n }\n\n /**\n * Upload a file to Supabase Storage using react-native-background-upload.\n * Supports iOS background uploads and AbortSignal for cancellation.\n */\n async uploadFile(storagePath: string, localFileUri: string, mediaType: string, signal?: AbortSignal): Promise<void> {\n // Check if already aborted\n if (signal?.aborted) {\n throw new AbortError();\n }\n\n // Defensive check: ensure Supabase client is valid\n if (!this.supabase?.storage?.from) {\n throw new Error(`Supabase client is not properly initialized: storage=${!!this.supabase?.storage}, from=${typeof this.supabase?.storage?.from}`);\n }\n const bucket = this.resolveBucket(storagePath);\n\n // 1. Get signed upload URL from Supabase\n let data: {\n signedUrl: string;\n } | null = null;\n let error: Error | null = null;\n try {\n const result = await this.supabase.storage.from(bucket).createSignedUploadUrl(storagePath);\n data = result.data;\n error = result.error;\n } catch (e) {\n // Wrap any thrown errors with context\n const err = e instanceof Error ? e : new Error(String(e));\n throw new Error(`createSignedUploadUrl threw unexpectedly for ${storagePath}: ${err.message} (stack: ${err.stack?.split('\\n').slice(0, 3).join(' | ')})`);\n }\n if (error || !data?.signedUrl) {\n throw new Error(error?.message || 'Failed to create signed upload URL');\n }\n\n // Check abort after async operation\n if (signal?.aborted) {\n throw new AbortError();\n }\n\n // 2. Upload using react-native-background-upload\n return new Promise((resolve, reject) => {\n const uploadId = `upload_${Date.now()}_${Math.random().toString(36).slice(2, 11)}`;\n let isSettled = false;\n\n // Setup listeners before starting\n const completedSub = Upload.addListener('completed', uploadId, (eventData: {\n responseCode: number;\n }) => {\n if (isSettled) return;\n isSettled = true;\n cleanup();\n if (eventData.responseCode >= 200 && eventData.responseCode < 300) {\n resolve();\n } else {\n reject(new Error(`Upload failed with status ${eventData.responseCode}`));\n }\n });\n const errorSub = Upload.addListener('error', uploadId, (eventData: {\n error: string;\n }) => {\n if (isSettled) return;\n isSettled = true;\n cleanup();\n // Add context to help debug the source of errors\n reject(new Error(`Upload error event for ${storagePath}: ${eventData.error}`));\n });\n const cancelledSub = Upload.addListener('cancelled', uploadId, () => {\n if (isSettled) return;\n isSettled = true;\n cleanup();\n reject(new AbortError());\n });\n const cleanup = () => {\n completedSub.remove();\n errorSub.remove();\n cancelledSub.remove();\n if (signal) {\n signal.removeEventListener('abort', abortHandler);\n }\n };\n\n // Register abort handler to cancel the upload\n const abortHandler = () => {\n if (isSettled) return;\n Upload.cancelUpload(uploadId).catch(() => {\n // Ignore errors when cancelling - the upload may have already completed\n });\n };\n if (signal) {\n signal.addEventListener('abort', abortHandler, {\n once: true\n });\n }\n\n // Determine platform for notification settings\n const isAndroid = Platform.OS === 'android';\n\n // Start the upload\n Upload.startUpload({\n url: data.signedUrl,\n path: localFileUri,\n method: 'PUT',\n type: 'raw',\n customUploadId: uploadId,\n headers: {\n 'Content-Type': mediaType\n },\n // Android notification settings\n ...(isAndroid && {\n notification: this.notificationConfig\n })\n }).catch((err: Error) => {\n if (isSettled) return;\n isSettled = true;\n cleanup();\n // Add context to help debug mysterious errors like \"Cannot read property 'reload' of undefined\"\n const contextualError = new Error(`Upload startUpload failed for ${storagePath}: ${err.message}`);\n contextualError.stack = err.stack;\n reject(contextualError);\n });\n });\n }\n\n /**\n * Resolve the storage bucket for a given path.\n */\n resolveBucket(storagePath: string): string {\n return resolveBucket({\n defaultBucket: this.defaultBucket,\n bucketMap: this.bucketMap,\n bucketResolver: this.bucketResolver\n }, storagePath);\n }\n}\n\n/**\n * Factory function for creating a SupabaseUploadHandler.\n */\nexport function createSupabaseUploadHandler(supabaseClient: SupabaseClient, bucketConfig: BucketConfig, notificationConfig?: Partial<UploadNotificationConfig>): SupabaseUploadHandler {\n return new SupabaseUploadHandler({\n supabaseClient,\n bucketConfig\n }, notificationConfig);\n}"],"mappings":"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","names":[]}