@aguacerowx/react-native 0.0.21 → 0.0.22

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 (404) hide show
  1. package/README.md +126 -126
  2. package/aguacerowx-react-native.podspec +53 -53
  3. package/android/build.gradle +107 -107
  4. package/android/src/main/AndroidManifest.xml +6 -6
  5. package/android/src/main/java/com/aguacerowx/reactnative/AguaceroPackage.java +33 -33
  6. package/android/src/main/java/com/aguacerowx/reactnative/GridRenderLayer.java +664 -657
  7. package/android/src/main/java/com/aguacerowx/reactnative/GridRenderLayerView.java +304 -304
  8. package/android/src/main/java/com/aguacerowx/reactnative/GridRenderManager.java +125 -125
  9. package/android/src/main/java/com/aguacerowx/reactnative/InspectorModule.java +71 -71
  10. package/android/src/main/java/com/aguacerowx/reactnative/ShaderUtils.java +106 -106
  11. package/android/src/main/java/com/aguacerowx/reactnative/WeatherFrameProcessorModule.java +151 -151
  12. package/android/src/main/res/raw/debug_fragment_shader.glsl +12 -12
  13. package/android/src/main/res/raw/debug_vertex_shader.glsl +12 -12
  14. package/android/src/main/res/raw/fragment_shader.glsl +161 -151
  15. package/android/src/main/res/raw/vertex_shader.glsl +19 -19
  16. package/index.js +2 -2
  17. package/ios/AguaceroPackage.m +18 -18
  18. package/ios/FragmentUniforms.swift +15 -14
  19. package/ios/GridRenderLayer.swift +1003 -995
  20. package/ios/GridRenderLayerBridge.swift +29 -29
  21. package/ios/GridRenderLayerManager.mm +157 -157
  22. package/ios/GridRenderLayerView.h +16 -16
  23. package/ios/GridRenderLayerView.m +204 -204
  24. package/ios/InspectorDataCache.swift +65 -65
  25. package/ios/InspectorModule.m +9 -9
  26. package/ios/InspectorModule.swift +63 -63
  27. package/ios/Shaders.metal +190 -178
  28. package/ios/WeatherFrameProcessorModule.m +15 -15
  29. package/ios/WeatherFrameProcessorModule.swift +103 -103
  30. package/ios/compiled-shaders/Shaders-device.metallib +0 -0
  31. package/ios/compiled-shaders/Shaders-simulator.metallib +0 -0
  32. package/lib/commonjs/README.md +126 -126
  33. package/lib/commonjs/aguacerowx-react-native.podspec +53 -53
  34. package/lib/commonjs/android/build.gradle +107 -107
  35. package/lib/commonjs/android/src/main/AndroidManifest.xml +6 -6
  36. package/lib/commonjs/android/src/main/java/com/aguacerowx/reactnative/AguaceroPackage.java +33 -33
  37. package/lib/commonjs/android/src/main/java/com/aguacerowx/reactnative/GridRenderLayer.java +664 -657
  38. package/lib/commonjs/android/src/main/java/com/aguacerowx/reactnative/GridRenderLayerView.java +304 -304
  39. package/lib/commonjs/android/src/main/java/com/aguacerowx/reactnative/GridRenderManager.java +125 -125
  40. package/lib/commonjs/android/src/main/java/com/aguacerowx/reactnative/InspectorModule.java +71 -71
  41. package/lib/commonjs/android/src/main/java/com/aguacerowx/reactnative/ShaderUtils.java +106 -106
  42. package/lib/commonjs/android/src/main/java/com/aguacerowx/reactnative/WeatherFrameProcessorModule.java +151 -151
  43. package/lib/commonjs/android/src/main/res/raw/debug_fragment_shader.glsl +12 -12
  44. package/lib/commonjs/android/src/main/res/raw/debug_vertex_shader.glsl +12 -12
  45. package/lib/commonjs/android/src/main/res/raw/fragment_shader.glsl +161 -151
  46. package/lib/commonjs/android/src/main/res/raw/vertex_shader.glsl +19 -19
  47. package/lib/commonjs/babel.config.js.map +1 -1
  48. package/lib/commonjs/index.js.map +1 -1
  49. package/lib/commonjs/ios/AguaceroPackage.m +18 -18
  50. package/lib/commonjs/ios/FragmentUniforms.swift +15 -14
  51. package/lib/commonjs/ios/GridRenderLayer.swift +1003 -995
  52. package/lib/commonjs/ios/GridRenderLayerBridge.swift +29 -29
  53. package/lib/commonjs/ios/GridRenderLayerManager.mm +157 -157
  54. package/lib/commonjs/ios/GridRenderLayerView.h +16 -16
  55. package/lib/commonjs/ios/GridRenderLayerView.m +204 -204
  56. package/lib/commonjs/ios/InspectorDataCache.swift +65 -65
  57. package/lib/commonjs/ios/InspectorModule.m +9 -9
  58. package/lib/commonjs/ios/InspectorModule.swift +63 -63
  59. package/lib/commonjs/ios/Shaders.metal +190 -178
  60. package/lib/commonjs/ios/WeatherFrameProcessorModule.m +15 -15
  61. package/lib/commonjs/ios/WeatherFrameProcessorModule.swift +103 -103
  62. package/lib/commonjs/ios/compiled-shaders/Shaders-device.metallib +0 -0
  63. package/lib/commonjs/ios/compiled-shaders/Shaders-simulator.metallib +0 -0
  64. package/lib/commonjs/package.json +72 -72
  65. package/lib/commonjs/react-native-builder-bob.config.js.map +1 -1
  66. package/lib/commonjs/scripts/compile-shaders.js.map +1 -1
  67. package/lib/commonjs/scripts/compile-shaders.sh +38 -38
  68. package/lib/commonjs/src/AguaceroContext.js.map +1 -1
  69. package/lib/commonjs/src/GridRenderLayer.js.map +1 -1
  70. package/lib/commonjs/src/GridRenderLayerNativeComponent.js.map +1 -1
  71. package/lib/commonjs/src/MapManager.js.map +1 -1
  72. package/lib/commonjs/src/MapRegistry.js.map +1 -1
  73. package/lib/commonjs/src/StyleApplicator.js +6 -6
  74. package/lib/commonjs/src/StyleApplicator.js.map +1 -1
  75. package/lib/commonjs/src/WeatherLayerManager.js +34 -5
  76. package/lib/commonjs/src/WeatherLayerManager.js.map +1 -1
  77. package/lib/commonjs/tsconfig.json +23 -23
  78. package/lib/module/README.md +126 -126
  79. package/lib/module/aguacerowx-react-native.podspec +53 -53
  80. package/lib/module/android/build.gradle +107 -107
  81. package/lib/module/android/src/main/AndroidManifest.xml +6 -6
  82. package/lib/module/android/src/main/java/com/aguacerowx/reactnative/AguaceroPackage.java +33 -33
  83. package/lib/module/android/src/main/java/com/aguacerowx/reactnative/GridRenderLayer.java +664 -657
  84. package/lib/module/android/src/main/java/com/aguacerowx/reactnative/GridRenderLayerView.java +304 -304
  85. package/lib/module/android/src/main/java/com/aguacerowx/reactnative/GridRenderManager.java +125 -125
  86. package/lib/module/android/src/main/java/com/aguacerowx/reactnative/InspectorModule.java +71 -71
  87. package/lib/module/android/src/main/java/com/aguacerowx/reactnative/ShaderUtils.java +106 -106
  88. package/lib/module/android/src/main/java/com/aguacerowx/reactnative/WeatherFrameProcessorModule.java +151 -151
  89. package/lib/module/android/src/main/res/raw/debug_fragment_shader.glsl +12 -12
  90. package/lib/module/android/src/main/res/raw/debug_vertex_shader.glsl +12 -12
  91. package/lib/module/android/src/main/res/raw/fragment_shader.glsl +161 -151
  92. package/lib/module/android/src/main/res/raw/vertex_shader.glsl +19 -19
  93. package/lib/module/babel.config.js.map +1 -1
  94. package/lib/module/index.js.map +1 -1
  95. package/lib/module/ios/AguaceroPackage.m +18 -18
  96. package/lib/module/ios/FragmentUniforms.swift +15 -14
  97. package/lib/module/ios/GridRenderLayer.swift +1003 -995
  98. package/lib/module/ios/GridRenderLayerBridge.swift +29 -29
  99. package/lib/module/ios/GridRenderLayerManager.mm +157 -157
  100. package/lib/module/ios/GridRenderLayerView.h +16 -16
  101. package/lib/module/ios/GridRenderLayerView.m +204 -204
  102. package/lib/module/ios/InspectorDataCache.swift +65 -65
  103. package/lib/module/ios/InspectorModule.m +9 -9
  104. package/lib/module/ios/InspectorModule.swift +63 -63
  105. package/lib/module/ios/Shaders.metal +190 -178
  106. package/lib/module/ios/WeatherFrameProcessorModule.m +15 -15
  107. package/lib/module/ios/WeatherFrameProcessorModule.swift +103 -103
  108. package/lib/module/ios/compiled-shaders/Shaders-device.metallib +0 -0
  109. package/lib/module/ios/compiled-shaders/Shaders-simulator.metallib +0 -0
  110. package/lib/module/lib/commonjs/README.md +126 -126
  111. package/lib/module/lib/commonjs/aguacerowx-react-native.podspec +53 -53
  112. package/lib/module/lib/commonjs/babel.config.js.map +1 -1
  113. package/lib/module/lib/commonjs/index.js.map +1 -1
  114. package/lib/module/lib/commonjs/ios/AguaceroPackage.m +18 -18
  115. package/lib/module/lib/commonjs/package.json +72 -72
  116. package/lib/module/lib/commonjs/react-native-builder-bob.config.js.map +1 -1
  117. package/lib/module/lib/commonjs/scripts/compile-shaders.js.map +1 -1
  118. package/lib/module/lib/commonjs/src/AguaceroContext.js.map +1 -1
  119. package/lib/module/lib/commonjs/src/GridRenderLayer.js.map +1 -1
  120. package/lib/module/lib/commonjs/src/GridRenderLayerNativeComponent.js.map +1 -1
  121. package/lib/module/lib/commonjs/src/MapManager.js.map +1 -1
  122. package/lib/module/lib/commonjs/src/MapRegistry.js.map +1 -1
  123. package/lib/module/lib/commonjs/src/StyleApplicator.js +6 -6
  124. package/lib/module/lib/commonjs/src/StyleApplicator.js.map +1 -1
  125. package/lib/module/lib/commonjs/src/WeatherLayerManager.js +34 -5
  126. package/lib/module/lib/commonjs/src/WeatherLayerManager.js.map +1 -1
  127. package/lib/module/lib/commonjs/tsconfig.json +23 -23
  128. package/lib/module/package.json +72 -72
  129. package/lib/module/react-native-builder-bob.config.js.map +1 -1
  130. package/lib/module/scripts/compile-shaders.js.map +1 -1
  131. package/lib/module/scripts/compile-shaders.sh +38 -38
  132. package/lib/module/src/AguaceroContext.js.map +1 -1
  133. package/lib/module/src/GridRenderLayer.js.map +1 -1
  134. package/lib/module/src/GridRenderLayerNativeComponent.js.map +1 -1
  135. package/lib/module/src/MapManager.js.map +1 -1
  136. package/lib/module/src/MapRegistry.js.map +1 -1
  137. package/lib/module/src/StyleApplicator.js +6 -6
  138. package/lib/module/src/StyleApplicator.js.map +1 -1
  139. package/lib/module/src/WeatherLayerManager.js +34 -5
  140. package/lib/module/src/WeatherLayerManager.js.map +1 -1
  141. package/lib/module/tsconfig.json +23 -23
  142. package/lib/typescript/src/WeatherLayerManager.d.ts.map +1 -1
  143. package/package.json +72 -72
  144. package/src/AguaceroContext.js +3 -3
  145. package/src/GridRenderLayer.js +217 -217
  146. package/src/GridRenderLayerNativeComponent.ts +15 -15
  147. package/src/MapManager.js +155 -155
  148. package/src/MapRegistry.js +34 -34
  149. package/src/StyleApplicator.js +240 -240
  150. package/src/WeatherLayerManager.js +920 -891
  151. package/android/build/.transforms/42e9b8fa82d77a1c205db5bf0d0ed519/results.bin +0 -1
  152. package/android/build/.transforms/42e9b8fa82d77a1c205db5bf0d0ed519/transformed/classes/classes_dex/classes.dex +0 -0
  153. package/android/build/.transforms/c8ab78b63f2cc835ac936d58e29a17ab/results.bin +0 -1
  154. package/android/build/.transforms/c8ab78b63f2cc835ac936d58e29a17ab/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/aguacerowx/reactnative/AguaceroPackage.dex +0 -0
  155. package/android/build/.transforms/c8ab78b63f2cc835ac936d58e29a17ab/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/aguacerowx/reactnative/BuildConfig.dex +0 -0
  156. package/android/build/.transforms/c8ab78b63f2cc835ac936d58e29a17ab/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/aguacerowx/reactnative/GridRenderLayer$VertexInfo.dex +0 -0
  157. package/android/build/.transforms/c8ab78b63f2cc835ac936d58e29a17ab/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/aguacerowx/reactnative/GridRenderLayer.dex +0 -0
  158. package/android/build/.transforms/c8ab78b63f2cc835ac936d58e29a17ab/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/aguacerowx/reactnative/GridRenderLayerView.dex +0 -0
  159. package/android/build/.transforms/c8ab78b63f2cc835ac936d58e29a17ab/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/aguacerowx/reactnative/GridRenderManager.dex +0 -0
  160. package/android/build/.transforms/c8ab78b63f2cc835ac936d58e29a17ab/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/aguacerowx/reactnative/InspectorModule.dex +0 -0
  161. package/android/build/.transforms/c8ab78b63f2cc835ac936d58e29a17ab/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/aguacerowx/reactnative/ShaderUtils.dex +0 -0
  162. package/android/build/.transforms/c8ab78b63f2cc835ac936d58e29a17ab/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/aguacerowx/reactnative/WeatherFrameProcessorModule.dex +0 -0
  163. package/android/build/.transforms/c8ab78b63f2cc835ac936d58e29a17ab/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/facebook/react/viewmanagers/GridRenderLayerManagerDelegate.dex +0 -0
  164. package/android/build/.transforms/c8ab78b63f2cc835ac936d58e29a17ab/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/facebook/react/viewmanagers/GridRenderLayerManagerInterface.dex +0 -0
  165. package/android/build/.transforms/c8ab78b63f2cc835ac936d58e29a17ab/transformed/bundleLibRuntimeToDirDebug/desugar_graph.bin +0 -0
  166. package/android/build/generated/source/buildConfig/debug/com/aguacerowx/reactnative/BuildConfig.java +0 -10
  167. package/android/build/generated/source/codegen/java/com/facebook/react/viewmanagers/GridRenderLayerManagerDelegate.java +0 -43
  168. package/android/build/generated/source/codegen/java/com/facebook/react/viewmanagers/GridRenderLayerManagerInterface.java +0 -22
  169. package/android/build/generated/source/codegen/jni/AguaceroWxReactNativeSpec-generated.cpp +0 -22
  170. package/android/build/generated/source/codegen/jni/AguaceroWxReactNativeSpec.h +0 -24
  171. package/android/build/generated/source/codegen/jni/CMakeLists.txt +0 -28
  172. package/android/build/generated/source/codegen/jni/react/renderer/components/AguaceroWxReactNativeSpec/AguaceroWxReactNativeSpecJSI-generated.cpp +0 -17
  173. package/android/build/generated/source/codegen/jni/react/renderer/components/AguaceroWxReactNativeSpec/AguaceroWxReactNativeSpecJSI.h +0 -19
  174. package/android/build/generated/source/codegen/jni/react/renderer/components/AguaceroWxReactNativeSpec/ComponentDescriptors.cpp +0 -22
  175. package/android/build/generated/source/codegen/jni/react/renderer/components/AguaceroWxReactNativeSpec/ComponentDescriptors.h +0 -24
  176. package/android/build/generated/source/codegen/jni/react/renderer/components/AguaceroWxReactNativeSpec/EventEmitters.cpp +0 -16
  177. package/android/build/generated/source/codegen/jni/react/renderer/components/AguaceroWxReactNativeSpec/EventEmitters.h +0 -23
  178. package/android/build/generated/source/codegen/jni/react/renderer/components/AguaceroWxReactNativeSpec/Props.cpp +0 -62
  179. package/android/build/generated/source/codegen/jni/react/renderer/components/AguaceroWxReactNativeSpec/Props.h +0 -40
  180. package/android/build/generated/source/codegen/jni/react/renderer/components/AguaceroWxReactNativeSpec/ShadowNodes.cpp +0 -17
  181. package/android/build/generated/source/codegen/jni/react/renderer/components/AguaceroWxReactNativeSpec/ShadowNodes.h +0 -32
  182. package/android/build/generated/source/codegen/jni/react/renderer/components/AguaceroWxReactNativeSpec/States.cpp +0 -16
  183. package/android/build/generated/source/codegen/jni/react/renderer/components/AguaceroWxReactNativeSpec/States.h +0 -20
  184. package/android/build/generated/source/codegen/schema.json +0 -1
  185. package/android/build/intermediates/aapt_friendly_merged_manifests/debug/processDebugManifest/aapt/AndroidManifest.xml +0 -8
  186. package/android/build/intermediates/aapt_friendly_merged_manifests/debug/processDebugManifest/aapt/output-metadata.json +0 -18
  187. package/android/build/intermediates/aar_metadata/debug/writeDebugAarMetadata/aar-metadata.properties +0 -6
  188. package/android/build/intermediates/annotation_processor_list/debug/javaPreCompileDebug/annotationProcessors.json +0 -1
  189. package/android/build/intermediates/compile_library_classes_jar/debug/bundleLibCompileToJarDebug/classes.jar +0 -0
  190. package/android/build/intermediates/compile_r_class_jar/debug/generateDebugRFile/R.jar +0 -0
  191. package/android/build/intermediates/compile_symbol_list/debug/generateDebugRFile/R.txt +0 -4
  192. package/android/build/intermediates/compiled_local_resources/debug/compileDebugLibraryResources/out/raw_debug_fragment_shader.glsl.flat +0 -0
  193. package/android/build/intermediates/compiled_local_resources/debug/compileDebugLibraryResources/out/raw_debug_vertex_shader.glsl.flat +0 -0
  194. package/android/build/intermediates/compiled_local_resources/debug/compileDebugLibraryResources/out/raw_fragment_shader.glsl.flat +0 -0
  195. package/android/build/intermediates/compiled_local_resources/debug/compileDebugLibraryResources/out/raw_vertex_shader.glsl.flat +0 -0
  196. package/android/build/intermediates/incremental/debug/packageDebugResources/compile-file-map.properties +0 -5
  197. package/android/build/intermediates/incremental/debug/packageDebugResources/merger.xml +0 -2
  198. package/android/build/intermediates/incremental/mergeDebugAssets/merger.xml +0 -2
  199. package/android/build/intermediates/incremental/mergeDebugJniLibFolders/merger.xml +0 -2
  200. package/android/build/intermediates/incremental/mergeDebugShaders/merger.xml +0 -2
  201. package/android/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/aguacerowx/reactnative/AguaceroPackage.class +0 -0
  202. package/android/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/aguacerowx/reactnative/BuildConfig.class +0 -0
  203. package/android/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/aguacerowx/reactnative/GridRenderLayer$VertexInfo.class +0 -0
  204. package/android/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/aguacerowx/reactnative/GridRenderLayer.class +0 -0
  205. package/android/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/aguacerowx/reactnative/GridRenderLayerView.class +0 -0
  206. package/android/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/aguacerowx/reactnative/GridRenderManager.class +0 -0
  207. package/android/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/aguacerowx/reactnative/InspectorModule.class +0 -0
  208. package/android/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/aguacerowx/reactnative/ShaderUtils.class +0 -0
  209. package/android/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/aguacerowx/reactnative/WeatherFrameProcessorModule.class +0 -0
  210. package/android/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/facebook/react/viewmanagers/GridRenderLayerManagerDelegate.class +0 -0
  211. package/android/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/facebook/react/viewmanagers/GridRenderLayerManagerInterface.class +0 -0
  212. package/android/build/intermediates/local_only_symbol_list/debug/parseDebugLocalResources/R-def.txt +0 -6
  213. package/android/build/intermediates/manifest_merge_blame_file/debug/processDebugManifest/manifest-merger-blame-debug-report.txt +0 -8
  214. package/android/build/intermediates/merged_manifest/debug/processDebugManifest/AndroidManifest.xml +0 -8
  215. package/android/build/intermediates/navigation_json/debug/extractDeepLinksDebug/navigation.json +0 -1
  216. package/android/build/intermediates/nested_resources_validation_report/debug/generateDebugResources/nestedResourcesValidationReport.txt +0 -1
  217. package/android/build/intermediates/packaged_res/debug/packageDebugResources/raw/debug_fragment_shader.glsl +0 -13
  218. package/android/build/intermediates/packaged_res/debug/packageDebugResources/raw/debug_vertex_shader.glsl +0 -13
  219. package/android/build/intermediates/packaged_res/debug/packageDebugResources/raw/fragment_shader.glsl +0 -152
  220. package/android/build/intermediates/packaged_res/debug/packageDebugResources/raw/vertex_shader.glsl +0 -20
  221. package/android/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/com/aguacerowx/reactnative/AguaceroPackage.class +0 -0
  222. package/android/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/com/aguacerowx/reactnative/BuildConfig.class +0 -0
  223. package/android/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/com/aguacerowx/reactnative/GridRenderLayer$VertexInfo.class +0 -0
  224. package/android/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/com/aguacerowx/reactnative/GridRenderLayer.class +0 -0
  225. package/android/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/com/aguacerowx/reactnative/GridRenderLayerView.class +0 -0
  226. package/android/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/com/aguacerowx/reactnative/GridRenderManager.class +0 -0
  227. package/android/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/com/aguacerowx/reactnative/InspectorModule.class +0 -0
  228. package/android/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/com/aguacerowx/reactnative/ShaderUtils.class +0 -0
  229. package/android/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/com/aguacerowx/reactnative/WeatherFrameProcessorModule.class +0 -0
  230. package/android/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/com/facebook/react/viewmanagers/GridRenderLayerManagerDelegate.class +0 -0
  231. package/android/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/com/facebook/react/viewmanagers/GridRenderLayerManagerInterface.class +0 -0
  232. package/android/build/intermediates/runtime_library_classes_jar/debug/bundleLibRuntimeToJarDebug/classes.jar +0 -0
  233. package/android/build/intermediates/symbol_list_with_package_name/debug/generateDebugRFile/package-aware-r.txt +0 -5
  234. package/android/build/outputs/logs/manifest-merger-debug-report.txt +0 -17
  235. package/android/build/tmp/compileDebugJavaWithJavac/compileTransaction/stash-dir/GridRenderLayer$VertexInfo.class.uniqueId0 +0 -0
  236. package/android/build/tmp/compileDebugJavaWithJavac/compileTransaction/stash-dir/GridRenderLayer.class.uniqueId1 +0 -0
  237. package/android/build/tmp/compileDebugJavaWithJavac/compileTransaction/stash-dir/GridRenderLayerView.class.uniqueId2 +0 -0
  238. package/android/build/tmp/compileDebugJavaWithJavac/previous-compilation-data.bin +0 -0
  239. package/lib/commonjs/android/build/generated/source/buildConfig/debug/com/aguacerowx/reactnative/BuildConfig.java +0 -10
  240. package/lib/commonjs/android/build/generated/source/codegen/java/com/facebook/react/viewmanagers/GridRenderLayerManagerDelegate.java +0 -43
  241. package/lib/commonjs/android/build/generated/source/codegen/java/com/facebook/react/viewmanagers/GridRenderLayerManagerInterface.java +0 -22
  242. package/lib/commonjs/android/build/generated/source/codegen/jni/AguaceroWxReactNativeSpec-generated.cpp +0 -22
  243. package/lib/commonjs/android/build/generated/source/codegen/jni/AguaceroWxReactNativeSpec.h +0 -24
  244. package/lib/commonjs/android/build/generated/source/codegen/jni/CMakeLists.txt +0 -28
  245. package/lib/commonjs/android/build/generated/source/codegen/jni/react/renderer/components/AguaceroWxReactNativeSpec/AguaceroWxReactNativeSpecJSI-generated.cpp +0 -17
  246. package/lib/commonjs/android/build/generated/source/codegen/jni/react/renderer/components/AguaceroWxReactNativeSpec/AguaceroWxReactNativeSpecJSI.h +0 -19
  247. package/lib/commonjs/android/build/generated/source/codegen/jni/react/renderer/components/AguaceroWxReactNativeSpec/ComponentDescriptors.cpp +0 -22
  248. package/lib/commonjs/android/build/generated/source/codegen/jni/react/renderer/components/AguaceroWxReactNativeSpec/ComponentDescriptors.h +0 -24
  249. package/lib/commonjs/android/build/generated/source/codegen/jni/react/renderer/components/AguaceroWxReactNativeSpec/EventEmitters.cpp +0 -16
  250. package/lib/commonjs/android/build/generated/source/codegen/jni/react/renderer/components/AguaceroWxReactNativeSpec/EventEmitters.h +0 -23
  251. package/lib/commonjs/android/build/generated/source/codegen/jni/react/renderer/components/AguaceroWxReactNativeSpec/Props.cpp +0 -62
  252. package/lib/commonjs/android/build/generated/source/codegen/jni/react/renderer/components/AguaceroWxReactNativeSpec/Props.h +0 -40
  253. package/lib/commonjs/android/build/generated/source/codegen/jni/react/renderer/components/AguaceroWxReactNativeSpec/ShadowNodes.cpp +0 -17
  254. package/lib/commonjs/android/build/generated/source/codegen/jni/react/renderer/components/AguaceroWxReactNativeSpec/ShadowNodes.h +0 -32
  255. package/lib/commonjs/android/build/generated/source/codegen/jni/react/renderer/components/AguaceroWxReactNativeSpec/States.cpp +0 -16
  256. package/lib/commonjs/android/build/generated/source/codegen/jni/react/renderer/components/AguaceroWxReactNativeSpec/States.h +0 -20
  257. package/lib/commonjs/android/build/generated/source/codegen/schema.json +0 -1
  258. package/lib/commonjs/android/build/intermediates/aapt_friendly_merged_manifests/debug/processDebugManifest/aapt/AndroidManifest.xml +0 -8
  259. package/lib/commonjs/android/build/intermediates/aapt_friendly_merged_manifests/debug/processDebugManifest/aapt/output-metadata.json +0 -18
  260. package/lib/commonjs/android/build/intermediates/aar_metadata/debug/writeDebugAarMetadata/aar-metadata.properties +0 -6
  261. package/lib/commonjs/android/build/intermediates/annotation_processor_list/debug/javaPreCompileDebug/annotationProcessors.json +0 -1
  262. package/lib/commonjs/android/build/intermediates/compile_library_classes_jar/debug/bundleLibCompileToJarDebug/classes.jar +0 -0
  263. package/lib/commonjs/android/build/intermediates/compile_r_class_jar/debug/generateDebugRFile/R.jar +0 -0
  264. package/lib/commonjs/android/build/intermediates/compile_symbol_list/debug/generateDebugRFile/R.txt +0 -4
  265. package/lib/commonjs/android/build/intermediates/compiled_local_resources/debug/compileDebugLibraryResources/out/raw_debug_fragment_shader.glsl.flat +0 -0
  266. package/lib/commonjs/android/build/intermediates/compiled_local_resources/debug/compileDebugLibraryResources/out/raw_debug_vertex_shader.glsl.flat +0 -0
  267. package/lib/commonjs/android/build/intermediates/compiled_local_resources/debug/compileDebugLibraryResources/out/raw_fragment_shader.glsl.flat +0 -0
  268. package/lib/commonjs/android/build/intermediates/compiled_local_resources/debug/compileDebugLibraryResources/out/raw_vertex_shader.glsl.flat +0 -0
  269. package/lib/commonjs/android/build/intermediates/incremental/debug/packageDebugResources/compile-file-map.properties +0 -5
  270. package/lib/commonjs/android/build/intermediates/incremental/debug/packageDebugResources/merger.xml +0 -2
  271. package/lib/commonjs/android/build/intermediates/incremental/mergeDebugAssets/merger.xml +0 -2
  272. package/lib/commonjs/android/build/intermediates/incremental/mergeDebugJniLibFolders/merger.xml +0 -2
  273. package/lib/commonjs/android/build/intermediates/incremental/mergeDebugShaders/merger.xml +0 -2
  274. package/lib/commonjs/android/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/aguacerowx/reactnative/AguaceroPackage.class +0 -0
  275. package/lib/commonjs/android/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/aguacerowx/reactnative/BuildConfig.class +0 -0
  276. package/lib/commonjs/android/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/aguacerowx/reactnative/GridRenderLayer$VertexInfo.class +0 -0
  277. package/lib/commonjs/android/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/aguacerowx/reactnative/GridRenderLayer.class +0 -0
  278. package/lib/commonjs/android/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/aguacerowx/reactnative/GridRenderLayerView.class +0 -0
  279. package/lib/commonjs/android/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/aguacerowx/reactnative/GridRenderManager.class +0 -0
  280. package/lib/commonjs/android/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/aguacerowx/reactnative/InspectorModule.class +0 -0
  281. package/lib/commonjs/android/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/aguacerowx/reactnative/ShaderUtils.class +0 -0
  282. package/lib/commonjs/android/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/aguacerowx/reactnative/WeatherFrameProcessorModule.class +0 -0
  283. package/lib/commonjs/android/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/facebook/react/viewmanagers/GridRenderLayerManagerDelegate.class +0 -0
  284. package/lib/commonjs/android/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/facebook/react/viewmanagers/GridRenderLayerManagerInterface.class +0 -0
  285. package/lib/commonjs/android/build/intermediates/local_only_symbol_list/debug/parseDebugLocalResources/R-def.txt +0 -6
  286. package/lib/commonjs/android/build/intermediates/manifest_merge_blame_file/debug/processDebugManifest/manifest-merger-blame-debug-report.txt +0 -8
  287. package/lib/commonjs/android/build/intermediates/merged_manifest/debug/processDebugManifest/AndroidManifest.xml +0 -8
  288. package/lib/commonjs/android/build/intermediates/navigation_json/debug/extractDeepLinksDebug/navigation.json +0 -1
  289. package/lib/commonjs/android/build/intermediates/nested_resources_validation_report/debug/generateDebugResources/nestedResourcesValidationReport.txt +0 -1
  290. package/lib/commonjs/android/build/intermediates/packaged_res/debug/packageDebugResources/raw/debug_fragment_shader.glsl +0 -13
  291. package/lib/commonjs/android/build/intermediates/packaged_res/debug/packageDebugResources/raw/debug_vertex_shader.glsl +0 -13
  292. package/lib/commonjs/android/build/intermediates/packaged_res/debug/packageDebugResources/raw/fragment_shader.glsl +0 -152
  293. package/lib/commonjs/android/build/intermediates/packaged_res/debug/packageDebugResources/raw/vertex_shader.glsl +0 -20
  294. package/lib/commonjs/android/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/com/aguacerowx/reactnative/AguaceroPackage.class +0 -0
  295. package/lib/commonjs/android/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/com/aguacerowx/reactnative/BuildConfig.class +0 -0
  296. package/lib/commonjs/android/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/com/aguacerowx/reactnative/GridRenderLayer$VertexInfo.class +0 -0
  297. package/lib/commonjs/android/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/com/aguacerowx/reactnative/GridRenderLayer.class +0 -0
  298. package/lib/commonjs/android/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/com/aguacerowx/reactnative/GridRenderLayerView.class +0 -0
  299. package/lib/commonjs/android/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/com/aguacerowx/reactnative/GridRenderManager.class +0 -0
  300. package/lib/commonjs/android/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/com/aguacerowx/reactnative/InspectorModule.class +0 -0
  301. package/lib/commonjs/android/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/com/aguacerowx/reactnative/ShaderUtils.class +0 -0
  302. package/lib/commonjs/android/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/com/aguacerowx/reactnative/WeatherFrameProcessorModule.class +0 -0
  303. package/lib/commonjs/android/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/com/facebook/react/viewmanagers/GridRenderLayerManagerDelegate.class +0 -0
  304. package/lib/commonjs/android/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/com/facebook/react/viewmanagers/GridRenderLayerManagerInterface.class +0 -0
  305. package/lib/commonjs/android/build/intermediates/runtime_library_classes_jar/debug/bundleLibRuntimeToJarDebug/classes.jar +0 -0
  306. package/lib/commonjs/android/build/intermediates/symbol_list_with_package_name/debug/generateDebugRFile/package-aware-r.txt +0 -5
  307. package/lib/commonjs/android/build/outputs/logs/manifest-merger-debug-report.txt +0 -17
  308. package/lib/commonjs/android/build/tmp/compileDebugJavaWithJavac/compileTransaction/stash-dir/GridRenderLayer$VertexInfo.class.uniqueId0 +0 -0
  309. package/lib/commonjs/android/build/tmp/compileDebugJavaWithJavac/compileTransaction/stash-dir/GridRenderLayer.class.uniqueId1 +0 -0
  310. package/lib/commonjs/android/build/tmp/compileDebugJavaWithJavac/compileTransaction/stash-dir/GridRenderLayerView.class.uniqueId2 +0 -0
  311. package/lib/commonjs/android/build/tmp/compileDebugJavaWithJavac/previous-compilation-data.bin +0 -0
  312. package/lib/module/android/build/generated/source/buildConfig/debug/com/aguacerowx/reactnative/BuildConfig.java +0 -10
  313. package/lib/module/android/build/generated/source/codegen/java/com/facebook/react/viewmanagers/GridRenderLayerManagerDelegate.java +0 -43
  314. package/lib/module/android/build/generated/source/codegen/java/com/facebook/react/viewmanagers/GridRenderLayerManagerInterface.java +0 -22
  315. package/lib/module/android/build/generated/source/codegen/jni/AguaceroWxReactNativeSpec-generated.cpp +0 -22
  316. package/lib/module/android/build/generated/source/codegen/jni/AguaceroWxReactNativeSpec.h +0 -24
  317. package/lib/module/android/build/generated/source/codegen/jni/CMakeLists.txt +0 -28
  318. package/lib/module/android/build/generated/source/codegen/jni/react/renderer/components/AguaceroWxReactNativeSpec/AguaceroWxReactNativeSpecJSI-generated.cpp +0 -17
  319. package/lib/module/android/build/generated/source/codegen/jni/react/renderer/components/AguaceroWxReactNativeSpec/AguaceroWxReactNativeSpecJSI.h +0 -19
  320. package/lib/module/android/build/generated/source/codegen/jni/react/renderer/components/AguaceroWxReactNativeSpec/ComponentDescriptors.cpp +0 -22
  321. package/lib/module/android/build/generated/source/codegen/jni/react/renderer/components/AguaceroWxReactNativeSpec/ComponentDescriptors.h +0 -24
  322. package/lib/module/android/build/generated/source/codegen/jni/react/renderer/components/AguaceroWxReactNativeSpec/EventEmitters.cpp +0 -16
  323. package/lib/module/android/build/generated/source/codegen/jni/react/renderer/components/AguaceroWxReactNativeSpec/EventEmitters.h +0 -23
  324. package/lib/module/android/build/generated/source/codegen/jni/react/renderer/components/AguaceroWxReactNativeSpec/Props.cpp +0 -62
  325. package/lib/module/android/build/generated/source/codegen/jni/react/renderer/components/AguaceroWxReactNativeSpec/Props.h +0 -40
  326. package/lib/module/android/build/generated/source/codegen/jni/react/renderer/components/AguaceroWxReactNativeSpec/ShadowNodes.cpp +0 -17
  327. package/lib/module/android/build/generated/source/codegen/jni/react/renderer/components/AguaceroWxReactNativeSpec/ShadowNodes.h +0 -32
  328. package/lib/module/android/build/generated/source/codegen/jni/react/renderer/components/AguaceroWxReactNativeSpec/States.cpp +0 -16
  329. package/lib/module/android/build/generated/source/codegen/jni/react/renderer/components/AguaceroWxReactNativeSpec/States.h +0 -20
  330. package/lib/module/android/build/generated/source/codegen/schema.json +0 -1
  331. package/lib/module/android/build/intermediates/aapt_friendly_merged_manifests/debug/processDebugManifest/aapt/AndroidManifest.xml +0 -8
  332. package/lib/module/android/build/intermediates/aapt_friendly_merged_manifests/debug/processDebugManifest/aapt/output-metadata.json +0 -18
  333. package/lib/module/android/build/intermediates/aar_metadata/debug/writeDebugAarMetadata/aar-metadata.properties +0 -6
  334. package/lib/module/android/build/intermediates/annotation_processor_list/debug/javaPreCompileDebug/annotationProcessors.json +0 -1
  335. package/lib/module/android/build/intermediates/compile_library_classes_jar/debug/bundleLibCompileToJarDebug/classes.jar +0 -0
  336. package/lib/module/android/build/intermediates/compile_r_class_jar/debug/generateDebugRFile/R.jar +0 -0
  337. package/lib/module/android/build/intermediates/compile_symbol_list/debug/generateDebugRFile/R.txt +0 -4
  338. package/lib/module/android/build/intermediates/compiled_local_resources/debug/compileDebugLibraryResources/out/raw_debug_fragment_shader.glsl.flat +0 -0
  339. package/lib/module/android/build/intermediates/compiled_local_resources/debug/compileDebugLibraryResources/out/raw_debug_vertex_shader.glsl.flat +0 -0
  340. package/lib/module/android/build/intermediates/compiled_local_resources/debug/compileDebugLibraryResources/out/raw_fragment_shader.glsl.flat +0 -0
  341. package/lib/module/android/build/intermediates/compiled_local_resources/debug/compileDebugLibraryResources/out/raw_vertex_shader.glsl.flat +0 -0
  342. package/lib/module/android/build/intermediates/incremental/debug/packageDebugResources/compile-file-map.properties +0 -5
  343. package/lib/module/android/build/intermediates/incremental/debug/packageDebugResources/merger.xml +0 -2
  344. package/lib/module/android/build/intermediates/incremental/mergeDebugAssets/merger.xml +0 -2
  345. package/lib/module/android/build/intermediates/incremental/mergeDebugJniLibFolders/merger.xml +0 -2
  346. package/lib/module/android/build/intermediates/incremental/mergeDebugShaders/merger.xml +0 -2
  347. package/lib/module/android/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/aguacerowx/reactnative/AguaceroPackage.class +0 -0
  348. package/lib/module/android/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/aguacerowx/reactnative/BuildConfig.class +0 -0
  349. package/lib/module/android/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/aguacerowx/reactnative/GridRenderLayer$VertexInfo.class +0 -0
  350. package/lib/module/android/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/aguacerowx/reactnative/GridRenderLayer.class +0 -0
  351. package/lib/module/android/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/aguacerowx/reactnative/GridRenderLayerView.class +0 -0
  352. package/lib/module/android/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/aguacerowx/reactnative/GridRenderManager.class +0 -0
  353. package/lib/module/android/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/aguacerowx/reactnative/InspectorModule.class +0 -0
  354. package/lib/module/android/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/aguacerowx/reactnative/ShaderUtils.class +0 -0
  355. package/lib/module/android/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/aguacerowx/reactnative/WeatherFrameProcessorModule.class +0 -0
  356. package/lib/module/android/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/facebook/react/viewmanagers/GridRenderLayerManagerDelegate.class +0 -0
  357. package/lib/module/android/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/facebook/react/viewmanagers/GridRenderLayerManagerInterface.class +0 -0
  358. package/lib/module/android/build/intermediates/local_only_symbol_list/debug/parseDebugLocalResources/R-def.txt +0 -6
  359. package/lib/module/android/build/intermediates/manifest_merge_blame_file/debug/processDebugManifest/manifest-merger-blame-debug-report.txt +0 -8
  360. package/lib/module/android/build/intermediates/merged_manifest/debug/processDebugManifest/AndroidManifest.xml +0 -8
  361. package/lib/module/android/build/intermediates/navigation_json/debug/extractDeepLinksDebug/navigation.json +0 -1
  362. package/lib/module/android/build/intermediates/nested_resources_validation_report/debug/generateDebugResources/nestedResourcesValidationReport.txt +0 -1
  363. package/lib/module/android/build/intermediates/packaged_res/debug/packageDebugResources/raw/debug_fragment_shader.glsl +0 -13
  364. package/lib/module/android/build/intermediates/packaged_res/debug/packageDebugResources/raw/debug_vertex_shader.glsl +0 -13
  365. package/lib/module/android/build/intermediates/packaged_res/debug/packageDebugResources/raw/fragment_shader.glsl +0 -152
  366. package/lib/module/android/build/intermediates/packaged_res/debug/packageDebugResources/raw/vertex_shader.glsl +0 -20
  367. package/lib/module/android/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/com/aguacerowx/reactnative/AguaceroPackage.class +0 -0
  368. package/lib/module/android/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/com/aguacerowx/reactnative/BuildConfig.class +0 -0
  369. package/lib/module/android/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/com/aguacerowx/reactnative/GridRenderLayer$VertexInfo.class +0 -0
  370. package/lib/module/android/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/com/aguacerowx/reactnative/GridRenderLayer.class +0 -0
  371. package/lib/module/android/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/com/aguacerowx/reactnative/GridRenderLayerView.class +0 -0
  372. package/lib/module/android/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/com/aguacerowx/reactnative/GridRenderManager.class +0 -0
  373. package/lib/module/android/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/com/aguacerowx/reactnative/InspectorModule.class +0 -0
  374. package/lib/module/android/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/com/aguacerowx/reactnative/ShaderUtils.class +0 -0
  375. package/lib/module/android/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/com/aguacerowx/reactnative/WeatherFrameProcessorModule.class +0 -0
  376. package/lib/module/android/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/com/facebook/react/viewmanagers/GridRenderLayerManagerDelegate.class +0 -0
  377. package/lib/module/android/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/com/facebook/react/viewmanagers/GridRenderLayerManagerInterface.class +0 -0
  378. package/lib/module/android/build/intermediates/runtime_library_classes_jar/debug/bundleLibRuntimeToJarDebug/classes.jar +0 -0
  379. package/lib/module/android/build/intermediates/symbol_list_with_package_name/debug/generateDebugRFile/package-aware-r.txt +0 -5
  380. package/lib/module/android/build/outputs/logs/manifest-merger-debug-report.txt +0 -17
  381. package/lib/module/android/build/tmp/compileDebugJavaWithJavac/compileTransaction/stash-dir/GridRenderLayer$VertexInfo.class.uniqueId0 +0 -0
  382. package/lib/module/android/build/tmp/compileDebugJavaWithJavac/compileTransaction/stash-dir/GridRenderLayer.class.uniqueId1 +0 -0
  383. package/lib/module/android/build/tmp/compileDebugJavaWithJavac/compileTransaction/stash-dir/GridRenderLayerView.class.uniqueId2 +0 -0
  384. package/lib/module/android/build/tmp/compileDebugJavaWithJavac/previous-compilation-data.bin +0 -0
  385. package/lib/module/lib/commonjs/android/build.gradle +0 -108
  386. package/lib/module/lib/commonjs/android/src/main/AndroidManifest.xml +0 -7
  387. package/lib/module/lib/commonjs/ios/FragmentUniforms.swift +0 -15
  388. package/lib/module/lib/commonjs/ios/GridRenderLayer.swift +0 -995
  389. package/lib/module/lib/commonjs/ios/GridRenderLayerBridge.swift +0 -30
  390. package/lib/module/lib/commonjs/ios/GridRenderLayerManager.mm +0 -158
  391. package/lib/module/lib/commonjs/ios/GridRenderLayerView.h +0 -17
  392. package/lib/module/lib/commonjs/ios/GridRenderLayerView.m +0 -205
  393. package/lib/module/lib/commonjs/ios/InspectorDataCache.swift +0 -66
  394. package/lib/module/lib/commonjs/ios/InspectorModule.m +0 -10
  395. package/lib/module/lib/commonjs/ios/InspectorModule.swift +0 -64
  396. package/lib/module/lib/commonjs/ios/Shaders.metal +0 -179
  397. package/lib/module/lib/commonjs/ios/WeatherFrameProcessorModule.m +0 -16
  398. package/lib/module/lib/commonjs/ios/WeatherFrameProcessorModule.swift +0 -104
  399. package/lib/module/lib/commonjs/ios/compiled-shaders/Shaders-device.metallib +0 -0
  400. package/lib/module/lib/commonjs/ios/compiled-shaders/Shaders-simulator.metallib +0 -0
  401. package/lib/module/lib/commonjs/ios/compiled-shaders/Shaders.metallib +0 -0
  402. package/lib/module/lib/commonjs/ios/generated/AguaceroWxReactNativeSpec-generated.mm +0 -0
  403. package/lib/module/lib/commonjs/ios/generated/AguaceroWxReactNativeSpec.h +0 -0
  404. package/lib/module/lib/commonjs/scripts/compile-shaders.sh +0 -39
@@ -1,892 +1,921 @@
1
- // packages/react-native/src/WeatherLayerManager.js
2
-
3
- import React, { useState, useRef, useContext, useEffect, forwardRef, useImperativeHandle, useMemo } from 'react';
4
- import { AguaceroCore, getUnitConversionFunction } from '@aguacerowx/javascript-sdk';
5
- import { AguaceroContext } from './AguaceroContext';
6
- import { GridRenderLayer } from './GridRenderLayer';
7
- import { fromByteArray } from 'base64-js';
8
- import { Platform, NativeModules } from 'react-native';
9
- import { mapRegistry } from './MapRegistry';
10
-
11
- console.log("--- Aguacero Native Module Initial State Check ---");
12
- console.log("All NativeModules:", Object.keys(NativeModules));
13
- console.log("WeatherFrameProcessorModule available?:", !!NativeModules.WeatherFrameProcessorModule);
14
- console.log("InspectorModule available?:", !!NativeModules.InspectorModule);
15
- console.log("GridRenderLayerManager available?:", !!NativeModules.GridRenderLayerManager);
16
- console.log("-------------------------------------------------");
17
-
18
- const { WeatherFrameProcessorModule, InspectorModule } = NativeModules;
19
-
20
- /**
21
- * A helper function to generate the raw RGBA byte buffer for the colormap texture.
22
- */
23
- const _generateColormapBytes = (colormap) => {
24
- const width = 256;
25
- const data = new Uint8Array(width * 4);
26
- const stops = colormap.reduce((acc, _, i) => (i % 2 === 0 ? [...acc, { value: colormap[i], color: colormap[i + 1] }] : acc), []);
27
-
28
- if (stops.length === 0) return data;
29
-
30
- const minVal = stops[0].value;
31
- const maxVal = stops[stops.length - 1].value;
32
-
33
- const hexToRgb = (hex) => {
34
- const r = parseInt(hex.slice(1, 3), 16);
35
- const g = parseInt(hex.slice(3, 5), 16);
36
- const b = parseInt(hex.slice(5, 7), 16);
37
- return [r, g, b];
38
- };
39
-
40
- for (let i = 0; i < width; i++) {
41
- const val = minVal + (i / (width - 1)) * (maxVal - minVal);
42
- let lower = stops[0];
43
- let upper = stops[stops.length - 1];
44
- for (let j = 0; j < stops.length - 1; j++) {
45
- if (val >= stops[j].value && val <= stops[j + 1].value) {
46
- lower = stops[j];
47
- upper = stops[j + 1];
48
- break;
49
- }
50
- }
51
- const t = (val - lower.value) / (upper.value - lower.value || 1);
52
- const lowerRgb = hexToRgb(lower.color);
53
- const upperRgb = hexToRgb(upper.color);
54
- const rgb = lowerRgb.map((c, idx) => c * (1 - t) + upperRgb[idx] * t);
55
-
56
- const offset = i * 4;
57
- data[offset + 0] = Math.round(rgb[0]);
58
- data[offset + 1] = Math.round(rgb[1]);
59
- data[offset + 2] = Math.round(rgb[2]);
60
- data[offset + 3] = 255;
61
- }
62
- return data;
63
- };
64
-
65
- AguaceroCore.prototype.setMapCenter = function(center) {
66
- this.emit('map:move', center);
67
- };
68
-
69
- export const WeatherLayerManager = forwardRef((props, ref) => {
70
- const { inspectorEnabled, onInspect, apiKey, customColormaps, ...restProps } = props;
71
- const context = useContext(AguaceroContext);
72
-
73
- // Create the core here instead of getting it from context
74
- const core = useMemo(() => new AguaceroCore({
75
- apiKey: apiKey,
76
- customColormaps: customColormaps
77
- }), [apiKey]);
78
-
79
- const gridLayerRef = useRef(null);
80
- const currentGridDataRef = useRef(null);
81
-
82
- // Cache for preloaded grid data - stores the processed data ready for GPU upload
83
- const preloadedDataCache = useRef(new Map());
84
-
85
- // Track what we're currently preloading to avoid duplicates
86
- const preloadingSet = useRef(new Set());
87
-
88
- // Store geometry and colormap that don't change with forecast hour
89
- const cachedGeometry = useRef(null);
90
- const cachedColormap = useRef(null);
91
- const cachedDataRange = useRef([0, 1]);
92
-
93
- // Track if we've done the initial load
94
- const hasInitialLoad = useRef(false);
95
- const hasPreloadedRef = useRef(false);
96
-
97
- // Track the last state we processed to avoid redundant updates
98
- const lastProcessedState = useRef(null);
99
- const previousStateRef = useRef(null);
100
-
101
- const [renderProps, setRenderProps] = useState({
102
- opacity: 1,
103
- dataRange: [0, 1]
104
- });
105
-
106
- useImperativeHandle(ref, () => {
107
- return {
108
- play: () => {
109
- core.play();
110
- },
111
- pause: () => {
112
- core.pause();
113
- },
114
- togglePlay: () => {
115
- core.togglePlay();
116
- },
117
- step: (direction) => {
118
- core.step(direction);
119
- },
120
- setPlaybackSpeed: (speed) => core.setPlaybackSpeed(speed),
121
- setOpacity: (opacity) => core.setOpacity(opacity),
122
- setUnits: (units) => core.setUnits(units),
123
- switchMode: (options) => core.switchMode(options),
124
- getAvailableVariables: (model) => core.getAvailableVariables(model),
125
- getVariableDisplayName: (code) => core.getVariableDisplayName(code),
126
- setRun: (runString) => core.setState({ run: runString.split(':')[1] }),
127
- setState: (newState) => core.setState(newState),
128
- setMRMSTimestamp: (timestamp) => core.setMRMSTimestamp(timestamp),
129
- setSmoothing: (enabled) => {
130
- if (gridLayerRef.current) {
131
- gridLayerRef.current.setSmoothing(enabled);
132
- }
133
- },
134
- };
135
- }, [core]);
136
-
137
- const preloadAllFramesToDisk = (state) => {
138
-
139
- if (hasPreloadedRef.current) {
140
- console.log('✅ [Preload] Gating preload; already initiated for this dataset.');
141
- return;
142
- }
143
- hasPreloadedRef.current = true;
144
- console.log('🚀 [Preload] Initiating parallel preload for new dataset...');
145
-
146
- const { isMRMS, model, date, run, variable, units, availableHours, availableTimestamps, forecastHour, mrmsTimestamp } = state;
147
-
148
- // NEW: Fix the current forecast hour if it's invalid for this variable/model combo
149
- let effectiveForecastHour = forecastHour;
150
- if (!isMRMS && variable === 'ptypeRefl' && model === 'hrrr' && forecastHour === 0) {
151
- const validHours = availableHours.filter(hour => hour !== 0);
152
- effectiveForecastHour = validHours.length > 0 ? validHours[0] : 0;
153
- console.log(`⚠️ [Preload] Correcting invalid hour 0 to ${effectiveForecastHour} for HRRR ptypeRefl`);
154
- }
155
-
156
- if (!cachedGeometry.current || !cachedColormap.current) {
157
- const gridModel = isMRMS ? 'mrms' : model;
158
- const { corners, gridDef } = core._getGridCornersAndDef(gridModel);
159
- gridLayerRef.current.updateGeometry(corners, gridDef);
160
- cachedGeometry.current = { model: gridModel, variable };
161
-
162
- const { colormap, baseUnit } = core._getColormapForVariable(variable);
163
- const toUnit = core._getTargetUnit(baseUnit, units);
164
- const finalColormap = core._convertColormapUnits(colormap, baseUnit, toUnit);
165
- const dataRange = [finalColormap[0], finalColormap[finalColormap.length - 2]];
166
- const colormapBytes = _generateColormapBytes(finalColormap);
167
- const colormapAsBase64 = fromByteArray(colormapBytes);
168
-
169
- gridLayerRef.current.updateColormapTexture(colormapAsBase64);
170
- cachedColormap.current = { key: `${variable}-${units}` };
171
- cachedDataRange.current = dataRange;
172
-
173
- setRenderProps({ opacity: state.opacity, dataRange: dataRange });
174
- hasInitialLoad.current = true;
175
- }
176
-
177
- // Apply the same filtering logic as in AguaceroCore._emitStateChange
178
- let filteredHours = availableHours;
179
- if (!isMRMS && variable === 'ptypeRefl' && model === 'hrrr' && availableHours && availableHours.length > 0) {
180
- filteredHours = availableHours.filter(hour => hour !== 0);
181
- }
182
-
183
- const allFrames = isMRMS ? availableTimestamps : filteredHours;
184
- if (!allFrames || allFrames.length === 0) {
185
- console.warn('🟡 [preloadAllFramesToDisk] No frames available to download.');
186
- return;
187
- }
188
-
189
- const currentFrame = isMRMS ? mrmsTimestamp : effectiveForecastHour;
190
- const prioritizedFrames = [
191
- currentFrame,
192
- ...allFrames.filter(frame => frame !== currentFrame)
193
- ];
194
- console.log(`[Preload] Prioritizing frame: ${currentFrame}. Total frames: ${prioritizedFrames.length}`);
195
-
196
- const { corners, gridDef } = core._getGridCornersAndDef(isMRMS ? 'mrms' : model);
197
- const { nx, ny } = gridDef.grid_params;
198
-
199
- prioritizedFrames.forEach((frame, index) => {
200
- const cacheKey = isMRMS ? `mrms-${frame}-${variable}` : `${model}-${date}-${run}-${frame}-${variable}`;
201
- if (preloadedDataCache.current.has(cacheKey)) {
202
- return;
203
- }
204
-
205
- let resourcePath;
206
- if (isMRMS) {
207
- const frameDate = new Date(frame * 1000);
208
- const y = frameDate.getUTCFullYear();
209
- const m = (frameDate.getUTCMonth() + 1).toString().padStart(2, '0');
210
- const d = frameDate.getUTCDate().toString().padStart(2, '0');
211
- resourcePath = `/grids/mrms/${y}${m}${d}/${frame}/0/${variable}/0`;
212
- } else {
213
- resourcePath = `/grids/${model}/${date}/${run}/${frame}/${variable}/0`;
214
- }
215
-
216
- const url = `${core.baseGridUrl}${resourcePath}?apiKey=${core.apiKey}`;
217
- const options = { url, apiKey: core.apiKey, bundleId: core.bundleId };
218
-
219
- WeatherFrameProcessorModule.processFrame(options)
220
- .then(result => {
221
- if (!result || !result.filePath) {
222
- console.warn(`⚠️ [preloadAllFramesToDisk] Failed frame ${frame}: No filePath`);
223
- return;
224
- }
225
-
226
- const { baseUnit } = core._getColormapForVariable(variable);
227
- const toUnit = core._getTargetUnit(baseUnit, units);
228
-
229
- let dataScale = result.scale;
230
- let dataOffset = result.offset;
231
-
232
- let convertedScale = dataScale;
233
- let convertedOffset = dataOffset;
234
-
235
- if (baseUnit !== toUnit) {
236
- const conversionFunc = getUnitConversionFunction(baseUnit, toUnit);
237
- if (conversionFunc) {
238
- if (result.scaleType === 'sqrt') {
239
- const physicalAtOffset = dataOffset * dataOffset;
240
- const physicalAtOffsetPlusScale = (dataOffset + dataScale) * (dataOffset + dataScale);
241
- const convertedPhysicalAtOffset = conversionFunc(physicalAtOffset);
242
- const convertedPhysicalAtOffsetPlusScale = conversionFunc(physicalAtOffsetPlusScale);
243
- convertedOffset = Math.sqrt(Math.abs(convertedPhysicalAtOffset)) * Math.sign(convertedPhysicalAtOffset);
244
- const newOffsetPlusScale = Math.sqrt(Math.abs(convertedPhysicalAtOffsetPlusScale)) * Math.sign(convertedPhysicalAtOffsetPlusScale);
245
- convertedScale = newOffsetPlusScale - convertedOffset;
246
- } else {
247
- convertedOffset = conversionFunc(dataOffset);
248
- const convertedOffsetPlusScale = conversionFunc(dataOffset + dataScale);
249
- convertedScale = convertedOffsetPlusScale - convertedOffset;
250
- }
251
- }
252
- }
253
-
254
- const frameData = {
255
- filePath: result.filePath,
256
- nx, ny,
257
- scale: convertedScale,
258
- offset: convertedOffset,
259
- missing: result.missing,
260
- corners,
261
- gridDef,
262
- scaleType: result.scaleType,
263
- originalScale: result.scale,
264
- originalOffset: result.offset
265
- };
266
-
267
- preloadedDataCache.current.set(cacheKey, frameData);
268
-
269
- const isCurrentFrame = index === 0;
270
-
271
- if (isCurrentFrame) {
272
- console.log(`🎯 [Preload] Using FAST LANE to process and draw current frame (${frame}) immediately.`);
273
- gridLayerRef.current.updateDataTextureFromFile(
274
- frameData.filePath,
275
- frameData.nx, frameData.ny,
276
- frameData.scale, frameData.offset, frameData.missing,
277
- frameData.scaleType
278
- );
279
-
280
- currentGridDataRef.current = {
281
- nx: frameData.nx,
282
- ny: frameData.ny,
283
- scale: frameData.scale,
284
- offset: frameData.offset,
285
- missing: frameData.missing,
286
- gridDef: frameData.gridDef,
287
- variable: variable,
288
- units: units
289
- };
290
- } else {
291
- if (Platform.OS === 'ios' && gridLayerRef.current.primeGpuCache) {
292
- const frameInfoForGpu = {
293
- [cacheKey]: {
294
- filePath: frameData.filePath,
295
- nx: frameData.nx,
296
- ny: frameData.ny,
297
- scale: frameData.scale,
298
- offset: frameData.offset,
299
- missing: frameData.missing,
300
- scaleType: frameData.scaleType || 'linear',
301
- originalScale: frameData.originalScale,
302
- originalOffset: frameData.originalOffset
303
- }
304
- };
305
- gridLayerRef.current.primeGpuCache(frameInfoForGpu);
306
- }
307
- }
308
- })
309
- .catch(error => {
310
- console.warn(`⚠️ [preloadAllFramesToDisk] Failed frame ${frame}:`, error);
311
- });
312
- });
313
- };
314
-
315
- const updateGPUWithCachedData = (state) => {
316
- const { model, date, run, forecastHour, variable, units, isMRMS, mrmsTimestamp } = state;
317
-
318
- const cacheKey = isMRMS
319
- ? `mrms-${mrmsTimestamp}-${variable}`
320
- : `${model}-${date}-${run}-${forecastHour}-${variable}`;
321
-
322
- if (Platform.OS === 'ios' && gridLayerRef.current.setActiveFrame) {
323
- // Get the cached data BEFORE calling setActiveFrame
324
- const cachedData = preloadedDataCache.current.get(cacheKey);
325
-
326
- if (cachedData) {
327
- currentGridDataRef.current = {
328
- nx: cachedData.nx,
329
- ny: cachedData.ny,
330
- scale: cachedData.scale,
331
- offset: cachedData.offset,
332
- missing: cachedData.missing,
333
- gridDef: cachedData.gridDef,
334
- variable: variable,
335
- units: units,
336
- scaleType: cachedData.scaleType
337
- };
338
-
339
- console.log('📱 [iOS] Updated currentGridDataRef for inspector:', {
340
- scale: cachedData.scale,
341
- offset: cachedData.offset,
342
- scaleType: cachedData.scaleType // ADD THIS
343
- });
344
- }
345
-
346
- // Now call setActiveFrame (which will async update the native cache)
347
- gridLayerRef.current.setActiveFrame(cacheKey);
348
- return true;
349
- }
350
-
351
- const cachedData = preloadedDataCache.current.get(cacheKey);
352
-
353
- if (!cachedData) {
354
- const timeKey = isMRMS ? `timestamp ${mrmsTimestamp}` : `hour +${forecastHour}`;
355
- console.log(`⏳ [updateGPUWithCachedData] Frame not ready yet for ${timeKey}. Still preloading...`); // CHANGED
356
- return false;
357
- }
358
-
359
- if (!gridLayerRef.current) {
360
- console.warn(`⚠️ [updateGPUWithCachedData] GridLayer ref not available`); // CHANGED
361
- return false;
362
- }
363
-
364
- if (!cachedGeometry.current || cachedGeometry.current.model !== (isMRMS ? 'mrms' : model) || cachedGeometry.current.variable !== variable) {
365
- gridLayerRef.current.updateGeometry(cachedData.corners, cachedData.gridDef);
366
- cachedGeometry.current = { model: (isMRMS ? 'mrms' : model), variable };
367
- }
368
-
369
- const colormapKey = `${variable}-${units}`;
370
- if (!cachedColormap.current || cachedColormap.current.key !== colormapKey) {
371
- const { colormap, baseUnit } = core._getColormapForVariable(variable);
372
- const toUnit = core._getTargetUnit(baseUnit, units);
373
- const finalColormap = core._convertColormapUnits(colormap, baseUnit, toUnit);
374
- const dataRange = [finalColormap[0], finalColormap[finalColormap.length - 2]];
375
- const colormapBytes = _generateColormapBytes(finalColormap);
376
- const colormapAsBase64 = fromByteArray(colormapBytes);
377
-
378
- gridLayerRef.current.updateColormapTexture(colormapAsBase64);
379
- cachedColormap.current = { key: colormapKey };
380
- cachedDataRange.current = dataRange;
381
-
382
- setRenderProps(prev => ({ ...prev, dataRange }));
383
- }
384
-
385
- if (cachedData.filePath) {
386
- gridLayerRef.current.updateDataTextureFromFile(
387
- cachedData.filePath,
388
- cachedData.nx, cachedData.ny,
389
- cachedData.scale, cachedData.offset, cachedData.missing,
390
- cachedData.scaleType
391
- );
392
-
393
- // ADD THIS: Update inspector cache for file-based data too
394
- currentGridDataRef.current = {
395
- nx: cachedData.nx,
396
- ny: cachedData.ny,
397
- scale: cachedData.scale,
398
- offset: cachedData.offset,
399
- missing: cachedData.missing,
400
- gridDef: cachedData.gridDef,
401
- variable: variable,
402
- units: units
403
- };
404
- } else if (cachedData.dataAsBase64) {
405
- gridLayerRef.current.updateDataTexture(
406
- cachedData.dataAsBase64,
407
- cachedData.nx, cachedData.ny,
408
- cachedData.scale, cachedData.offset, cachedData.missing,
409
- cachedData.scaleType
410
- );
411
-
412
- // Update the inspector cache when using dataAsBase64
413
- const binaryString = atob(cachedData.dataAsBase64);
414
- const uint8Array = new Uint8Array(binaryString.length);
415
-
416
- for (let i = 0; i < binaryString.length; i++) {
417
- uint8Array[i] = binaryString.charCodeAt(i);
418
- }
419
-
420
- currentGridDataRef.current = {
421
- data: uint8Array,
422
- nx: cachedData.nx,
423
- ny: cachedData.ny,
424
- scale: cachedData.scale,
425
- offset: cachedData.offset,
426
- missing: cachedData.missing,
427
- gridDef: cachedData.gridDef,
428
- variable: variable,
429
- units: units
430
- };
431
- } else {
432
- console.error(`❌ [updateGPUWithCachedData] Cached data has no filePath or dataAsBase64!`);
433
- console.error('❌ [updateGPUWithCachedData] Cached data keys:', Object.keys(cachedData));
434
- return false;
435
- }
436
-
437
- // Update inspector parameters for file-based data too
438
- if (gridLayerRef.current && gridLayerRef.current.updateDataParameters) {
439
- gridLayerRef.current.updateDataParameters(cachedData.scale, cachedData.offset, cachedData.missing);
440
- }
441
- return true;
442
- };
443
-
444
- const handleStateChangeRef = useRef(null);
445
- const debounceTimeoutRef = useRef(null);
446
-
447
- useEffect(() => {
448
- if (core && props.customColormaps) {
449
- core.customColormaps = props.customColormaps;
450
- // Trigger a re-render if we already have data loaded
451
- if (hasInitialLoad.current) {
452
- core._emitStateChange();
453
- }
454
- }
455
- }, [core, props.customColormaps]);
456
-
457
- const getValueAtPoint = async (lng, lat) => {
458
- if (!core) {
459
- console.warn('🔍 [Inspector] Core not available');
460
- return null;
461
- }
462
-
463
- // ADD THIS: Check if we have valid data before attempting inspection
464
- if (!currentGridDataRef.current) {
465
- console.log('🔍 [Inspector] No grid data available');
466
- return null;
467
- }
468
-
469
- try {
470
- const gridIndices = core._getGridIndexFromLngLat(lng, lat);
471
- if (!gridIndices) return null;
472
-
473
- const { i, j } = gridIndices;
474
-
475
- const value = await InspectorModule.getValueAtGridIndex(i, j);
476
-
477
- if (value === null) {
478
- return null;
479
- }
480
-
481
- const { colormap, baseUnit } = core._getColormapForVariable(core.state.variable);
482
- const displayUnit = core._getTargetUnit(baseUnit, core.state.units);
483
- const finalColormap = core._convertColormapUnits(colormap, baseUnit, displayUnit);
484
- const minThreshold = finalColormap[0];
485
-
486
- if (value < minThreshold) {
487
- console.log('🔍 [Inspector] Rejected: below threshold'); // ADD THIS LOG
488
- return null;
489
- }
490
-
491
- // Filter out values below the minimum threshold (matching shader behavior)
492
- if (value < minThreshold) {
493
- return null;
494
- }
495
-
496
- // Also check if value is NaN or effectively missing
497
- if (!isFinite(value)) {
498
- return null;
499
- }
500
-
501
- return {
502
- value: value,
503
- unit: displayUnit,
504
- variable: {
505
- code: core.state.variable,
506
- name: core.getVariableDisplayName(core.state.variable)
507
- },
508
- lngLat: { lng, lat }
509
- };
510
- } catch (error) {
511
- console.error('🔍 [Inspector] Error:', error);
512
- return null;
513
- }
514
- };
515
-
516
- useEffect(() => {
517
- if (!core) {
518
- console.warn('⚠️ [useEffect] Core is not available yet');
519
- return;
520
- }
521
-
522
- const handleStateChange = async (newState) => {
523
- if (!previousStateRef.current) {
524
- previousStateRef.current = core.state;
525
- }
526
-
527
- const variableChanged = !previousStateRef.current || newState.variable !== previousStateRef.current.variable;
528
-
529
- if (variableChanged && gridLayerRef.current?.setVariable) {
530
- gridLayerRef.current.setVariable(newState.variable);
531
- }
532
-
533
- const stateKey = `${newState.model}-${newState.variable}-${newState.date}-${newState.run}-${newState.forecastHour}-${newState.units}-${newState.mrmsTimestamp}`;
534
-
535
- const isOpacityOnlyChange =
536
- hasInitialLoad.current &&
537
- newState.opacity !== renderProps.opacity &&
538
- newState.variable === previousStateRef.current?.variable &&
539
- newState.forecastHour === previousStateRef.current?.forecastHour &&
540
- newState.mrmsTimestamp === previousStateRef.current?.mrmsTimestamp &&
541
- newState.model === previousStateRef.current?.model &&
542
- newState.units === previousStateRef.current?.units;
543
-
544
-
545
- if (!isOpacityOnlyChange && lastProcessedState.current === stateKey) {
546
- return;
547
- }
548
-
549
- if (!isOpacityOnlyChange) {
550
- lastProcessedState.current = stateKey;
551
- }
552
-
553
- props.onStateChange?.(newState);
554
-
555
- if (isOpacityOnlyChange) {
556
- setRenderProps(prev => ({ ...prev, opacity: newState.opacity }));
557
- previousStateRef.current = newState;
558
- return;
559
- }
560
-
561
- // Check if only units changed
562
- const isUnitsOnlyChange =
563
- hasInitialLoad.current &&
564
- newState.model === previousStateRef.current.model &&
565
- newState.isMRMS === previousStateRef.current.isMRMS &&
566
- newState.variable === previousStateRef.current.variable &&
567
- newState.date === previousStateRef.current.date &&
568
- newState.run === previousStateRef.current.run &&
569
- newState.forecastHour === previousStateRef.current.forecastHour &&
570
- newState.mrmsTimestamp === previousStateRef.current.mrmsTimestamp &&
571
- newState.units !== previousStateRef.current.units;
572
-
573
- if (isUnitsOnlyChange) {
574
- const { variable, units, isMRMS, mrmsTimestamp, model, date, run, forecastHour } = newState;
575
- const oldCacheKey = isMRMS
576
- ? `mrms-${mrmsTimestamp}-${variable}`
577
- : `${model}-${date}-${run}-${forecastHour}-${variable}`;
578
-
579
- const cachedData = preloadedDataCache.current.get(oldCacheKey);
580
-
581
- if (cachedData && cachedData.originalScale !== undefined && cachedData.originalOffset !== undefined) {
582
- const { baseUnit } = core._getColormapForVariable(variable);
583
- const toUnit = core._getTargetUnit(baseUnit, units);
584
-
585
- let dataScale = cachedData.originalScale;
586
- let dataOffset = cachedData.originalOffset;
587
-
588
- if (baseUnit !== toUnit) {
589
- const conversionFunc = getUnitConversionFunction(baseUnit, toUnit);
590
- console.log('🔧 [Unit Conversion] Conversion function exists:', !!conversionFunc);
591
-
592
- if (conversionFunc) {
593
- if (cachedData.scaleType === 'sqrt') {
594
- // Calculate what the physical values would be at offset and offset+scale
595
- const physicalAtOffset = dataOffset * dataOffset;
596
- const physicalAtOffsetPlusScale = (dataOffset + dataScale) * (dataOffset + dataScale);
597
-
598
- // Convert these physical values to the new unit
599
- const convertedPhysicalAtOffset = conversionFunc(physicalAtOffset);
600
- const convertedPhysicalAtOffsetPlusScale = conversionFunc(physicalAtOffsetPlusScale);
601
-
602
- // Take sqrt to get back to intermediate values
603
- const newOffset = Math.sqrt(Math.abs(convertedPhysicalAtOffset)) * Math.sign(convertedPhysicalAtOffset);
604
- const newOffsetPlusScale = Math.sqrt(Math.abs(convertedPhysicalAtOffsetPlusScale)) * Math.sign(convertedPhysicalAtOffsetPlusScale);
605
-
606
- dataScale = newOffsetPlusScale - newOffset;
607
- dataOffset = newOffset;
608
- } else {
609
- const convertedOffset = conversionFunc(dataOffset);
610
- const convertedOffsetPlusScale = conversionFunc(dataOffset + dataScale);
611
-
612
- dataScale = convertedOffsetPlusScale - convertedOffset;
613
- dataOffset = convertedOffset;
614
- }
615
- }
616
- }
617
-
618
- // Update the colormap AND data range
619
- const { colormap } = core._getColormapForVariable(variable);
620
- const finalColormap = core._convertColormapUnits(colormap, baseUnit, toUnit);
621
- const dataRange = [finalColormap[0], finalColormap[finalColormap.length - 2]];
622
-
623
- const colormapBytes = _generateColormapBytes(finalColormap);
624
- const colormapAsBase64 = fromByteArray(colormapBytes);
625
-
626
- gridLayerRef.current.updateColormapTexture(colormapAsBase64);
627
- cachedColormap.current = { key: `${variable}-${units}` };
628
- cachedDataRange.current = dataRange;
629
-
630
- setRenderProps(prev => ({ ...prev, dataRange, opacity: newState.opacity }));
631
-
632
- if (gridLayerRef.current && gridLayerRef.current.updateDataParameters) {
633
- const scaleTypeValue = cachedData.scaleType === 'sqrt' ? 1 : 0; // Convert to number
634
-
635
- console.log('🔄 [Unit Conversion] Calling updateDataParameters with:', {
636
- scale: dataScale,
637
- offset: dataOffset,
638
- missing: cachedData.missing,
639
- scaleType: scaleTypeValue
640
- });
641
-
642
- gridLayerRef.current.updateDataParameters(dataScale, dataOffset, cachedData.missing, scaleTypeValue); // Pass scaleType
643
- }
644
-
645
- const newCacheKey = isMRMS
646
- ? `mrms-${mrmsTimestamp}-${variable}`
647
- : `${model}-${date}-${run}-${forecastHour}-${variable}`;
648
-
649
- preloadedDataCache.current.set(newCacheKey, {
650
- ...cachedData,
651
- scale: dataScale,
652
- offset: dataOffset
653
- });
654
-
655
- } else {
656
- console.warn('⚠️ [Unit Conversion] No cached data found for key:', oldCacheKey);
657
- }
658
-
659
- previousStateRef.current = newState;
660
- return;
661
- }
662
-
663
- const needsFullLoad =
664
- !hasInitialLoad.current ||
665
- newState.model !== previousStateRef.current.model ||
666
- newState.isMRMS !== previousStateRef.current.isMRMS ||
667
- newState.variable !== previousStateRef.current.variable ||
668
- newState.date !== previousStateRef.current.date ||
669
- newState.run !== previousStateRef.current.run;
670
-
671
- if (needsFullLoad) {
672
-
673
- if (gridLayerRef.current) {
674
- gridLayerRef.current.setVariable(newState.variable);
675
- gridLayerRef.current.clear();
676
- // --- OPTIMIZATION: Clear the native GPU cache on iOS ---
677
- if (Platform.OS === 'ios' && gridLayerRef.current.clearGpuCache) {
678
- gridLayerRef.current.clearGpuCache();
679
- }
680
- }
681
- hasPreloadedRef.current = false;
682
-
683
- preloadedDataCache.current.clear();
684
- cachedGeometry.current = null;
685
- cachedColormap.current = null;
686
-
687
- // ADD THIS: Clear the inspector cache too
688
- currentGridDataRef.current = null;
689
-
690
- WeatherFrameProcessorModule.cancelAllFrames();
691
-
692
- if (!newState.variable) {
693
- previousStateRef.current = newState;
694
- return;
695
- }
696
-
697
- preloadAllFramesToDisk(newState);
698
- } else if (newState.forecastHour !== previousStateRef.current.forecastHour || (newState.isMRMS && newState.mrmsTimestamp !== previousStateRef.current.mrmsTimestamp)) {
699
- const success = updateGPUWithCachedData(newState);
700
-
701
- if (!success) {
702
- // CHANGED: Don't error, just log and wait for preload
703
- const timeKey = newState.isMRMS ? `timestamp ${newState.mrmsTimestamp}` : `hour +${newState.forecastHour}`;
704
- console.log(`⏳ [handleStateChange] Frame ${timeKey} not ready yet, waiting for preload...`);
705
- // Don't clear the layer - keep showing the previous frame until new one is ready
706
- // The preload will eventually complete and trigger a re-render
707
- } else {
708
- // Only update inspector cache when we successfully loaded new data
709
- if (newState.opacity !== renderProps.opacity) {
710
- setRenderProps(prev => ({ ...prev, opacity: newState.opacity }));
711
- }
712
- }
713
- }
714
-
715
- previousStateRef.current = newState;
716
- };
717
-
718
- handleStateChangeRef.current = handleStateChange;
719
-
720
- const stableHandler = (newState) => {
721
- const isOpacityOnlyChange =
722
- previousStateRef.current &&
723
- newState.opacity !== previousStateRef.current.opacity &&
724
- newState.variable === previousStateRef.current.variable &&
725
- newState.forecastHour === previousStateRef.current.forecastHour &&
726
- newState.mrmsTimestamp === previousStateRef.current.mrmsTimestamp &&
727
- newState.model === previousStateRef.current.model &&
728
- newState.units === previousStateRef.current.units &&
729
- newState.date === previousStateRef.current.date &&
730
- newState.run === previousStateRef.current.run;
731
-
732
- if (isOpacityOnlyChange) {
733
- if (handleStateChangeRef.current) {
734
- handleStateChangeRef.current(newState);
735
- }
736
- return;
737
- }
738
-
739
- if (debounceTimeoutRef.current) {
740
- clearTimeout(debounceTimeoutRef.current);
741
- }
742
-
743
- debounceTimeoutRef.current = setTimeout(() => {
744
- if (handleStateChangeRef.current) {
745
- handleStateChangeRef.current(newState);
746
- }
747
- debounceTimeoutRef.current = null;
748
- }, 50);
749
- };
750
-
751
- core.on('state:change', stableHandler);
752
-
753
- return () => {
754
- core.off('state:change', stableHandler);
755
- if (debounceTimeoutRef.current) {
756
- clearTimeout(debounceTimeoutRef.current);
757
- }
758
- };
759
- }, [core]);
760
-
761
- useEffect(() => {
762
- return () => {
763
- preloadedDataCache.current.clear();
764
- hasInitialLoad.current = false;
765
- lastProcessedState.current = null;
766
- };
767
- }, []);
768
-
769
- const lastInspectorUpdateRef = useRef(0);
770
- const INSPECTOR_THROTTLE_MS = 50;
771
-
772
- useEffect(() => {
773
- if (!core || !inspectorEnabled) {
774
- return;
775
- }
776
-
777
- const handleMapMove = async (center) => {
778
- if (!center || !Array.isArray(center) || center.length !== 2) {
779
- return;
780
- }
781
-
782
- // Throttle updates
783
- const now = Date.now();
784
- if (now - lastInspectorUpdateRef.current < INSPECTOR_THROTTLE_MS) {
785
- return;
786
- }
787
- lastInspectorUpdateRef.current = now;
788
-
789
- const [longitude, latitude] = center;
790
-
791
- const payload = await getValueAtPoint(longitude, latitude);
792
- onInspect?.(payload);
793
- };
794
-
795
- core.on('map:move', handleMapMove);
796
-
797
- if (context && context.getCenter) {
798
- const center = context.getCenter();
799
- if (center) {
800
- handleMapMove(center);
801
- }
802
- }
803
-
804
- return () => {
805
- core.off('map:move', handleMapMove);
806
- };
807
- }, [inspectorEnabled, onInspect, core, context]);
808
-
809
- // Add this new useEffect after the existing inspector useEffect
810
- useEffect(() => {
811
- // Trigger re-inspection when state changes (variable, model, forecast hour, etc.)
812
- if (!core || !inspectorEnabled) {
813
- return;
814
- }
815
-
816
- const triggerReinspection = () => {
817
- const mapRef = mapRegistry.getMap();
818
- const center = mapRef?._currentCenter;
819
-
820
- if (center && Array.isArray(center) && center.length === 2) {
821
- const [longitude, latitude] = center;
822
-
823
- getValueAtPoint(longitude, latitude).then(payload => {
824
- onInspect?.(payload);
825
- });
826
- }
827
- };
828
-
829
- // Small delay to ensure data is loaded before re-inspecting
830
- const timer = setTimeout(triggerReinspection, 100);
831
-
832
- return () => clearTimeout(timer);
833
- }, [
834
- core?.state?.variable,
835
- core?.state?.model,
836
- core?.state?.forecastHour,
837
- core?.state?.mrmsTimestamp,
838
- core?.state?.units,
839
- inspectorEnabled,
840
- onInspect
841
- ]);
842
-
843
- useEffect(() => {
844
- if (!core) {
845
- return;
846
- }
847
-
848
- const handleCameraChange = (center) => {
849
- if (core && center) {
850
- core.setMapCenter(center);
851
- }
852
- };
853
-
854
- // Register with the global registry
855
- mapRegistry.addCameraListener(handleCameraChange);
856
-
857
- // Try to get initial center
858
- const mapRef = mapRegistry.getMap();
859
- if (mapRef?._currentCenter) {
860
- handleCameraChange(mapRef._currentCenter);
861
- }
862
-
863
- return () => {
864
- mapRegistry.removeCameraListener(handleCameraChange);
865
- };
866
- }, [core]);
867
-
868
- useEffect(() => {
869
- core.initialize();
870
- return () => {
871
- core.destroy();
872
- };
873
- }, [core]);
874
-
875
- return (
876
- <GridRenderLayer
877
- ref={gridLayerRef}
878
- opacity={renderProps.opacity}
879
- dataRange={renderProps.dataRange}
880
- belowID="AML_-_terrain"
881
- />
882
- );
883
- });
884
-
885
- WeatherLayerManager.getAvailableVariables = (options) => {
886
- if (!options || !options.apiKey) {
887
- console.error("API key must be provided to get available variables.");
888
- return [];
889
- }
890
- const core = new AguaceroCore({ apiKey: options.apiKey });
891
- return core.getAvailableVariables('mrms');
1
+ // packages/react-native/src/WeatherLayerManager.js
2
+
3
+ import React, { useState, useRef, useContext, useEffect, forwardRef, useImperativeHandle, useMemo } from 'react';
4
+ import { AguaceroCore, getUnitConversionFunction } from '@aguacerowx/javascript-sdk';
5
+ import { AguaceroContext } from './AguaceroContext';
6
+ import { GridRenderLayer } from './GridRenderLayer';
7
+ import { fromByteArray } from 'base64-js';
8
+ import { Platform, NativeModules } from 'react-native';
9
+ import { mapRegistry } from './MapRegistry';
10
+
11
+ console.log("--- Aguacero Native Module Initial State Check ---");
12
+ console.log("All NativeModules:", Object.keys(NativeModules));
13
+ console.log("WeatherFrameProcessorModule available?:", !!NativeModules.WeatherFrameProcessorModule);
14
+ console.log("InspectorModule available?:", !!NativeModules.InspectorModule);
15
+ console.log("GridRenderLayerManager available?:", !!NativeModules.GridRenderLayerManager);
16
+ console.log("-------------------------------------------------");
17
+
18
+ const { WeatherFrameProcessorModule, InspectorModule } = NativeModules;
19
+
20
+ /**
21
+ * A helper function to generate the raw RGBA byte buffer for the colormap texture.
22
+ */
23
+ const _generateColormapBytes = (colormap) => {
24
+ const width = 256;
25
+ const data = new Uint8Array(width * 4);
26
+ const stops = colormap.reduce((acc, _, i) => (i % 2 === 0 ? [...acc, { value: colormap[i], color: colormap[i + 1] }] : acc), []);
27
+
28
+ if (stops.length === 0) return data;
29
+
30
+ const minVal = stops[0].value;
31
+ const maxVal = stops[stops.length - 1].value;
32
+
33
+ const hexToRgb = (hex) => {
34
+ const r = parseInt(hex.slice(1, 3), 16);
35
+ const g = parseInt(hex.slice(3, 5), 16);
36
+ const b = parseInt(hex.slice(5, 7), 16);
37
+ return [r, g, b];
38
+ };
39
+
40
+ for (let i = 0; i < width; i++) {
41
+ const val = minVal + (i / (width - 1)) * (maxVal - minVal);
42
+ let lower = stops[0];
43
+ let upper = stops[stops.length - 1];
44
+ for (let j = 0; j < stops.length - 1; j++) {
45
+ if (val >= stops[j].value && val <= stops[j + 1].value) {
46
+ lower = stops[j];
47
+ upper = stops[j + 1];
48
+ break;
49
+ }
50
+ }
51
+ const t = (val - lower.value) / (upper.value - lower.value || 1);
52
+ const lowerRgb = hexToRgb(lower.color);
53
+ const upperRgb = hexToRgb(upper.color);
54
+ const rgb = lowerRgb.map((c, idx) => c * (1 - t) + upperRgb[idx] * t);
55
+
56
+ const offset = i * 4;
57
+ data[offset + 0] = Math.round(rgb[0]);
58
+ data[offset + 1] = Math.round(rgb[1]);
59
+ data[offset + 2] = Math.round(rgb[2]);
60
+ data[offset + 3] = 255;
61
+ }
62
+ return data;
63
+ };
64
+
65
+ AguaceroCore.prototype.setMapCenter = function(center) {
66
+ this.emit('map:move', center);
67
+ };
68
+
69
+ export const WeatherLayerManager = forwardRef((props, ref) => {
70
+ const { inspectorEnabled, onInspect, apiKey, customColormaps, ...restProps } = props;
71
+ const context = useContext(AguaceroContext);
72
+
73
+ // Create the core here instead of getting it from context
74
+ const core = useMemo(() => new AguaceroCore({
75
+ apiKey: apiKey,
76
+ customColormaps: customColormaps
77
+ }), [apiKey]);
78
+
79
+ const gridLayerRef = useRef(null);
80
+ const currentGridDataRef = useRef(null);
81
+
82
+ // Cache for preloaded grid data - stores the processed data ready for GPU upload
83
+ const preloadedDataCache = useRef(new Map());
84
+
85
+ // Track what we're currently preloading to avoid duplicates
86
+ const preloadingSet = useRef(new Set());
87
+
88
+ // Store geometry and colormap that don't change with forecast hour
89
+ const cachedGeometry = useRef(null);
90
+ const cachedColormap = useRef(null);
91
+ const cachedDataRange = useRef([0, 1]);
92
+
93
+ // Track if we've done the initial load
94
+ const hasInitialLoad = useRef(false);
95
+ const hasPreloadedRef = useRef(false);
96
+
97
+ // Track the last state we processed to avoid redundant updates
98
+ const lastProcessedState = useRef(null);
99
+ const previousStateRef = useRef(null);
100
+
101
+ const [renderProps, setRenderProps] = useState({
102
+ opacity: 1,
103
+ dataRange: [0, 1]
104
+ });
105
+
106
+ useImperativeHandle(ref, () => {
107
+ return {
108
+ play: () => {
109
+ core.play();
110
+ },
111
+ pause: () => {
112
+ core.pause();
113
+ },
114
+ togglePlay: () => {
115
+ core.togglePlay();
116
+ },
117
+ step: (direction) => {
118
+ core.step(direction);
119
+ },
120
+ setPlaybackSpeed: (speed) => core.setPlaybackSpeed(speed),
121
+ setOpacity: (opacity) => core.setOpacity(opacity),
122
+ setUnits: (units) => core.setUnits(units),
123
+ switchMode: (options) => core.switchMode(options),
124
+ getAvailableVariables: (model) => core.getAvailableVariables(model),
125
+ getVariableDisplayName: (code) => core.getVariableDisplayName(code),
126
+ setRun: (runString) => core.setState({ run: runString.split(':')[1] }),
127
+ setState: (newState) => core.setState(newState),
128
+ setMRMSTimestamp: (timestamp) => core.setMRMSTimestamp(timestamp),
129
+ setSmoothing: (enabled) => {
130
+ if (gridLayerRef.current) {
131
+ gridLayerRef.current.setSmoothing(enabled);
132
+ }
133
+ },
134
+ };
135
+ }, [core]);
136
+
137
+ const preloadAllFramesToDisk = (state) => {
138
+
139
+ if (hasPreloadedRef.current) {
140
+ console.log('✅ [Preload] Gating preload; already initiated for this dataset.');
141
+ return;
142
+ }
143
+ hasPreloadedRef.current = true;
144
+ console.log('🚀 [Preload] Initiating parallel preload for new dataset...');
145
+
146
+ const { isMRMS, model, date, run, variable, units, availableHours, availableTimestamps, forecastHour, mrmsTimestamp } = state;
147
+
148
+ // NEW: Fix the current forecast hour if it's invalid for this variable/model combo
149
+ let effectiveForecastHour = forecastHour;
150
+ if (!isMRMS && variable === 'ptypeRefl' && model === 'hrrr' && forecastHour === 0) {
151
+ const validHours = availableHours.filter(hour => hour !== 0);
152
+ effectiveForecastHour = validHours.length > 0 ? validHours[0] : 0;
153
+ console.log(`⚠️ [Preload] Correcting invalid hour 0 to ${effectiveForecastHour} for HRRR ptypeRefl`);
154
+ }
155
+
156
+ if (!cachedGeometry.current || !cachedColormap.current) {
157
+ const gridModel = isMRMS ? 'mrms' : model;
158
+ const { corners, gridDef } = core._getGridCornersAndDef(gridModel);
159
+ gridLayerRef.current.updateGeometry(corners, gridDef);
160
+ cachedGeometry.current = { model: gridModel, variable };
161
+
162
+ const { colormap, baseUnit } = core._getColormapForVariable(variable);
163
+ const toUnit = core._getTargetUnit(baseUnit, units);
164
+ const finalColormap = core._convertColormapUnits(colormap, baseUnit, toUnit);
165
+ let dataRange;
166
+ if (variable === 'ptypeRefl' || variable === 'ptypeRate') {
167
+ if (isMRMS) {
168
+ console.log('🔧 Using MRMS ptype data range: 5-380');
169
+ dataRange = [5, 380];
170
+ } else {
171
+ console.log('🔧 Using Model ptype data range: 5-380');
172
+ dataRange = [5, 380];
173
+ }
174
+ } else {
175
+ dataRange = [finalColormap[0], finalColormap[finalColormap.length - 2]];
176
+ }
177
+ const colormapBytes = _generateColormapBytes(finalColormap);
178
+ const colormapAsBase64 = fromByteArray(colormapBytes);
179
+
180
+ gridLayerRef.current.updateColormapTexture(colormapAsBase64);
181
+ cachedColormap.current = { key: `${variable}-${units}` };
182
+ cachedDataRange.current = dataRange;
183
+
184
+ setRenderProps({ opacity: state.opacity, dataRange: dataRange });
185
+ hasInitialLoad.current = true;
186
+ }
187
+
188
+ // Apply the same filtering logic as in AguaceroCore._emitStateChange
189
+ let filteredHours = availableHours;
190
+ if (!isMRMS && variable === 'ptypeRefl' && model === 'hrrr' && availableHours && availableHours.length > 0) {
191
+ filteredHours = availableHours.filter(hour => hour !== 0);
192
+ }
193
+
194
+ const allFrames = isMRMS ? availableTimestamps : filteredHours;
195
+ if (!allFrames || allFrames.length === 0) {
196
+ console.warn('🟡 [preloadAllFramesToDisk] No frames available to download.');
197
+ return;
198
+ }
199
+
200
+ const currentFrame = isMRMS ? mrmsTimestamp : effectiveForecastHour;
201
+ const prioritizedFrames = [
202
+ currentFrame,
203
+ ...allFrames.filter(frame => frame !== currentFrame)
204
+ ];
205
+ console.log(`[Preload] Prioritizing frame: ${currentFrame}. Total frames: ${prioritizedFrames.length}`);
206
+
207
+ const { corners, gridDef } = core._getGridCornersAndDef(isMRMS ? 'mrms' : model);
208
+ const { nx, ny } = gridDef.grid_params;
209
+
210
+ prioritizedFrames.forEach((frame, index) => {
211
+ const cacheKey = isMRMS ? `mrms-${frame}-${variable}` : `${model}-${date}-${run}-${frame}-${variable}`;
212
+ if (preloadedDataCache.current.has(cacheKey)) {
213
+ return;
214
+ }
215
+
216
+ let resourcePath;
217
+ if (isMRMS) {
218
+ const frameDate = new Date(frame * 1000);
219
+ const y = frameDate.getUTCFullYear();
220
+ const m = (frameDate.getUTCMonth() + 1).toString().padStart(2, '0');
221
+ const d = frameDate.getUTCDate().toString().padStart(2, '0');
222
+ resourcePath = `/grids/mrms/${y}${m}${d}/${frame}/0/${variable}/0`;
223
+ } else {
224
+ resourcePath = `/grids/${model}/${date}/${run}/${frame}/${variable}/0`;
225
+ }
226
+
227
+ const url = `${core.baseGridUrl}${resourcePath}?apiKey=${core.apiKey}`;
228
+ const options = { url, apiKey: core.apiKey, bundleId: core.bundleId };
229
+
230
+ WeatherFrameProcessorModule.processFrame(options)
231
+ .then(result => {
232
+ if (!result || !result.filePath) {
233
+ console.warn(`⚠️ [preloadAllFramesToDisk] Failed frame ${frame}: No filePath`);
234
+ return;
235
+ }
236
+
237
+ const { baseUnit } = core._getColormapForVariable(variable);
238
+ const toUnit = core._getTargetUnit(baseUnit, units);
239
+
240
+ let dataScale = result.scale;
241
+ let dataOffset = result.offset;
242
+
243
+ let convertedScale = dataScale;
244
+ let convertedOffset = dataOffset;
245
+
246
+ if (baseUnit !== toUnit) {
247
+ const conversionFunc = getUnitConversionFunction(baseUnit, toUnit);
248
+ if (conversionFunc) {
249
+ if (result.scaleType === 'sqrt') {
250
+ const physicalAtOffset = dataOffset * dataOffset;
251
+ const physicalAtOffsetPlusScale = (dataOffset + dataScale) * (dataOffset + dataScale);
252
+ const convertedPhysicalAtOffset = conversionFunc(physicalAtOffset);
253
+ const convertedPhysicalAtOffsetPlusScale = conversionFunc(physicalAtOffsetPlusScale);
254
+ convertedOffset = Math.sqrt(Math.abs(convertedPhysicalAtOffset)) * Math.sign(convertedPhysicalAtOffset);
255
+ const newOffsetPlusScale = Math.sqrt(Math.abs(convertedPhysicalAtOffsetPlusScale)) * Math.sign(convertedPhysicalAtOffsetPlusScale);
256
+ convertedScale = newOffsetPlusScale - convertedOffset;
257
+ } else {
258
+ convertedOffset = conversionFunc(dataOffset);
259
+ const convertedOffsetPlusScale = conversionFunc(dataOffset + dataScale);
260
+ convertedScale = convertedOffsetPlusScale - convertedOffset;
261
+ }
262
+ }
263
+ }
264
+
265
+ const frameData = {
266
+ filePath: result.filePath,
267
+ nx, ny,
268
+ scale: convertedScale,
269
+ offset: convertedOffset,
270
+ missing: result.missing,
271
+ corners,
272
+ gridDef,
273
+ scaleType: result.scaleType,
274
+ originalScale: result.scale,
275
+ originalOffset: result.offset
276
+ };
277
+
278
+ preloadedDataCache.current.set(cacheKey, frameData);
279
+
280
+ const isCurrentFrame = index === 0;
281
+
282
+ if (isCurrentFrame) {
283
+ console.log(`🎯 [Preload] Using FAST LANE to process and draw current frame (${frame}) immediately.`);
284
+ gridLayerRef.current.updateDataTextureFromFile(
285
+ frameData.filePath,
286
+ frameData.nx, frameData.ny,
287
+ frameData.scale, frameData.offset, frameData.missing,
288
+ frameData.scaleType
289
+ );
290
+
291
+ currentGridDataRef.current = {
292
+ nx: frameData.nx,
293
+ ny: frameData.ny,
294
+ scale: frameData.scale,
295
+ offset: frameData.offset,
296
+ missing: frameData.missing,
297
+ gridDef: frameData.gridDef,
298
+ variable: variable,
299
+ units: units
300
+ };
301
+ } else {
302
+ if (Platform.OS === 'ios' && gridLayerRef.current.primeGpuCache) {
303
+ const frameInfoForGpu = {
304
+ [cacheKey]: {
305
+ filePath: frameData.filePath,
306
+ nx: frameData.nx,
307
+ ny: frameData.ny,
308
+ scale: frameData.scale,
309
+ offset: frameData.offset,
310
+ missing: frameData.missing,
311
+ scaleType: frameData.scaleType || 'linear',
312
+ originalScale: frameData.originalScale,
313
+ originalOffset: frameData.originalOffset
314
+ }
315
+ };
316
+ gridLayerRef.current.primeGpuCache(frameInfoForGpu);
317
+ }
318
+ }
319
+ })
320
+ .catch(error => {
321
+ console.warn(`⚠️ [preloadAllFramesToDisk] Failed frame ${frame}:`, error);
322
+ });
323
+ });
324
+ };
325
+
326
+ const updateGPUWithCachedData = (state) => {
327
+ const { model, date, run, forecastHour, variable, units, isMRMS, mrmsTimestamp } = state;
328
+
329
+ const cacheKey = isMRMS
330
+ ? `mrms-${mrmsTimestamp}-${variable}`
331
+ : `${model}-${date}-${run}-${forecastHour}-${variable}`;
332
+
333
+ if (Platform.OS === 'ios' && gridLayerRef.current.setActiveFrame) {
334
+ // Get the cached data BEFORE calling setActiveFrame
335
+ const cachedData = preloadedDataCache.current.get(cacheKey);
336
+
337
+ if (cachedData) {
338
+ currentGridDataRef.current = {
339
+ nx: cachedData.nx,
340
+ ny: cachedData.ny,
341
+ scale: cachedData.scale,
342
+ offset: cachedData.offset,
343
+ missing: cachedData.missing,
344
+ gridDef: cachedData.gridDef,
345
+ variable: variable,
346
+ units: units,
347
+ scaleType: cachedData.scaleType
348
+ };
349
+
350
+ console.log('📱 [iOS] Updated currentGridDataRef for inspector:', {
351
+ scale: cachedData.scale,
352
+ offset: cachedData.offset,
353
+ scaleType: cachedData.scaleType // ADD THIS
354
+ });
355
+ }
356
+
357
+ // Now call setActiveFrame (which will async update the native cache)
358
+ gridLayerRef.current.setActiveFrame(cacheKey);
359
+ return true;
360
+ }
361
+
362
+ const cachedData = preloadedDataCache.current.get(cacheKey);
363
+
364
+ if (!cachedData) {
365
+ const timeKey = isMRMS ? `timestamp ${mrmsTimestamp}` : `hour +${forecastHour}`;
366
+ console.log(`⏳ [updateGPUWithCachedData] Frame not ready yet for ${timeKey}. Still preloading...`); // CHANGED
367
+ return false;
368
+ }
369
+
370
+ if (!gridLayerRef.current) {
371
+ console.warn(`⚠️ [updateGPUWithCachedData] GridLayer ref not available`); // CHANGED
372
+ return false;
373
+ }
374
+
375
+ if (!cachedGeometry.current || cachedGeometry.current.model !== (isMRMS ? 'mrms' : model) || cachedGeometry.current.variable !== variable) {
376
+ gridLayerRef.current.updateGeometry(cachedData.corners, cachedData.gridDef);
377
+ cachedGeometry.current = { model: (isMRMS ? 'mrms' : model), variable };
378
+ }
379
+
380
+ const colormapKey = `${variable}-${units}`;
381
+ if (!cachedColormap.current || cachedColormap.current.key !== colormapKey) {
382
+ const { colormap, baseUnit } = core._getColormapForVariable(variable);
383
+ const toUnit = core._getTargetUnit(baseUnit, units);
384
+ const finalColormap = core._convertColormapUnits(colormap, baseUnit, toUnit);
385
+ let dataRange;
386
+ if (variable === 'ptypeRefl' || variable === 'ptypeRate') {
387
+ if (isMRMS) {
388
+ dataRange = [5, 380];
389
+ } else {
390
+ dataRange = [5, 380];
391
+ }
392
+ } else {
393
+ dataRange = [finalColormap[0], finalColormap[finalColormap.length - 2]];
394
+ }
395
+ const colormapBytes = _generateColormapBytes(finalColormap);
396
+ const colormapAsBase64 = fromByteArray(colormapBytes);
397
+
398
+ gridLayerRef.current.updateColormapTexture(colormapAsBase64);
399
+ cachedColormap.current = { key: colormapKey };
400
+ cachedDataRange.current = dataRange;
401
+
402
+ setRenderProps(prev => ({ ...prev, dataRange }));
403
+ }
404
+
405
+ if (cachedData.filePath) {
406
+ gridLayerRef.current.updateDataTextureFromFile(
407
+ cachedData.filePath,
408
+ cachedData.nx, cachedData.ny,
409
+ cachedData.scale, cachedData.offset, cachedData.missing,
410
+ cachedData.scaleType
411
+ );
412
+
413
+ // ADD THIS: Update inspector cache for file-based data too
414
+ currentGridDataRef.current = {
415
+ nx: cachedData.nx,
416
+ ny: cachedData.ny,
417
+ scale: cachedData.scale,
418
+ offset: cachedData.offset,
419
+ missing: cachedData.missing,
420
+ gridDef: cachedData.gridDef,
421
+ variable: variable,
422
+ units: units
423
+ };
424
+ } else if (cachedData.dataAsBase64) {
425
+ gridLayerRef.current.updateDataTexture(
426
+ cachedData.dataAsBase64,
427
+ cachedData.nx, cachedData.ny,
428
+ cachedData.scale, cachedData.offset, cachedData.missing,
429
+ cachedData.scaleType
430
+ );
431
+
432
+ // Update the inspector cache when using dataAsBase64
433
+ const binaryString = atob(cachedData.dataAsBase64);
434
+ const uint8Array = new Uint8Array(binaryString.length);
435
+
436
+ for (let i = 0; i < binaryString.length; i++) {
437
+ uint8Array[i] = binaryString.charCodeAt(i);
438
+ }
439
+
440
+ currentGridDataRef.current = {
441
+ data: uint8Array,
442
+ nx: cachedData.nx,
443
+ ny: cachedData.ny,
444
+ scale: cachedData.scale,
445
+ offset: cachedData.offset,
446
+ missing: cachedData.missing,
447
+ gridDef: cachedData.gridDef,
448
+ variable: variable,
449
+ units: units
450
+ };
451
+ } else {
452
+ console.error(`❌ [updateGPUWithCachedData] Cached data has no filePath or dataAsBase64!`);
453
+ console.error('❌ [updateGPUWithCachedData] Cached data keys:', Object.keys(cachedData));
454
+ return false;
455
+ }
456
+
457
+ // Update inspector parameters for file-based data too
458
+ if (gridLayerRef.current && gridLayerRef.current.updateDataParameters) {
459
+ gridLayerRef.current.updateDataParameters(cachedData.scale, cachedData.offset, cachedData.missing);
460
+ }
461
+ return true;
462
+ };
463
+
464
+ const handleStateChangeRef = useRef(null);
465
+ const debounceTimeoutRef = useRef(null);
466
+
467
+ useEffect(() => {
468
+ if (core && props.customColormaps) {
469
+ core.customColormaps = props.customColormaps;
470
+ // Trigger a re-render if we already have data loaded
471
+ if (hasInitialLoad.current) {
472
+ core._emitStateChange();
473
+ }
474
+ }
475
+ }, [core, props.customColormaps]);
476
+
477
+ const getValueAtPoint = async (lng, lat) => {
478
+ if (!core) {
479
+ console.warn('🔍 [Inspector] Core not available');
480
+ return null;
481
+ }
482
+
483
+ // ADD THIS: Check if we have valid data before attempting inspection
484
+ if (!currentGridDataRef.current) {
485
+ console.log('🔍 [Inspector] No grid data available');
486
+ return null;
487
+ }
488
+
489
+ try {
490
+ const gridIndices = core._getGridIndexFromLngLat(lng, lat);
491
+ if (!gridIndices) return null;
492
+
493
+ const { i, j } = gridIndices;
494
+
495
+ const value = await InspectorModule.getValueAtGridIndex(i, j);
496
+
497
+ if (value === null) {
498
+ return null;
499
+ }
500
+
501
+ const { colormap, baseUnit } = core._getColormapForVariable(core.state.variable);
502
+ const displayUnit = core._getTargetUnit(baseUnit, core.state.units);
503
+ const finalColormap = core._convertColormapUnits(colormap, baseUnit, displayUnit);
504
+ const minThreshold = finalColormap[0];
505
+
506
+ if (value < minThreshold) {
507
+ console.log('🔍 [Inspector] Rejected: below threshold'); // ADD THIS LOG
508
+ return null;
509
+ }
510
+
511
+ // Filter out values below the minimum threshold (matching shader behavior)
512
+ if (value < minThreshold) {
513
+ return null;
514
+ }
515
+
516
+ // Also check if value is NaN or effectively missing
517
+ if (!isFinite(value)) {
518
+ return null;
519
+ }
520
+
521
+ return {
522
+ value: value,
523
+ unit: displayUnit,
524
+ variable: {
525
+ code: core.state.variable,
526
+ name: core.getVariableDisplayName(core.state.variable)
527
+ },
528
+ lngLat: { lng, lat }
529
+ };
530
+ } catch (error) {
531
+ console.error('🔍 [Inspector] Error:', error);
532
+ return null;
533
+ }
534
+ };
535
+
536
+ useEffect(() => {
537
+ if (!core) {
538
+ console.warn('⚠️ [useEffect] Core is not available yet');
539
+ return;
540
+ }
541
+
542
+ const handleStateChange = async (newState) => {
543
+ if (!previousStateRef.current) {
544
+ previousStateRef.current = core.state;
545
+ }
546
+
547
+ const variableChanged = !previousStateRef.current || newState.variable !== previousStateRef.current.variable;
548
+
549
+ if (variableChanged && gridLayerRef.current?.setVariable) {
550
+ gridLayerRef.current.setVariable(newState.variable);
551
+ }
552
+
553
+ const stateKey = `${newState.model}-${newState.variable}-${newState.date}-${newState.run}-${newState.forecastHour}-${newState.units}-${newState.mrmsTimestamp}`;
554
+
555
+ const isOpacityOnlyChange =
556
+ hasInitialLoad.current &&
557
+ newState.opacity !== renderProps.opacity &&
558
+ newState.variable === previousStateRef.current?.variable &&
559
+ newState.forecastHour === previousStateRef.current?.forecastHour &&
560
+ newState.mrmsTimestamp === previousStateRef.current?.mrmsTimestamp &&
561
+ newState.model === previousStateRef.current?.model &&
562
+ newState.units === previousStateRef.current?.units;
563
+
564
+
565
+ if (!isOpacityOnlyChange && lastProcessedState.current === stateKey) {
566
+ return;
567
+ }
568
+
569
+ if (!isOpacityOnlyChange) {
570
+ lastProcessedState.current = stateKey;
571
+ }
572
+
573
+ props.onStateChange?.(newState);
574
+
575
+ if (isOpacityOnlyChange) {
576
+ setRenderProps(prev => ({ ...prev, opacity: newState.opacity }));
577
+ previousStateRef.current = newState;
578
+ return;
579
+ }
580
+
581
+ // Check if only units changed
582
+ const isUnitsOnlyChange =
583
+ hasInitialLoad.current &&
584
+ newState.model === previousStateRef.current.model &&
585
+ newState.isMRMS === previousStateRef.current.isMRMS &&
586
+ newState.variable === previousStateRef.current.variable &&
587
+ newState.date === previousStateRef.current.date &&
588
+ newState.run === previousStateRef.current.run &&
589
+ newState.forecastHour === previousStateRef.current.forecastHour &&
590
+ newState.mrmsTimestamp === previousStateRef.current.mrmsTimestamp &&
591
+ newState.units !== previousStateRef.current.units;
592
+
593
+ if (isUnitsOnlyChange) {
594
+ const { variable, units, isMRMS, mrmsTimestamp, model, date, run, forecastHour } = newState;
595
+ const oldCacheKey = isMRMS
596
+ ? `mrms-${mrmsTimestamp}-${variable}`
597
+ : `${model}-${date}-${run}-${forecastHour}-${variable}`;
598
+
599
+ const cachedData = preloadedDataCache.current.get(oldCacheKey);
600
+
601
+ if (cachedData && cachedData.originalScale !== undefined && cachedData.originalOffset !== undefined) {
602
+ const { baseUnit } = core._getColormapForVariable(variable);
603
+ const toUnit = core._getTargetUnit(baseUnit, units);
604
+
605
+ let dataScale = cachedData.originalScale;
606
+ let dataOffset = cachedData.originalOffset;
607
+
608
+ if (baseUnit !== toUnit) {
609
+ const conversionFunc = getUnitConversionFunction(baseUnit, toUnit);
610
+ console.log('🔧 [Unit Conversion] Conversion function exists:', !!conversionFunc);
611
+
612
+ if (conversionFunc) {
613
+ if (cachedData.scaleType === 'sqrt') {
614
+ // Calculate what the physical values would be at offset and offset+scale
615
+ const physicalAtOffset = dataOffset * dataOffset;
616
+ const physicalAtOffsetPlusScale = (dataOffset + dataScale) * (dataOffset + dataScale);
617
+
618
+ // Convert these physical values to the new unit
619
+ const convertedPhysicalAtOffset = conversionFunc(physicalAtOffset);
620
+ const convertedPhysicalAtOffsetPlusScale = conversionFunc(physicalAtOffsetPlusScale);
621
+
622
+ // Take sqrt to get back to intermediate values
623
+ const newOffset = Math.sqrt(Math.abs(convertedPhysicalAtOffset)) * Math.sign(convertedPhysicalAtOffset);
624
+ const newOffsetPlusScale = Math.sqrt(Math.abs(convertedPhysicalAtOffsetPlusScale)) * Math.sign(convertedPhysicalAtOffsetPlusScale);
625
+
626
+ dataScale = newOffsetPlusScale - newOffset;
627
+ dataOffset = newOffset;
628
+ } else {
629
+ const convertedOffset = conversionFunc(dataOffset);
630
+ const convertedOffsetPlusScale = conversionFunc(dataOffset + dataScale);
631
+
632
+ dataScale = convertedOffsetPlusScale - convertedOffset;
633
+ dataOffset = convertedOffset;
634
+ }
635
+ }
636
+ }
637
+
638
+ // Update the colormap AND data range
639
+ const { colormap } = core._getColormapForVariable(variable);
640
+ const finalColormap = core._convertColormapUnits(colormap, baseUnit, toUnit);
641
+ let dataRange;
642
+ if (variable === 'ptypeRefl' || variable === 'ptypeRate') {
643
+ if (isMRMS) {
644
+ dataRange = [5, 380];
645
+ } else {
646
+ dataRange = [5, 380];
647
+ }
648
+ } else {
649
+ dataRange = [finalColormap[0], finalColormap[finalColormap.length - 2]];
650
+ }
651
+
652
+ const colormapBytes = _generateColormapBytes(finalColormap);
653
+ const colormapAsBase64 = fromByteArray(colormapBytes);
654
+
655
+ gridLayerRef.current.updateColormapTexture(colormapAsBase64);
656
+ cachedColormap.current = { key: `${variable}-${units}` };
657
+ cachedDataRange.current = dataRange;
658
+
659
+ setRenderProps(prev => ({ ...prev, dataRange, opacity: newState.opacity }));
660
+
661
+ if (gridLayerRef.current && gridLayerRef.current.updateDataParameters) {
662
+ const scaleTypeValue = cachedData.scaleType === 'sqrt' ? 1 : 0; // Convert to number
663
+
664
+ console.log('🔄 [Unit Conversion] Calling updateDataParameters with:', {
665
+ scale: dataScale,
666
+ offset: dataOffset,
667
+ missing: cachedData.missing,
668
+ scaleType: scaleTypeValue
669
+ });
670
+
671
+ gridLayerRef.current.updateDataParameters(dataScale, dataOffset, cachedData.missing, scaleTypeValue); // Pass scaleType
672
+ }
673
+
674
+ const newCacheKey = isMRMS
675
+ ? `mrms-${mrmsTimestamp}-${variable}`
676
+ : `${model}-${date}-${run}-${forecastHour}-${variable}`;
677
+
678
+ preloadedDataCache.current.set(newCacheKey, {
679
+ ...cachedData,
680
+ scale: dataScale,
681
+ offset: dataOffset
682
+ });
683
+
684
+ } else {
685
+ console.warn('⚠️ [Unit Conversion] No cached data found for key:', oldCacheKey);
686
+ }
687
+
688
+ previousStateRef.current = newState;
689
+ return;
690
+ }
691
+
692
+ const needsFullLoad =
693
+ !hasInitialLoad.current ||
694
+ newState.model !== previousStateRef.current.model ||
695
+ newState.isMRMS !== previousStateRef.current.isMRMS ||
696
+ newState.variable !== previousStateRef.current.variable ||
697
+ newState.date !== previousStateRef.current.date ||
698
+ newState.run !== previousStateRef.current.run;
699
+
700
+ if (needsFullLoad) {
701
+
702
+ if (gridLayerRef.current) {
703
+ gridLayerRef.current.setVariable(newState.variable);
704
+ gridLayerRef.current.clear();
705
+ // --- OPTIMIZATION: Clear the native GPU cache on iOS ---
706
+ if (Platform.OS === 'ios' && gridLayerRef.current.clearGpuCache) {
707
+ gridLayerRef.current.clearGpuCache();
708
+ }
709
+ }
710
+ hasPreloadedRef.current = false;
711
+
712
+ preloadedDataCache.current.clear();
713
+ cachedGeometry.current = null;
714
+ cachedColormap.current = null;
715
+
716
+ // ADD THIS: Clear the inspector cache too
717
+ currentGridDataRef.current = null;
718
+
719
+ WeatherFrameProcessorModule.cancelAllFrames();
720
+
721
+ if (!newState.variable) {
722
+ previousStateRef.current = newState;
723
+ return;
724
+ }
725
+
726
+ preloadAllFramesToDisk(newState);
727
+ } else if (newState.forecastHour !== previousStateRef.current.forecastHour || (newState.isMRMS && newState.mrmsTimestamp !== previousStateRef.current.mrmsTimestamp)) {
728
+ const success = updateGPUWithCachedData(newState);
729
+
730
+ if (!success) {
731
+ // CHANGED: Don't error, just log and wait for preload
732
+ const timeKey = newState.isMRMS ? `timestamp ${newState.mrmsTimestamp}` : `hour +${newState.forecastHour}`;
733
+ console.log(`⏳ [handleStateChange] Frame ${timeKey} not ready yet, waiting for preload...`);
734
+ // Don't clear the layer - keep showing the previous frame until new one is ready
735
+ // The preload will eventually complete and trigger a re-render
736
+ } else {
737
+ // Only update inspector cache when we successfully loaded new data
738
+ if (newState.opacity !== renderProps.opacity) {
739
+ setRenderProps(prev => ({ ...prev, opacity: newState.opacity }));
740
+ }
741
+ }
742
+ }
743
+
744
+ previousStateRef.current = newState;
745
+ };
746
+
747
+ handleStateChangeRef.current = handleStateChange;
748
+
749
+ const stableHandler = (newState) => {
750
+ const isOpacityOnlyChange =
751
+ previousStateRef.current &&
752
+ newState.opacity !== previousStateRef.current.opacity &&
753
+ newState.variable === previousStateRef.current.variable &&
754
+ newState.forecastHour === previousStateRef.current.forecastHour &&
755
+ newState.mrmsTimestamp === previousStateRef.current.mrmsTimestamp &&
756
+ newState.model === previousStateRef.current.model &&
757
+ newState.units === previousStateRef.current.units &&
758
+ newState.date === previousStateRef.current.date &&
759
+ newState.run === previousStateRef.current.run;
760
+
761
+ if (isOpacityOnlyChange) {
762
+ if (handleStateChangeRef.current) {
763
+ handleStateChangeRef.current(newState);
764
+ }
765
+ return;
766
+ }
767
+
768
+ if (debounceTimeoutRef.current) {
769
+ clearTimeout(debounceTimeoutRef.current);
770
+ }
771
+
772
+ debounceTimeoutRef.current = setTimeout(() => {
773
+ if (handleStateChangeRef.current) {
774
+ handleStateChangeRef.current(newState);
775
+ }
776
+ debounceTimeoutRef.current = null;
777
+ }, 50);
778
+ };
779
+
780
+ core.on('state:change', stableHandler);
781
+
782
+ return () => {
783
+ core.off('state:change', stableHandler);
784
+ if (debounceTimeoutRef.current) {
785
+ clearTimeout(debounceTimeoutRef.current);
786
+ }
787
+ };
788
+ }, [core]);
789
+
790
+ useEffect(() => {
791
+ return () => {
792
+ preloadedDataCache.current.clear();
793
+ hasInitialLoad.current = false;
794
+ lastProcessedState.current = null;
795
+ };
796
+ }, []);
797
+
798
+ const lastInspectorUpdateRef = useRef(0);
799
+ const INSPECTOR_THROTTLE_MS = 50;
800
+
801
+ useEffect(() => {
802
+ if (!core || !inspectorEnabled) {
803
+ return;
804
+ }
805
+
806
+ const handleMapMove = async (center) => {
807
+ if (!center || !Array.isArray(center) || center.length !== 2) {
808
+ return;
809
+ }
810
+
811
+ // Throttle updates
812
+ const now = Date.now();
813
+ if (now - lastInspectorUpdateRef.current < INSPECTOR_THROTTLE_MS) {
814
+ return;
815
+ }
816
+ lastInspectorUpdateRef.current = now;
817
+
818
+ const [longitude, latitude] = center;
819
+
820
+ const payload = await getValueAtPoint(longitude, latitude);
821
+ onInspect?.(payload);
822
+ };
823
+
824
+ core.on('map:move', handleMapMove);
825
+
826
+ if (context && context.getCenter) {
827
+ const center = context.getCenter();
828
+ if (center) {
829
+ handleMapMove(center);
830
+ }
831
+ }
832
+
833
+ return () => {
834
+ core.off('map:move', handleMapMove);
835
+ };
836
+ }, [inspectorEnabled, onInspect, core, context]);
837
+
838
+ // Add this new useEffect after the existing inspector useEffect
839
+ useEffect(() => {
840
+ // Trigger re-inspection when state changes (variable, model, forecast hour, etc.)
841
+ if (!core || !inspectorEnabled) {
842
+ return;
843
+ }
844
+
845
+ const triggerReinspection = () => {
846
+ const mapRef = mapRegistry.getMap();
847
+ const center = mapRef?._currentCenter;
848
+
849
+ if (center && Array.isArray(center) && center.length === 2) {
850
+ const [longitude, latitude] = center;
851
+
852
+ getValueAtPoint(longitude, latitude).then(payload => {
853
+ onInspect?.(payload);
854
+ });
855
+ }
856
+ };
857
+
858
+ // Small delay to ensure data is loaded before re-inspecting
859
+ const timer = setTimeout(triggerReinspection, 100);
860
+
861
+ return () => clearTimeout(timer);
862
+ }, [
863
+ core?.state?.variable,
864
+ core?.state?.model,
865
+ core?.state?.forecastHour,
866
+ core?.state?.mrmsTimestamp,
867
+ core?.state?.units,
868
+ inspectorEnabled,
869
+ onInspect
870
+ ]);
871
+
872
+ useEffect(() => {
873
+ if (!core) {
874
+ return;
875
+ }
876
+
877
+ const handleCameraChange = (center) => {
878
+ if (core && center) {
879
+ core.setMapCenter(center);
880
+ }
881
+ };
882
+
883
+ // Register with the global registry
884
+ mapRegistry.addCameraListener(handleCameraChange);
885
+
886
+ // Try to get initial center
887
+ const mapRef = mapRegistry.getMap();
888
+ if (mapRef?._currentCenter) {
889
+ handleCameraChange(mapRef._currentCenter);
890
+ }
891
+
892
+ return () => {
893
+ mapRegistry.removeCameraListener(handleCameraChange);
894
+ };
895
+ }, [core]);
896
+
897
+ useEffect(() => {
898
+ core.initialize();
899
+ return () => {
900
+ core.destroy();
901
+ };
902
+ }, [core]);
903
+
904
+ return (
905
+ <GridRenderLayer
906
+ ref={gridLayerRef}
907
+ opacity={renderProps.opacity}
908
+ dataRange={renderProps.dataRange}
909
+ belowID="AML_-_terrain"
910
+ />
911
+ );
912
+ });
913
+
914
+ WeatherLayerManager.getAvailableVariables = (options) => {
915
+ if (!options || !options.apiKey) {
916
+ console.error("API key must be provided to get available variables.");
917
+ return [];
918
+ }
919
+ const core = new AguaceroCore({ apiKey: options.apiKey });
920
+ return core.getAvailableVariables('mrms');
892
921
  };