expo-gaode-map 2.2.37 → 2.2.39-next.0

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 (92) hide show
  1. package/README.md +4 -3
  2. package/android/build.gradle +11 -32
  3. package/android/src/main/java/expo/modules/gaodemap/ExpoGaodeMapView.kt +35 -12
  4. package/android/src/main/java/expo/modules/gaodemap/ExpoGaodeMapViewModule.kt +2 -0
  5. package/android/src/main/java/expo/modules/gaodemap/managers/UIManager.kt +8 -0
  6. package/android/src/main/java/expo/modules/gaodemap/overlays/MarkerView.kt +13 -5
  7. package/build/ExpoGaodeMapOfflineModule.js +1 -1
  8. package/build/ExpoGaodeMapOfflineModule.js.map +1 -1
  9. package/build/ExpoGaodeMapView.js +2 -8
  10. package/build/ExpoGaodeMapView.js.map +1 -1
  11. package/build/components/AreaMaskOverlay.d.ts +1 -2
  12. package/build/components/AreaMaskOverlay.d.ts.map +1 -1
  13. package/build/components/AreaMaskOverlay.js +2 -1
  14. package/build/components/AreaMaskOverlay.js.map +1 -1
  15. package/build/components/FoldableMapView.d.ts +3 -2
  16. package/build/components/FoldableMapView.d.ts.map +1 -1
  17. package/build/components/FoldableMapView.js +2 -1
  18. package/build/components/FoldableMapView.js.map +1 -1
  19. package/build/components/MapUI.js +2 -1
  20. package/build/components/MapUI.js.map +1 -1
  21. package/build/components/RouteOverlay.d.ts +1 -2
  22. package/build/components/RouteOverlay.d.ts.map +1 -1
  23. package/build/components/RouteOverlay.js +5 -5
  24. package/build/components/RouteOverlay.js.map +1 -1
  25. package/build/components/overlays/Circle.d.ts +1 -1
  26. package/build/components/overlays/Circle.d.ts.map +1 -1
  27. package/build/components/overlays/Circle.js +2 -1
  28. package/build/components/overlays/Circle.js.map +1 -1
  29. package/build/components/overlays/Cluster.d.ts +1 -1
  30. package/build/components/overlays/Cluster.d.ts.map +1 -1
  31. package/build/components/overlays/Cluster.js +2 -1
  32. package/build/components/overlays/Cluster.js.map +1 -1
  33. package/build/components/overlays/HeatMap.d.ts +1 -1
  34. package/build/components/overlays/HeatMap.d.ts.map +1 -1
  35. package/build/components/overlays/HeatMap.js +2 -1
  36. package/build/components/overlays/HeatMap.js.map +1 -1
  37. package/build/components/overlays/Marker.d.ts +1 -1
  38. package/build/components/overlays/Marker.d.ts.map +1 -1
  39. package/build/components/overlays/Marker.js +8 -7
  40. package/build/components/overlays/Marker.js.map +1 -1
  41. package/build/components/overlays/MultiPoint.d.ts +1 -2
  42. package/build/components/overlays/MultiPoint.d.ts.map +1 -1
  43. package/build/components/overlays/MultiPoint.js +2 -1
  44. package/build/components/overlays/MultiPoint.js.map +1 -1
  45. package/build/components/overlays/Polygon.d.ts +1 -1
  46. package/build/components/overlays/Polygon.d.ts.map +1 -1
  47. package/build/components/overlays/Polygon.js +2 -1
  48. package/build/components/overlays/Polygon.js.map +1 -1
  49. package/build/components/overlays/Polyline.d.ts +1 -1
  50. package/build/components/overlays/Polyline.d.ts.map +1 -1
  51. package/build/components/overlays/Polyline.js +2 -1
  52. package/build/components/overlays/Polyline.js.map +1 -1
  53. package/build/module/geometry.d.ts.map +1 -1
  54. package/build/module/geometry.js +2 -1
  55. package/build/module/geometry.js.map +1 -1
  56. package/build/module/sdk.d.ts.map +1 -1
  57. package/build/module/sdk.js +10 -3
  58. package/build/module/sdk.js.map +1 -1
  59. package/build/search/ExpoGaodeMapSearchModule.d.ts +1 -1
  60. package/build/search/ExpoGaodeMapSearchModule.d.ts.map +1 -1
  61. package/build/search/ExpoGaodeMapSearchModule.js.map +1 -1
  62. package/build/types/common.types.d.ts +1 -1
  63. package/build/types/common.types.d.ts.map +1 -1
  64. package/build/types/common.types.js.map +1 -1
  65. package/build/types/index.d.ts +1 -1
  66. package/build/types/index.d.ts.map +1 -1
  67. package/build/types/index.js.map +1 -1
  68. package/build/types/map-view.types.d.ts +11 -0
  69. package/build/types/map-view.types.d.ts.map +1 -1
  70. package/build/types/map-view.types.js.map +1 -1
  71. package/build/utils/ErrorHandler.d.ts +4 -0
  72. package/build/utils/ErrorHandler.d.ts.map +1 -1
  73. package/build/utils/ErrorHandler.js +8 -0
  74. package/build/utils/ErrorHandler.js.map +1 -1
  75. package/build/utils/GeoUtils.d.ts +2 -2
  76. package/build/utils/GeoUtils.d.ts.map +1 -1
  77. package/build/utils/GeoUtils.js +3 -3
  78. package/build/utils/GeoUtils.js.map +1 -1
  79. package/build/utils/RouteUtils.d.ts.map +1 -1
  80. package/build/utils/RouteUtils.js +5 -2
  81. package/build/utils/RouteUtils.js.map +1 -1
  82. package/ios/ExpoGaodeMapView.swift +106 -10
  83. package/ios/ExpoGaodeMapViewModule.swift +5 -0
  84. package/ios/overlays/MarkerView.swift +104 -32
  85. package/package.json +14 -8
  86. package/plugin/build/withGaodeMap.js +3 -2
  87. package/shared/cpp/ClusterEngine.cpp +4 -14
  88. package/shared/cpp/ClusterEngine.hpp +1 -12
  89. package/shared/cpp/ClusterTypes.hpp +18 -0
  90. package/shared/cpp/ColorParser.cpp +22 -3
  91. package/shared/cpp/GeometryEngine.cpp +1 -1
  92. package/shared/cpp/QuadTree.hpp +1 -1
package/README.md CHANGED
@@ -227,9 +227,6 @@ try {
227
227
 
228
228
  欢迎提交 Issue 和 Pull Request!
229
229
 
230
- ## 📄 许可证
231
-
232
- MIT
233
230
 
234
231
  ## 📚 文档与资源
235
232
 
@@ -258,3 +255,7 @@ MIT
258
255
  - 💬 查看并参与 [GitHub Issues](https://github.com/TomWq/expo-gaode-map/issues)
259
256
  - ⭐ 给项目点个 Star 支持一下
260
257
  - QQ:582752848
258
+
259
+ ## 📄 License
260
+
261
+ MIT
@@ -1,35 +1,10 @@
1
- apply plugin: 'com.android.library'
1
+ plugins {
2
+ id 'com.android.library'
3
+ id 'expo-module-gradle-plugin'
4
+ }
2
5
 
3
6
  group = 'expo.modules.gaodemap'
4
- version = '2.2.34'
5
-
6
- def expoModulesCorePlugin = new File(project(":expo-modules-core").projectDir.absolutePath, "ExpoModulesCorePlugin.gradle")
7
- apply from: expoModulesCorePlugin
8
- applyKotlinExpoModulesCorePlugin()
9
- useCoreDependencies()
10
- useExpoPublishing()
11
-
12
- // If you want to use the managed Android SDK versions from expo-modules-core, set this to true.
13
- // The Android SDK versions will be bumped from time to time in SDK releases and may introduce breaking changes in your module code.
14
- // Most of the time, you may like to manage the Android SDK versions yourself.
15
- def useManagedAndroidSdkVersions = false
16
- if (useManagedAndroidSdkVersions) {
17
- useDefaultAndroidSdkVersions()
18
- } else {
19
- buildscript {
20
- // Simple helper that allows the root project to override versions declared by this library.
21
- ext.safeExtGet = { prop, fallback ->
22
- rootProject.ext.has(prop) ? rootProject.ext.get(prop) : fallback
23
- }
24
- }
25
- project.android {
26
- compileSdkVersion safeExtGet("compileSdkVersion", 36)
27
- defaultConfig {
28
- minSdkVersion safeExtGet("minSdkVersion", 24)
29
- targetSdkVersion safeExtGet("targetSdkVersion", 36)
30
- }
31
- }
32
- }
7
+ version = '2.2.39'
33
8
 
34
9
  logger.warn("[expo-gaode-map] Thank you for using expo-gaode-map ❤️")
35
10
  logger.warn("[expo-gaode-map] If you enjoy using expo-gaode-map, please consider sponsoring this project: https://github.com/TomWq")
@@ -38,7 +13,7 @@ android {
38
13
  namespace "expo.modules.gaodemap"
39
14
  defaultConfig {
40
15
  versionCode 1
41
- versionName "2.2.34"
16
+ versionName "2.2.39"
42
17
  externalNativeBuild {
43
18
  cmake {
44
19
  cppFlags "-std=c++17"
@@ -55,7 +30,11 @@ android {
55
30
  }
56
31
  }
57
32
 
58
-
33
+ tasks.withType(org.jetbrains.kotlin.gradle.tasks.KotlinCompile).configureEach {
34
+ kotlinOptions {
35
+ freeCompilerArgs += ["-Xskip-metadata-version-check"]
36
+ }
37
+ }
59
38
 
60
39
  dependencies {
61
40
  // 高德地图组合 SDK:地图 + 定位 + 搜索。
@@ -119,6 +119,8 @@ class ExpoGaodeMapView(context: Context, appContext: AppContext) : ExpoView(cont
119
119
  private var myLocationButtonEnabled: Boolean = false
120
120
  /** 相机移动事件节流间隔 */
121
121
  private var cameraEventThrottleMs: Long = 32L
122
+ /** 缩放手势锚点 */
123
+ private var zoomGestureAnchor: String = "gesture"
122
124
  /** 自定义地图样式配置(缓存) */
123
125
  private var customMapStyleData: Map<String, Any>? = null
124
126
 
@@ -204,6 +206,7 @@ class ExpoGaodeMapView(context: Context, appContext: AppContext) : ExpoView(cont
204
206
 
205
207
  uiManager.setLabelsEnabled(labelsEnabled)
206
208
  uiManager.setMyLocationButtonEnabled(myLocationButtonEnabled)
209
+ uiManager.setZoomGestureAnchor(zoomGestureAnchor)
207
210
 
208
211
  onLoad(mapOf("loaded" to true))
209
212
  }
@@ -214,6 +217,7 @@ class ExpoGaodeMapView(context: Context, appContext: AppContext) : ExpoView(cont
214
217
 
215
218
  // 辅助监听器列表
216
219
  private val cameraChangeListeners = mutableListOf<AMap.OnCameraChangeListener>()
220
+ private val pendingMarkerRemovalTasks = mutableMapOf<MarkerView, Runnable>()
217
221
 
218
222
  fun addCameraChangeListener(listener: AMap.OnCameraChangeListener) {
219
223
  if (!cameraChangeListeners.contains(listener)) {
@@ -390,6 +394,11 @@ class ExpoGaodeMapView(context: Context, appContext: AppContext) : ExpoView(cont
390
394
 
391
395
  /** 设置是否启用缩放手势 */
392
396
  fun setZoomEnabled(enabled: Boolean) = uiManager.setZoomEnabled(enabled)
397
+ /** 设置缩放手势锚点 */
398
+ fun setZoomGestureAnchor(anchor: String?) {
399
+ zoomGestureAnchor = if (anchor == "center") "center" else "gesture"
400
+ uiManager.setZoomGestureAnchor(zoomGestureAnchor)
401
+ }
393
402
  /** 设置是否启用滚动手势 */
394
403
  fun setScrollEnabled(enabled: Boolean) = uiManager.setScrollEnabled(enabled)
395
404
  /** 设置是否启用旋转手势 */
@@ -638,10 +647,11 @@ class ExpoGaodeMapView(context: Context, appContext: AppContext) : ExpoView(cont
638
647
  @Suppress("unused")
639
648
  fun onDestroy() {
640
649
  try {
641
- // 清理 Handler 回调,防止内存泄露
642
- mainHandler.removeCallbacksAndMessages(null)
643
- pendingCameraMoveData = null
644
- pendingCameraMoveDispatch = null
650
+ // 清理 Handler 回调,防止内存泄露
651
+ mainHandler.removeCallbacksAndMessages(null)
652
+ pendingCameraMoveData = null
653
+ pendingCameraMoveDispatch = null
654
+ pendingMarkerRemovalTasks.clear()
645
655
 
646
656
  // 清理所有地图监听器
647
657
  aMap.setOnMapClickListener(null)
@@ -747,6 +757,7 @@ class ExpoGaodeMapView(context: Context, appContext: AppContext) : ExpoView(cont
747
757
  @SuppressLint("UseKtx")
748
758
  override fun addView(child: View?, index: Int) {
749
759
  if (child is MarkerView) {
760
+ cancelPendingMarkerRemoval(child)
750
761
  child.setMap(aMap)
751
762
  // MarkerView 需要保留可测量尺寸,否则 Android 无法正确处理
752
763
  // Text / View 的 maxWidth 等布局约束,最终会被测成整行宽度。
@@ -784,10 +795,7 @@ class ExpoGaodeMapView(context: Context, appContext: AppContext) : ExpoView(cont
784
795
  */
785
796
  override fun removeView(child: View?) {
786
797
  if (child is MarkerView) {
787
- // 延迟移除 Marker,与地图的延迟销毁时间一致(500ms)
788
- mainHandler.postDelayed({
789
- child.removeMarker()
790
- }, 500)
798
+ scheduleMarkerRemoval(child)
791
799
  super.removeView(child)
792
800
  return
793
801
  }
@@ -812,10 +820,7 @@ class ExpoGaodeMapView(context: Context, appContext: AppContext) : ExpoView(cont
812
820
  }
813
821
 
814
822
  if (child is MarkerView) {
815
- // 延迟移除 Marker,与地图的延迟销毁时间一致(500ms)
816
- mainHandler.postDelayed({
817
- child.removeMarker()
818
- }, 500)
823
+ scheduleMarkerRemoval(child)
819
824
  }
820
825
 
821
826
  super.removeViewAt(index)
@@ -825,6 +830,24 @@ class ExpoGaodeMapView(context: Context, appContext: AppContext) : ExpoView(cont
825
830
  }
826
831
  }
827
832
 
833
+ private fun scheduleMarkerRemoval(markerView: MarkerView) {
834
+ cancelPendingMarkerRemoval(markerView)
835
+
836
+ val task = Runnable {
837
+ pendingMarkerRemovalTasks.remove(markerView)
838
+ if (markerView.parent == null) {
839
+ markerView.removeMarker()
840
+ }
841
+ }
842
+
843
+ pendingMarkerRemovalTasks[markerView] = task
844
+ mainHandler.postDelayed(task, 500)
845
+ }
846
+
847
+ private fun cancelPendingMarkerRemoval(markerView: MarkerView) {
848
+ pendingMarkerRemovalTasks.remove(markerView)?.let(mainHandler::removeCallbacks)
849
+ }
850
+
828
851
  private fun checkDeclarativePolylinePress(latLng: LatLng): Boolean {
829
852
  for (i in 0 until childCount) {
830
853
  val child = getChildAt(i)
@@ -39,6 +39,8 @@ class ExpoGaodeMapViewModule : Module() {
39
39
  Prop<Boolean>("scaleControlsEnabled") { view, show -> view.setShowsScale(show) }
40
40
 
41
41
  Prop<Boolean>("zoomGesturesEnabled") { view, enabled -> view.setZoomEnabled(enabled) }
42
+ // 缩放手势锚点:gesture 使用手势焦点,center 固定地图中心点
43
+ Prop<String?>("zoomGestureAnchor") { view, anchor -> view.setZoomGestureAnchor(anchor) }
42
44
  Prop<Boolean>("scrollGesturesEnabled") { view, enabled -> view.setScrollEnabled(enabled) }
43
45
  Prop<Boolean>("rotateGesturesEnabled") { view, enabled -> view.setRotateEnabled(enabled) }
44
46
  Prop<Boolean>("tiltGesturesEnabled") { view, enabled -> view.setTiltEnabled(enabled) }
@@ -62,6 +62,14 @@ class UIManager(private val aMap: AMap, private val context: Context) : Location
62
62
  fun setZoomEnabled(enabled: Boolean) {
63
63
  aMap.uiSettings.isZoomGesturesEnabled = enabled
64
64
  }
65
+
66
+ /**
67
+ * 设置缩放手势锚点
68
+ */
69
+ fun setZoomGestureAnchor(anchor: String?) {
70
+ val scaleByMapCenter = anchor == "center"
71
+ aMap.uiSettings.setGestureScaleByMapCenter(scaleByMapCenter)
72
+ }
65
73
 
66
74
  /**
67
75
  * 设置是否启用滚动手势
@@ -480,9 +480,16 @@ class MarkerView(context: Context, appContext: AppContext) : ExpoView(context, a
480
480
  return
481
481
  }
482
482
 
483
- invalidateAppliedCustomMarkerCaches(clearGlobalCache = true)
484
483
  cacheKey = key
485
- updateMarkerIcon()
484
+ if (isNotEmpty()) {
485
+ // cacheKey 通常和 selected/zoom level 同帧变化。延后一帧截图,避免在 RN
486
+ // children 样式尚未完成更新时生成空图,同时保留旧图直到新图准备好。
487
+ scheduleMarkerIconUpdate(32)
488
+ } else {
489
+ pendingIconUri?.let { iconUri ->
490
+ marker?.let { loadAndSetIcon(iconUri, it) }
491
+ }
492
+ }
486
493
  }
487
494
 
488
495
  /**
@@ -1344,8 +1351,9 @@ class MarkerView(context: Context, appContext: AppContext) : ExpoView(context, a
1344
1351
  mainHandler.removeCallbacksAndMessages(null)
1345
1352
  pendingMarkerIconUpdate = null
1346
1353
 
1347
- // 延迟检查 parent 状态
1348
- mainHandler.post {
1354
+ // 延迟检查 parent 状态。React 更新 children 时可能会短暂 detach/attach,
1355
+ // 过早删除会导致点击后其它 Marker 消失。
1356
+ mainHandler.postDelayed({
1349
1357
  if (parent == null) {
1350
1358
  // 标记正在移除
1351
1359
  isRemoving = true
@@ -1357,7 +1365,7 @@ class MarkerView(context: Context, appContext: AppContext) : ExpoView(context, a
1357
1365
  // 移除 marker
1358
1366
  removeMarker()
1359
1367
  }
1360
- }
1368
+ }, 500)
1361
1369
  }
1362
1370
 
1363
1371
  }
@@ -1,7 +1,7 @@
1
1
  /**
2
2
  * 高德地图离线地图原生模块
3
3
  */
4
- import { requireNativeModule } from 'expo';
4
+ import { NativeModule, requireNativeModule } from 'expo';
5
5
  let nativeModuleCache = null;
6
6
  function getNativeModule() {
7
7
  if (!nativeModuleCache) {
@@ -1 +1 @@
1
- {"version":3,"file":"ExpoGaodeMapOfflineModule.js","sourceRoot":"","sources":["../src/ExpoGaodeMapOfflineModule.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAgB,mBAAmB,EAAE,MAAM,MAAM,CAAC;AAsLzD,IAAI,iBAAiB,GAAqC,IAAI,CAAC;AAE/D,SAAS,eAAe;IACtB,IAAI,CAAC,iBAAiB,EAAE,CAAC;QACvB,iBAAiB,GAAG,mBAAmB,CAA4B,qBAAqB,CAAC,CAAC;IAC5F,CAAC;IACD,OAAO,iBAAiB,CAAC;AAC3B,CAAC;AAED,SAAS,mBAAmB,CAC1B,MAAiC,EACjC,IAAiB;IAEjB,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,MAAgB,EAAE,IAAI,EAAE,MAAgB,CAAC,CAAC;IACpE,IAAI,OAAO,KAAK,KAAK,UAAU,EAAE,CAAC;QAChC,OAAO,CAAC,GAAG,IAAe,EAAE,EAAE,CAC3B,KAA2C,CAAC,KAAK,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;IACrE,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,eAAe,IAAI,KAAK,CAAC,EAA+B,EAAE;IACxD,GAAG,CAAC,OAAO,EAAE,IAAI;QACf,OAAO,mBAAmB,CAAC,eAAe,EAAE,EAAE,IAAI,CAAC,CAAC;IACtD,CAAC;CACF,CAAC,CAAC","sourcesContent":["/**\n * 高德地图离线地图原生模块\n */\n\nimport { NativeModule, requireNativeModule } from 'expo';\nimport type {\n OfflineMapInfo,\n OfflineMapDownloadConfig,\n OfflineMapStorageInfo,\n OfflineMapEvents,\n} from './types/offline.types';\n\n/**\n * 离线地图原生模块接口\n */\ndeclare class ExpoGaodeMapOfflineModule extends NativeModule<OfflineMapEvents> {\n // ==================== 地图列表管理 ====================\n\n /**\n * 打开高德 3D 地图 SDK 官方离线地图 UI 组件(Android)。\n * 官方组件内置城市下载、暂停、更新、删除和城市搜索。\n */\n openOfflineMapUI(): Promise<void>;\n \n /**\n * 获取所有可下载的城市列表\n * @returns Promise<OfflineMapInfo[]> 城市列表\n */\n getAvailableCities(): Promise<OfflineMapInfo[]>;\n \n /**\n * 获取所有省份列表\n * @returns Promise<OfflineMapInfo[]> 省份列表\n */\n getAvailableProvinces(): Promise<OfflineMapInfo[]>;\n \n /**\n * 根据省份代码获取城市列表\n * @param provinceCode 省份代码\n * @returns Promise<OfflineMapInfo[]> 该省份下的城市列表\n */\n getCitiesByProvince(provinceCode: string): Promise<OfflineMapInfo[]>;\n \n /**\n * 获取已下载的地图列表\n * @returns Promise<OfflineMapInfo[]> 已下载的地图列表\n */\n getDownloadedMaps(): Promise<OfflineMapInfo[]>;\n \n // ==================== 下载管理 ====================\n \n /**\n * 开始下载离线地图\n * @param config 下载配置\n */\n startDownload(config: OfflineMapDownloadConfig): Promise<void>;\n \n /**\n * 暂停下载\n * @param cityCode 城市代码\n */\n pauseDownload(cityCode: string): Promise<void>;\n \n /**\n * 恢复下载\n * @param cityCode 城市代码\n */\n resumeDownload(cityCode: string): Promise<void>;\n \n /**\n * 取消下载\n * @param cityCode 城市代码\n */\n cancelDownload(cityCode: string): Promise<void>;\n \n /**\n * 删除离线地图\n * @param cityCode 城市代码\n */\n deleteMap(cityCode: string): Promise<void>;\n \n /**\n * 更新离线地图\n * @param cityCode 城市代码\n */\n updateMap(cityCode: string): Promise<void>;\n \n /**\n * 检查是否有可用更新\n * @param cityCode 城市代码\n * @returns Promise<boolean> 是否有更新\n */\n checkUpdate(cityCode: string): Promise<boolean>;\n \n // ==================== 状态查询 ====================\n \n /**\n * 检查地图是否已下载\n * @param cityCode 城市代码\n * @returns Promise<boolean> 是否已下载\n */\n isMapDownloaded(cityCode: string): Promise<boolean>;\n \n /**\n * 获取地图下载状态\n * @param cityCode 城市代码\n * @returns Promise<OfflineMapInfo> 地图信息\n */\n getMapStatus(cityCode: string): Promise<OfflineMapInfo>;\n \n /**\n * 获取所有下载任务的总进度\n * @returns Promise<number> 总进度 (0-100)\n */\n getTotalProgress(): Promise<number>;\n \n /**\n * 获取当前正在下载的城市列表\n * @returns Promise<string[]> 城市代码列表\n */\n getDownloadingCities(): Promise<string[]>;\n \n // ==================== 存储管理 ====================\n \n /**\n * 获取离线地图占用的存储空间(字节)\n * @returns Promise<number> 存储空间大小\n */\n getStorageSize(): Promise<number>;\n \n /**\n * 获取详细的存储信息\n * @returns Promise<OfflineMapStorageInfo> 存储信息\n */\n getStorageInfo(): Promise<OfflineMapStorageInfo>;\n \n /**\n * 清理所有离线地图\n */\n clearAllMaps(): Promise<void>;\n \n /**\n * 设置离线地图存储路径\n * @param path 存储路径\n */\n setStoragePath(path: string): void;\n \n /**\n * 获取离线地图存储路径\n * @returns Promise<string> 存储路径\n */\n getStoragePath(): Promise<string>;\n \n // ==================== 批量操作 ====================\n \n /**\n * 批量下载地图\n * @param cityCodes 城市代码列表\n * @param allowCellular 是否允许移动网络\n */\n batchDownload(cityCodes: string[], allowCellular?: boolean): Promise<void>;\n \n /**\n * 批量删除地图\n * @param cityCodes 城市代码列表\n */\n batchDelete(cityCodes: string[]): Promise<void>;\n \n /**\n * 批量更新地图\n * @param cityCodes 城市代码列表\n */\n batchUpdate(cityCodes: string[]): Promise<void>;\n \n /**\n * 暂停所有下载任务\n */\n pauseAllDownloads(): Promise<void>;\n \n /**\n * 恢复所有下载任务\n */\n resumeAllDownloads(): Promise<void>;\n\n}\n\nlet nativeModuleCache: ExpoGaodeMapOfflineModule | null = null;\n\nfunction getNativeModule(): ExpoGaodeMapOfflineModule {\n if (!nativeModuleCache) {\n nativeModuleCache = requireNativeModule<ExpoGaodeMapOfflineModule>('ExpoGaodeMapOffline');\n }\n return nativeModuleCache;\n}\n\nfunction getBoundNativeValue(\n module: ExpoGaodeMapOfflineModule,\n prop: PropertyKey\n): unknown {\n const value = Reflect.get(module as object, prop, module as object);\n if (typeof value === 'function') {\n return (...args: unknown[]) =>\n (value as (...fnArgs: unknown[]) => unknown).apply(module, args);\n }\n return value;\n}\n\nexport default new Proxy({} as ExpoGaodeMapOfflineModule, {\n get(_target, prop) {\n return getBoundNativeValue(getNativeModule(), prop);\n },\n});\n"]}
1
+ {"version":3,"file":"ExpoGaodeMapOfflineModule.js","sourceRoot":"","sources":["../src/ExpoGaodeMapOfflineModule.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,YAAY,EAAE,mBAAmB,EAAE,MAAM,MAAM,CAAC;AAsLzD,IAAI,iBAAiB,GAAqC,IAAI,CAAC;AAE/D,SAAS,eAAe;IACtB,IAAI,CAAC,iBAAiB,EAAE,CAAC;QACvB,iBAAiB,GAAG,mBAAmB,CAA4B,qBAAqB,CAAC,CAAC;IAC5F,CAAC;IACD,OAAO,iBAAiB,CAAC;AAC3B,CAAC;AAED,SAAS,mBAAmB,CAC1B,MAAiC,EACjC,IAAiB;IAEjB,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,MAAgB,EAAE,IAAI,EAAE,MAAgB,CAAC,CAAC;IACpE,IAAI,OAAO,KAAK,KAAK,UAAU,EAAE,CAAC;QAChC,OAAO,CAAC,GAAG,IAAe,EAAE,EAAE,CAC3B,KAA2C,CAAC,KAAK,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;IACrE,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,eAAe,IAAI,KAAK,CAAC,EAA+B,EAAE;IACxD,GAAG,CAAC,OAAO,EAAE,IAAI;QACf,OAAO,mBAAmB,CAAC,eAAe,EAAE,EAAE,IAAI,CAAC,CAAC;IACtD,CAAC;CACF,CAAC,CAAC","sourcesContent":["/**\n * 高德地图离线地图原生模块\n */\n\nimport { NativeModule, requireNativeModule } from 'expo';\nimport type {\n OfflineMapInfo,\n OfflineMapDownloadConfig,\n OfflineMapStorageInfo,\n OfflineMapEvents,\n} from './types/offline.types';\n\n/**\n * 离线地图原生模块接口\n */\ndeclare class ExpoGaodeMapOfflineModule extends NativeModule<OfflineMapEvents> {\n // ==================== 地图列表管理 ====================\n\n /**\n * 打开高德 3D 地图 SDK 官方离线地图 UI 组件(Android)。\n * 官方组件内置城市下载、暂停、更新、删除和城市搜索。\n */\n openOfflineMapUI(): Promise<void>;\n \n /**\n * 获取所有可下载的城市列表\n * @returns Promise<OfflineMapInfo[]> 城市列表\n */\n getAvailableCities(): Promise<OfflineMapInfo[]>;\n \n /**\n * 获取所有省份列表\n * @returns Promise<OfflineMapInfo[]> 省份列表\n */\n getAvailableProvinces(): Promise<OfflineMapInfo[]>;\n \n /**\n * 根据省份代码获取城市列表\n * @param provinceCode 省份代码\n * @returns Promise<OfflineMapInfo[]> 该省份下的城市列表\n */\n getCitiesByProvince(provinceCode: string): Promise<OfflineMapInfo[]>;\n \n /**\n * 获取已下载的地图列表\n * @returns Promise<OfflineMapInfo[]> 已下载的地图列表\n */\n getDownloadedMaps(): Promise<OfflineMapInfo[]>;\n \n // ==================== 下载管理 ====================\n \n /**\n * 开始下载离线地图\n * @param config 下载配置\n */\n startDownload(config: OfflineMapDownloadConfig): Promise<void>;\n \n /**\n * 暂停下载\n * @param cityCode 城市代码\n */\n pauseDownload(cityCode: string): Promise<void>;\n \n /**\n * 恢复下载\n * @param cityCode 城市代码\n */\n resumeDownload(cityCode: string): Promise<void>;\n \n /**\n * 取消下载\n * @param cityCode 城市代码\n */\n cancelDownload(cityCode: string): Promise<void>;\n \n /**\n * 删除离线地图\n * @param cityCode 城市代码\n */\n deleteMap(cityCode: string): Promise<void>;\n \n /**\n * 更新离线地图\n * @param cityCode 城市代码\n */\n updateMap(cityCode: string): Promise<void>;\n \n /**\n * 检查是否有可用更新\n * @param cityCode 城市代码\n * @returns Promise<boolean> 是否有更新\n */\n checkUpdate(cityCode: string): Promise<boolean>;\n \n // ==================== 状态查询 ====================\n \n /**\n * 检查地图是否已下载\n * @param cityCode 城市代码\n * @returns Promise<boolean> 是否已下载\n */\n isMapDownloaded(cityCode: string): Promise<boolean>;\n \n /**\n * 获取地图下载状态\n * @param cityCode 城市代码\n * @returns Promise<OfflineMapInfo> 地图信息\n */\n getMapStatus(cityCode: string): Promise<OfflineMapInfo>;\n \n /**\n * 获取所有下载任务的总进度\n * @returns Promise<number> 总进度 (0-100)\n */\n getTotalProgress(): Promise<number>;\n \n /**\n * 获取当前正在下载的城市列表\n * @returns Promise<string[]> 城市代码列表\n */\n getDownloadingCities(): Promise<string[]>;\n \n // ==================== 存储管理 ====================\n \n /**\n * 获取离线地图占用的存储空间(字节)\n * @returns Promise<number> 存储空间大小\n */\n getStorageSize(): Promise<number>;\n \n /**\n * 获取详细的存储信息\n * @returns Promise<OfflineMapStorageInfo> 存储信息\n */\n getStorageInfo(): Promise<OfflineMapStorageInfo>;\n \n /**\n * 清理所有离线地图\n */\n clearAllMaps(): Promise<void>;\n \n /**\n * 设置离线地图存储路径\n * @param path 存储路径\n */\n setStoragePath(path: string): void;\n \n /**\n * 获取离线地图存储路径\n * @returns Promise<string> 存储路径\n */\n getStoragePath(): Promise<string>;\n \n // ==================== 批量操作 ====================\n \n /**\n * 批量下载地图\n * @param cityCodes 城市代码列表\n * @param allowCellular 是否允许移动网络\n */\n batchDownload(cityCodes: string[], allowCellular?: boolean): Promise<void>;\n \n /**\n * 批量删除地图\n * @param cityCodes 城市代码列表\n */\n batchDelete(cityCodes: string[]): Promise<void>;\n \n /**\n * 批量更新地图\n * @param cityCodes 城市代码列表\n */\n batchUpdate(cityCodes: string[]): Promise<void>;\n \n /**\n * 暂停所有下载任务\n */\n pauseAllDownloads(): Promise<void>;\n \n /**\n * 恢复所有下载任务\n */\n resumeAllDownloads(): Promise<void>;\n\n}\n\nlet nativeModuleCache: ExpoGaodeMapOfflineModule | null = null;\n\nfunction getNativeModule(): ExpoGaodeMapOfflineModule {\n if (!nativeModuleCache) {\n nativeModuleCache = requireNativeModule<ExpoGaodeMapOfflineModule>('ExpoGaodeMapOffline');\n }\n return nativeModuleCache;\n}\n\nfunction getBoundNativeValue(\n module: ExpoGaodeMapOfflineModule,\n prop: PropertyKey\n): unknown {\n const value = Reflect.get(module as object, prop, module as object);\n if (typeof value === 'function') {\n return (...args: unknown[]) =>\n (value as (...fnArgs: unknown[]) => unknown).apply(module, args);\n }\n return value;\n}\n\nexport default new Proxy({} as ExpoGaodeMapOfflineModule, {\n get(_target, prop) {\n return getBoundNativeValue(getNativeModule(), prop);\n },\n});\n"]}
@@ -1,3 +1,4 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
1
2
  import * as React from 'react';
2
3
  import ExpoGaodeMapModule from './ExpoGaodeMapModule';
3
4
  import { ErrorHandler } from './utils/ErrorHandler';
@@ -126,14 +127,7 @@ const ExpoGaodeMapView = React.forwardRef((props, ref) => {
126
127
  const { children, style, ...otherProps } = props;
127
128
  const { overlays, uiControls } = React.useMemo(() => splitMapChildren(children), [children]);
128
129
  const containerStyle = React.useMemo(() => [styles.container, style], [style]);
129
- return (<MapContext.Provider value={apiRef}>
130
- <View style={containerStyle}>
131
- <NativeView ref={nativeRef} style={StyleSheet.absoluteFill} {...otherProps}>
132
- {overlays}
133
- </NativeView>
134
- {uiControls}
135
- </View>
136
- </MapContext.Provider>);
130
+ return (_jsx(MapContext.Provider, { value: apiRef, children: _jsxs(View, { style: containerStyle, children: [_jsx(NativeView, { ref: nativeRef, style: StyleSheet.absoluteFill, ...otherProps, children: overlays }), uiControls] }) }));
137
131
  });
138
132
  ExpoGaodeMapView.displayName = 'ExpoGaodeMapView';
139
133
  export default ExpoGaodeMapView;
@@ -1 +1 @@
1
- {"version":3,"file":"ExpoGaodeMapView.js","sourceRoot":"","sources":["../src/ExpoGaodeMapView.tsx"],"names":[],"mappings":"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","sourcesContent":["import * as React from 'react';\n\nimport type {\n MapViewProps,\n MapViewRef,\n CameraPosition,\n CameraUpdate,\n LatLng,\n Point,\n LatLngPoint,\n} from './types';\nimport ExpoGaodeMapModule from './ExpoGaodeMapModule';\n\nimport { ErrorHandler } from './utils/ErrorHandler';\nimport { MapContext } from './components/MapContext';\nimport { MapUI } from './components/MapUI';\nimport { createLazyNativeViewManager } from './utils/lazyNativeViewManager';\nimport { View, StyleSheet } from 'react-native';\nimport { normalizeLatLng } from './utils/GeoUtils';\nimport type { FitToCoordinatesOptions } from './types/route-playback.types';\nimport { fitCameraToCoordinates } from './utils/RouteUtils';\n\nexport type { MapViewRef } from './types';\n\nconst getNativeView = createLazyNativeViewManager<MapViewProps & { ref?: React.Ref<MapViewRef> }>('ExpoGaodeMapView');\n\nfunction splitMapChildren(children: React.ReactNode) {\n const overlays: React.ReactNode[] = [];\n const uiControls: React.ReactNode[] = [];\n\n React.Children.forEach(children, (child) => {\n if (\n React.isValidElement(child) &&\n (child.type === MapUI || (child.type as { isMapUI?: boolean })?.isMapUI)\n ) {\n uiControls.push(child);\n } else {\n overlays.push(child);\n }\n });\n\n return { overlays, uiControls };\n}\n\n/**\n * 高德地图视图组件,提供地图操作API和覆盖物管理功能\n * \n * @param props - 组件属性\n * @param ref - 外部ref引用,用于访问地图API方法\n * @returns 返回包含地图视图和上下文提供者的React组件\n * \n * @remarks\n * 该组件内部维护 nativeRef,用于将 JS ref API 转发到原生地图视图。\n * MapContext 会向子组件共享同一组地图 API 方法。\n * \n * 提供的主要API功能包括:\n * - 相机控制(移动、缩放、获取当前位置)\n * - 屏幕坐标转换、截图、根据坐标集合拟合相机\n * \n * 所有API方法都会检查地图是否已初始化,未初始化时抛出错误\n */\nconst ExpoGaodeMapView = React.forwardRef<MapViewRef, MapViewProps>((props, ref) => {\n const privacyStatus = ExpoGaodeMapModule.getPrivacyStatus();\n if (!privacyStatus.isReady) {\n throw ErrorHandler.privacyNotAgreed('map');\n }\n\n const nativeRef = React.useRef<MapViewRef>(null);\n const NativeView = React.useMemo(() => getNativeView(), []);\n\n const callNativeMethod = React.useCallback(<T extends (...args: never[]) => unknown>(\n methodName: keyof MapViewRef,\n ...args: Parameters<T>\n ) => {\n if (!nativeRef.current) {\n throw ErrorHandler.mapViewNotInitialized(methodName as string);\n }\n\n const nativeMethod = Reflect.get(\n nativeRef.current as object,\n methodName,\n nativeRef.current as object\n );\n\n if (typeof nativeMethod !== 'function') {\n throw new Error(`Method '${methodName}' is not available on native view. Make sure the native module is linked and rebuilt.`);\n }\n\n return (nativeMethod as (...methodArgs: Parameters<T>) => ReturnType<T>).apply(\n nativeRef.current,\n args\n );\n }, []);\n \n /**\n * 通用 API 方法包装器,统一处理初始化检查和错误包装。\n */\n const createApiMethod = React.useCallback(<T extends (...args: never[]) => unknown>(\n methodName: keyof MapViewRef\n ) => {\n return ((...args: Parameters<T>) => {\n try {\n return callNativeMethod<T>(methodName, ...args);\n } catch (error) {\n throw ErrorHandler.wrapNativeError(error, methodName as string);\n }\n }) as T;\n }, [callNativeMethod]);\n\n /**\n * 使用通用包装器创建所有 API 方法\n * 所有方法共享相同的错误处理逻辑\n */\n const apiRef: MapViewRef = React.useMemo(() => ({\n moveCamera: (position: CameraUpdate, duration?: number) => {\n try {\n const normalizedPosition = {\n ...position,\n target: position.target ? normalizeLatLng(position.target) : undefined,\n };\n return callNativeMethod<(cameraPosition: CameraUpdate, animationDuration: number) => Promise<void>>(\n 'moveCamera',\n normalizedPosition,\n duration ?? 0\n );\n } catch (error) {\n throw ErrorHandler.wrapNativeError(error, 'moveCamera');\n }\n },\n getLatLng: createApiMethod<(point: Point) => Promise<LatLng>>('getLatLng'),\n setCenter: (center: LatLngPoint, animated?: boolean) => {\n try {\n return callNativeMethod<(normalizedCenter: LatLng, animatedFlag: boolean) => Promise<void>>(\n 'setCenter',\n normalizeLatLng(center),\n animated ?? false\n );\n } catch (error) {\n throw ErrorHandler.wrapNativeError(error, 'setCenter');\n }\n },\n setZoom: (zoom: number, animated?: boolean) => {\n try {\n return callNativeMethod<(zoomLevel: number, animatedFlag: boolean) => Promise<void>>(\n 'setZoom',\n zoom,\n animated ?? false\n );\n } catch (error) {\n throw ErrorHandler.wrapNativeError(error, 'setZoom');\n }\n },\n getCameraPosition: createApiMethod<() => Promise<CameraPosition>>('getCameraPosition'),\n takeSnapshot: createApiMethod<() => Promise<string>>('takeSnapshot'),\n fitToCoordinates: async (points: LatLngPoint[], options?: FitToCoordinatesOptions) => {\n try {\n await fitCameraToCoordinates(\n {\n moveCamera: (position, duration) =>\n callNativeMethod<(cameraPosition: CameraUpdate, animationDuration: number) => Promise<void>>(\n 'moveCamera',\n position,\n duration ?? 0\n ),\n getCameraPosition: () =>\n callNativeMethod<() => Promise<CameraPosition>>('getCameraPosition'),\n },\n points,\n options\n );\n } catch (error) {\n throw ErrorHandler.wrapNativeError(error, 'fitToCoordinates');\n }\n },\n }), [callNativeMethod, createApiMethod]);\n\n /**\n * 获取当前地图实例的API引用\n * @returns 返回地图API的引用对象,可用于调用地图相关方法\n */\n React.useImperativeHandle(ref, () => apiRef, [apiRef]);\n\n // 分离 children:区分原生覆盖物和普通 UI 组件\n const { children, style, ...otherProps } = props;\n const { overlays, uiControls } = React.useMemo(\n () => splitMapChildren(children),\n [children]\n );\n const containerStyle = React.useMemo(\n () => [styles.container, style],\n [style]\n );\n\n return (\n <MapContext.Provider value={apiRef}>\n <View style={containerStyle}>\n <NativeView\n ref={nativeRef}\n style={StyleSheet.absoluteFill}\n {...otherProps}\n >\n {overlays}\n </NativeView>\n {uiControls}\n </View>\n </MapContext.Provider>\n );\n});\n\nExpoGaodeMapView.displayName = 'ExpoGaodeMapView';\n\nexport default ExpoGaodeMapView;\n\nconst styles = StyleSheet.create({\n container: {\n flex: 1,\n position: 'relative',\n overflow: 'hidden',\n },\n});\n"]}
1
+ {"version":3,"file":"ExpoGaodeMapView.js","sourceRoot":"","sources":["../src/ExpoGaodeMapView.tsx"],"names":[],"mappings":"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","sourcesContent":["import * as React from 'react';\n\nimport type {\n MapViewProps,\n MapViewRef,\n CameraPosition,\n CameraUpdate,\n LatLng,\n Point,\n LatLngPoint,\n} from './types';\nimport ExpoGaodeMapModule from './ExpoGaodeMapModule';\n\nimport { ErrorHandler } from './utils/ErrorHandler';\nimport { MapContext } from './components/MapContext';\nimport { MapUI } from './components/MapUI';\nimport { createLazyNativeViewManager } from './utils/lazyNativeViewManager';\nimport { View, StyleSheet } from 'react-native';\nimport { normalizeLatLng } from './utils/GeoUtils';\nimport type { FitToCoordinatesOptions } from './types/route-playback.types';\nimport { fitCameraToCoordinates } from './utils/RouteUtils';\n\nexport type { MapViewRef } from './types';\n\nconst getNativeView = createLazyNativeViewManager<MapViewProps & { ref?: React.Ref<MapViewRef> }>('ExpoGaodeMapView');\n\nfunction splitMapChildren(children: React.ReactNode) {\n const overlays: React.ReactNode[] = [];\n const uiControls: React.ReactNode[] = [];\n\n React.Children.forEach(children, (child) => {\n if (\n React.isValidElement(child) &&\n (child.type === MapUI || (child.type as { isMapUI?: boolean })?.isMapUI)\n ) {\n uiControls.push(child);\n } else {\n overlays.push(child);\n }\n });\n\n return { overlays, uiControls };\n}\n\n/**\n * 高德地图视图组件,提供地图操作API和覆盖物管理功能\n * \n * @param props - 组件属性\n * @param ref - 外部ref引用,用于访问地图API方法\n * @returns 返回包含地图视图和上下文提供者的React组件\n * \n * @remarks\n * 该组件内部维护 nativeRef,用于将 JS ref API 转发到原生地图视图。\n * MapContext 会向子组件共享同一组地图 API 方法。\n * \n * 提供的主要API功能包括:\n * - 相机控制(移动、缩放、获取当前位置)\n * - 屏幕坐标转换、截图、根据坐标集合拟合相机\n * \n * 所有API方法都会检查地图是否已初始化,未初始化时抛出错误\n */\nconst ExpoGaodeMapView = React.forwardRef<MapViewRef, MapViewProps>((props, ref) => {\n const privacyStatus = ExpoGaodeMapModule.getPrivacyStatus();\n if (!privacyStatus.isReady) {\n throw ErrorHandler.privacyNotAgreed('map');\n }\n\n const nativeRef = React.useRef<MapViewRef>(null);\n const NativeView = React.useMemo(() => getNativeView(), []);\n\n const callNativeMethod = React.useCallback(<T extends (...args: never[]) => unknown>(\n methodName: keyof MapViewRef,\n ...args: Parameters<T>\n ) => {\n if (!nativeRef.current) {\n throw ErrorHandler.mapViewNotInitialized(methodName as string);\n }\n\n const nativeMethod = Reflect.get(\n nativeRef.current as object,\n methodName,\n nativeRef.current as object\n );\n\n if (typeof nativeMethod !== 'function') {\n throw new Error(`Method '${methodName}' is not available on native view. Make sure the native module is linked and rebuilt.`);\n }\n\n return (nativeMethod as (...methodArgs: Parameters<T>) => ReturnType<T>).apply(\n nativeRef.current,\n args\n );\n }, []);\n \n /**\n * 通用 API 方法包装器,统一处理初始化检查和错误包装。\n */\n const createApiMethod = React.useCallback(<T extends (...args: never[]) => unknown>(\n methodName: keyof MapViewRef\n ) => {\n return ((...args: Parameters<T>) => {\n try {\n return callNativeMethod<T>(methodName, ...args);\n } catch (error) {\n throw ErrorHandler.wrapNativeError(error, methodName as string);\n }\n }) as T;\n }, [callNativeMethod]);\n\n /**\n * 使用通用包装器创建所有 API 方法\n * 所有方法共享相同的错误处理逻辑\n */\n const apiRef: MapViewRef = React.useMemo(() => ({\n moveCamera: (position: CameraUpdate, duration?: number) => {\n try {\n const normalizedPosition = {\n ...position,\n target: position.target ? normalizeLatLng(position.target) : undefined,\n };\n return callNativeMethod<(cameraPosition: CameraUpdate, animationDuration: number) => Promise<void>>(\n 'moveCamera',\n normalizedPosition,\n duration ?? 0\n );\n } catch (error) {\n throw ErrorHandler.wrapNativeError(error, 'moveCamera');\n }\n },\n getLatLng: createApiMethod<(point: Point) => Promise<LatLng>>('getLatLng'),\n setCenter: (center: LatLngPoint, animated?: boolean) => {\n try {\n return callNativeMethod<(normalizedCenter: LatLng, animatedFlag: boolean) => Promise<void>>(\n 'setCenter',\n normalizeLatLng(center),\n animated ?? false\n );\n } catch (error) {\n throw ErrorHandler.wrapNativeError(error, 'setCenter');\n }\n },\n setZoom: (zoom: number, animated?: boolean) => {\n try {\n return callNativeMethod<(zoomLevel: number, animatedFlag: boolean) => Promise<void>>(\n 'setZoom',\n zoom,\n animated ?? false\n );\n } catch (error) {\n throw ErrorHandler.wrapNativeError(error, 'setZoom');\n }\n },\n getCameraPosition: createApiMethod<() => Promise<CameraPosition>>('getCameraPosition'),\n takeSnapshot: createApiMethod<() => Promise<string>>('takeSnapshot'),\n fitToCoordinates: async (points: LatLngPoint[], options?: FitToCoordinatesOptions) => {\n try {\n await fitCameraToCoordinates(\n {\n moveCamera: (position, duration) =>\n callNativeMethod<(cameraPosition: CameraUpdate, animationDuration: number) => Promise<void>>(\n 'moveCamera',\n position,\n duration ?? 0\n ),\n getCameraPosition: () =>\n callNativeMethod<() => Promise<CameraPosition>>('getCameraPosition'),\n },\n points,\n options\n );\n } catch (error) {\n throw ErrorHandler.wrapNativeError(error, 'fitToCoordinates');\n }\n },\n }), [callNativeMethod, createApiMethod]);\n\n /**\n * 获取当前地图实例的API引用\n * @returns 返回地图API的引用对象,可用于调用地图相关方法\n */\n React.useImperativeHandle(ref, () => apiRef, [apiRef]);\n\n // 分离 children:区分原生覆盖物和普通 UI 组件\n const { children, style, ...otherProps } = props;\n const { overlays, uiControls } = React.useMemo(\n () => splitMapChildren(children),\n [children]\n );\n const containerStyle = React.useMemo(\n () => [styles.container, style],\n [style]\n );\n\n return (\n <MapContext.Provider value={apiRef}>\n <View style={containerStyle}>\n <NativeView\n ref={nativeRef}\n style={StyleSheet.absoluteFill}\n {...otherProps}\n >\n {overlays}\n </NativeView>\n {uiControls}\n </View>\n </MapContext.Provider>\n );\n});\n\nExpoGaodeMapView.displayName = 'ExpoGaodeMapView';\n\nexport default ExpoGaodeMapView;\n\nconst styles = StyleSheet.create({\n container: {\n flex: 1,\n position: 'relative',\n overflow: 'hidden',\n },\n});\n"]}
@@ -1,5 +1,4 @@
1
- import * as React from 'react';
2
1
  import type { AreaMaskOverlayProps } from '../types/route-playback.types';
3
- export declare function AreaMaskOverlay({ rings, polygonProps }: AreaMaskOverlayProps): React.JSX.Element | null;
2
+ export declare function AreaMaskOverlay({ rings, polygonProps }: AreaMaskOverlayProps): import("react/jsx-runtime").JSX.Element | null;
4
3
  export default AreaMaskOverlay;
5
4
  //# sourceMappingURL=AreaMaskOverlay.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"AreaMaskOverlay.d.ts","sourceRoot":"","sources":["../../src/components/AreaMaskOverlay.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAE/B,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,+BAA+B,CAAC;AAK1E,wBAAgB,eAAe,CAAC,EAAE,KAAK,EAAE,YAAY,EAAE,EAAE,oBAAoB,4BAwB5E;AAED,eAAe,eAAe,CAAC"}
1
+ {"version":3,"file":"AreaMaskOverlay.d.ts","sourceRoot":"","sources":["../../src/components/AreaMaskOverlay.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,+BAA+B,CAAC;AAK1E,wBAAgB,eAAe,CAAC,EAAE,KAAK,EAAE,YAAY,EAAE,EAAE,oBAAoB,kDAwB5E;AAED,eAAe,eAAe,CAAC"}
@@ -1,3 +1,4 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
1
2
  import * as React from 'react';
2
3
  import { normalizeLatLngList } from '../utils/GeoUtils';
3
4
  import { parseMultiRingPolyline } from '../utils/RouteUtils';
@@ -14,7 +15,7 @@ export function AreaMaskOverlay({ rings, polygonProps }) {
14
15
  if (!normalizedPoints.length) {
15
16
  return null;
16
17
  }
17
- return (<Polygon points={normalizedPoints} fillColor={polygonProps?.fillColor ?? 'rgba(15, 23, 42, 0.45)'} strokeColor={polygonProps?.strokeColor ?? 'rgba(15, 23, 42, 0.8)'} strokeWidth={polygonProps?.strokeWidth ?? 1} {...polygonProps}/>);
18
+ return (_jsx(Polygon, { points: normalizedPoints, fillColor: polygonProps?.fillColor ?? 'rgba(15, 23, 42, 0.45)', strokeColor: polygonProps?.strokeColor ?? 'rgba(15, 23, 42, 0.8)', strokeWidth: polygonProps?.strokeWidth ?? 1, ...polygonProps }));
18
19
  }
19
20
  export default AreaMaskOverlay;
20
21
  //# sourceMappingURL=AreaMaskOverlay.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"AreaMaskOverlay.js","sourceRoot":"","sources":["../../src/components/AreaMaskOverlay.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAG/B,OAAO,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AACxD,OAAO,EAAE,sBAAsB,EAAE,MAAM,qBAAqB,CAAC;AAC7D,OAAO,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AAErC,MAAM,UAAU,eAAe,CAAC,EAAE,KAAK,EAAE,YAAY,EAAwB;IAC3E,kCAAkC;IAClC,6BAA6B;IAC7B,MAAM,gBAAgB,GAAG,KAAK,CAAC,OAAO,CAAC,GAAG,EAAE;QAC1C,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;YAC9B,OAAO,sBAAsB,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC;QAC7C,CAAC;QAED,OAAO,mBAAmB,CAAC,KAAK,CAAC,CAAC;IACpC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC;IAEZ,IAAI,CAAC,gBAAgB,CAAC,MAAM,EAAE,CAAC;QAC7B,OAAO,IAAI,CAAC;IACd,CAAC;IAED,OAAO,CACL,CAAC,OAAO,CACN,MAAM,CAAC,CAAC,gBAAgB,CAAC,CACzB,SAAS,CAAC,CAAC,YAAY,EAAE,SAAS,IAAI,wBAAwB,CAAC,CAC/D,WAAW,CAAC,CAAC,YAAY,EAAE,WAAW,IAAI,uBAAuB,CAAC,CAClE,WAAW,CAAC,CAAC,YAAY,EAAE,WAAW,IAAI,CAAC,CAAC,CAC5C,IAAI,YAAY,CAAC,EACjB,CACH,CAAC;AACJ,CAAC;AAED,eAAe,eAAe,CAAC","sourcesContent":["import * as React from 'react';\n\nimport type { AreaMaskOverlayProps } from '../types/route-playback.types';\nimport { normalizeLatLngList } from '../utils/GeoUtils';\nimport { parseMultiRingPolyline } from '../utils/RouteUtils';\nimport { Polygon } from './overlays';\n\nexport function AreaMaskOverlay({ rings, polygonProps }: AreaMaskOverlayProps) {\n // 支持直接传多环坐标,或传高德返回的 polyline 字符串。\n // 最终都落到 Polygon 的“带孔多边形”能力上。\n const normalizedPoints = React.useMemo(() => {\n if (typeof rings === 'string') {\n return parseMultiRingPolyline(rings).rings;\n }\n\n return normalizeLatLngList(rings);\n }, [rings]);\n\n if (!normalizedPoints.length) {\n return null;\n }\n\n return (\n <Polygon\n points={normalizedPoints}\n fillColor={polygonProps?.fillColor ?? 'rgba(15, 23, 42, 0.45)'}\n strokeColor={polygonProps?.strokeColor ?? 'rgba(15, 23, 42, 0.8)'}\n strokeWidth={polygonProps?.strokeWidth ?? 1}\n {...polygonProps}\n />\n );\n}\n\nexport default AreaMaskOverlay;\n"]}
1
+ {"version":3,"file":"AreaMaskOverlay.js","sourceRoot":"","sources":["../../src/components/AreaMaskOverlay.tsx"],"names":[],"mappings":";AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAG/B,OAAO,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AACxD,OAAO,EAAE,sBAAsB,EAAE,MAAM,qBAAqB,CAAC;AAC7D,OAAO,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AAErC,MAAM,UAAU,eAAe,CAAC,EAAE,KAAK,EAAE,YAAY,EAAwB;IAC3E,kCAAkC;IAClC,6BAA6B;IAC7B,MAAM,gBAAgB,GAAG,KAAK,CAAC,OAAO,CAAC,GAAG,EAAE;QAC1C,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;YAC9B,OAAO,sBAAsB,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC;QAC7C,CAAC;QAED,OAAO,mBAAmB,CAAC,KAAK,CAAC,CAAC;IACpC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC;IAEZ,IAAI,CAAC,gBAAgB,CAAC,MAAM,EAAE,CAAC;QAC7B,OAAO,IAAI,CAAC;IACd,CAAC;IAED,OAAO,CACL,KAAC,OAAO,IACN,MAAM,EAAE,gBAAgB,EACxB,SAAS,EAAE,YAAY,EAAE,SAAS,IAAI,wBAAwB,EAC9D,WAAW,EAAE,YAAY,EAAE,WAAW,IAAI,uBAAuB,EACjE,WAAW,EAAE,YAAY,EAAE,WAAW,IAAI,CAAC,KACvC,YAAY,GAChB,CACH,CAAC;AACJ,CAAC;AAED,eAAe,eAAe,CAAC","sourcesContent":["import * as React from 'react';\n\nimport type { AreaMaskOverlayProps } from '../types/route-playback.types';\nimport { normalizeLatLngList } from '../utils/GeoUtils';\nimport { parseMultiRingPolyline } from '../utils/RouteUtils';\nimport { Polygon } from './overlays';\n\nexport function AreaMaskOverlay({ rings, polygonProps }: AreaMaskOverlayProps) {\n // 支持直接传多环坐标,或传高德返回的 polyline 字符串。\n // 最终都落到 Polygon 的“带孔多边形”能力上。\n const normalizedPoints = React.useMemo(() => {\n if (typeof rings === 'string') {\n return parseMultiRingPolyline(rings).rings;\n }\n\n return normalizeLatLngList(rings);\n }, [rings]);\n\n if (!normalizedPoints.length) {\n return null;\n }\n\n return (\n <Polygon\n points={normalizedPoints}\n fillColor={polygonProps?.fillColor ?? 'rgba(15, 23, 42, 0.45)'}\n strokeColor={polygonProps?.strokeColor ?? 'rgba(15, 23, 42, 0.8)'}\n strokeWidth={polygonProps?.strokeWidth ?? 1}\n {...polygonProps}\n />\n );\n}\n\nexport default AreaMaskOverlay;\n"]}
@@ -1,6 +1,7 @@
1
1
  import React from 'react';
2
- import { DeviceInfo, FoldState } from '../utils/PlatformDetector';
3
- import { MapViewProps, MapViewRef } from '../types';
2
+ import { FoldState } from '../utils/PlatformDetector';
3
+ import type { DeviceInfo } from '../utils/PlatformDetector';
4
+ import type { MapViewProps, MapViewRef } from '../types';
4
5
  /**
5
6
  * 折叠屏适配配置
6
7
  */
@@ -1 +1 @@
1
- {"version":3,"file":"FoldableMapView.d.ts","sourceRoot":"","sources":["../../src/components/FoldableMapView.tsx"],"names":[],"mappings":"AAAA,OAAO,KAA+C,MAAM,OAAO,CAAC;AAKpE,OAAO,EAAoB,UAAU,EAAE,SAAS,EAAE,MAAM,2BAA2B,CAAC;AACpF,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AAEpD;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,oBAAoB;IACpB,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,iBAAiB;IACjB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,qBAAqB;IACrB,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,eAAe;IACf,iBAAiB,CAAC,EAAE,CAAC,KAAK,EAAE,SAAS,EAAE,UAAU,EAAE,UAAU,KAAK,IAAI,CAAC;IACvE,eAAe;IACf,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAED;;;;GAIG;AACH,MAAM,WAAW,oBAAqB,SAAQ,YAAY;IACxD,cAAc;IACd,cAAc,CAAC,EAAE,cAAc,CAAC;CACjC;AA2ED,eAAO,MAAM,eAAe,EAAE,KAAK,CAAC,EAAE,CAAC,oBAAoB,CA0F1D,CAAC;AAEF;;;;GAIG;AACH,wBAAgB,cAAc,CAC5B,MAAM,EAAE,KAAK,CAAC,SAAS,CAAC,UAAU,CAAC,EACnC,MAAM,CAAC,EAAE,cAAc;;;;EA8DxB"}
1
+ {"version":3,"file":"FoldableMapView.d.ts","sourceRoot":"","sources":["../../src/components/FoldableMapView.tsx"],"names":[],"mappings":"AAAA,OAAO,KAA+C,MAAM,OAAO,CAAC;AAKpE,OAAO,EAAoB,SAAS,EAAE,MAAM,2BAA2B,CAAC;AACxE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAC;AAC5D,OAAO,KAAK,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AAEzD;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,oBAAoB;IACpB,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,iBAAiB;IACjB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,qBAAqB;IACrB,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,eAAe;IACf,iBAAiB,CAAC,EAAE,CAAC,KAAK,EAAE,SAAS,EAAE,UAAU,EAAE,UAAU,KAAK,IAAI,CAAC;IACvE,eAAe;IACf,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAED;;;;GAIG;AACH,MAAM,WAAW,oBAAqB,SAAQ,YAAY;IACxD,cAAc;IACd,cAAc,CAAC,EAAE,cAAc,CAAC;CACjC;AA2ED,eAAO,MAAM,eAAe,EAAE,KAAK,CAAC,EAAE,CAAC,oBAAoB,CA0F1D,CAAC;AAEF;;;;GAIG;AACH,wBAAgB,cAAc,CAC5B,MAAM,EAAE,KAAK,CAAC,SAAS,CAAC,UAAU,CAAC,EACnC,MAAM,CAAC,EAAE,cAAc;;;;EA8DxB"}
@@ -1,3 +1,4 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
1
2
  import React, { useEffect, useMemo, useRef, useState } from 'react';
2
3
  import { Platform } from 'react-native';
3
4
  import ExpoGaodeMapView from '../ExpoGaodeMapView';
@@ -119,7 +120,7 @@ export const FoldableMapView = ({ foldableConfig, ...mapProps }) => {
119
120
  removeListener();
120
121
  };
121
122
  }, [config.debug, deviceInfo.isFoldable, handleFoldStateChange]);
122
- return (<ExpoGaodeMapView ref={mapRef} {...mapProps}/>);
123
+ return (_jsx(ExpoGaodeMapView, { ref: mapRef, ...mapProps }));
123
124
  };
124
125
  /**
125
126
  * 折叠屏适配 Hook
@@ -1 +1 @@
1
- {"version":3,"file":"FoldableMapView.js","sourceRoot":"","sources":["../../src/components/FoldableMapView.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AACpE,OAAO,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;AACxC,OAAO,gBAAgB,MAAM,qBAAqB,CAAC;AAEnD,OAAO,EAAE,gBAAgB,EAAE,MAAM,2BAA2B,CAAC;AAC7D,OAAO,EAAE,gBAAgB,EAAc,SAAS,EAAE,MAAM,2BAA2B,CAAC;AA6BpF,MAAM,uBAAuB,GAA6B;IACxD,cAAc,EAAE,IAAI;IACpB,iBAAiB,EAAE,CAAC;IACpB,gBAAgB,EAAE,IAAI;IACtB,iBAAiB,EAAE,GAAG,EAAE,GAAE,CAAC;IAC3B,KAAK,EAAE,KAAK;CACb,CAAC;AAEF,SAAS,cAAc,CAAC,IAAY;IAClC,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC,CAAC;AACzC,CAAC;AAED,SAAS,oBAAoB,CAAC,MAAuB;IACnD,OAAO;QACL,GAAG,uBAAuB;QAC1B,GAAG,MAAM;KACV,CAAC;AACJ,CAAC;AAED,KAAK,UAAU,8BAA8B,CAC3C,MAA0C,EAC1C,QAAmB,EACnB,QAAmB,EACnB,MAAgC,EAChC,WAAiD;IAEjD,IAAI,CAAC,MAAM,CAAC,OAAO,IAAI,CAAC,MAAM,CAAC,cAAc,EAAE,CAAC;QAC9C,OAAO;IACT,CAAC;IAED,MAAM,aAAa,GAAG,MAAM,MAAM,CAAC,OAAO,CAAC,iBAAiB,EAAE,CAAC;IAC/D,IAAI,CAAC,aAAa,EAAE,CAAC;QACnB,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC;YACjB,OAAO,CAAC,IAAI,CAAC,IAAI,WAAW,YAAY,CAAC,CAAC;QAC5C,CAAC;QACD,OAAO;IACT,CAAC;IAED,MAAM,WAAW,GAAG,QAAQ,KAAK,SAAS,CAAC,QAAQ,IAAI,QAAQ,KAAK,SAAS,CAAC,MAAM,CAAC;IACrF,MAAM,SAAS,GAAG,QAAQ,KAAK,SAAS,CAAC,MAAM,IAAI,QAAQ,KAAK,SAAS,CAAC,QAAQ,CAAC;IAEnF,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC;QACjB,OAAO,CAAC,GAAG,CAAC,IAAI,WAAW,WAAW,EAAE;YACtC,QAAQ;YACR,QAAQ;YACR,WAAW;YACX,SAAS;YACT,WAAW,EAAE,aAAa,CAAC,IAAI;SAChC,CAAC,CAAC;IACL,CAAC;IAED,IAAI,CAAC,WAAW,IAAI,CAAC,SAAS,EAAE,CAAC;QAC/B,OAAO;IACT,CAAC;IAED,MAAM,WAAW,GAAG,aAAa,CAAC,IAAI,IAAI,EAAE,CAAC;IAC7C,MAAM,SAAS,GAAG,WAAW,CAAC,CAAC,CAAC,MAAM,CAAC,iBAAiB,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,iBAAiB,CAAC;IACrF,MAAM,QAAQ,GAAG,cAAc,CAAC,WAAW,GAAG,SAAS,CAAC,CAAC;IAEzD,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC;QACjB,OAAO,CAAC,GAAG,CAAC,IAAI,WAAW,SAAS,EAAE;YACpC,OAAO,EAAE,WAAW;YACpB,OAAO,EAAE,QAAQ;YACjB,KAAK,EAAE,SAAS;SACjB,CAAC,CAAC;IACL,CAAC;IAED,MAAM,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC;QAC9B,MAAM,EAAE,MAAM,CAAC,gBAAgB,CAAC,CAAC,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS;QAClE,IAAI,EAAE,QAAQ;KACf,EAAE,GAAG,CAAC,CAAC;AACV,CAAC;AAED,MAAM,CAAC,MAAM,eAAe,GAAmC,CAAC,EAC9D,cAAc,EACd,GAAG,QAAQ,EACZ,EAAE,EAAE;IACH,MAAM,MAAM,GAAG,MAAM,CAAa,IAAI,CAAC,CAAC;IACxC,MAAM,CAAC,gBAAgB,EAAE,mBAAmB,CAAC,GAAG,QAAQ,CAAY,SAAS,CAAC,OAAO,CAAC,CAAC;IACvF,MAAM,CAAC,UAAU,EAAE,aAAa,CAAC,GAAG,QAAQ,CAAa,gBAAgB,CAAC,aAAa,EAAE,CAAC,CAAC;IAC3F,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC,oBAAoB,CAAC,cAAc,CAAC,EAAE,CAAC,cAAc,CAAC,CAAC,CAAC;IACrF,MAAM,YAAY,GAAG,MAAM,CAAC,gBAAgB,CAAC,CAAC;IAE9C,MAAM,qBAAqB,GAAG,gBAAgB,CAC5C,KAAK,EAAE,OAAmB,EAAE,WAAiD,EAAE,EAAE;QAC/E,MAAM,YAAY,GAAG,gBAAgB,CAAC,YAAY,EAAE,CAAC;QACrD,MAAM,iBAAiB,GAAG,YAAY,CAAC,OAAO,CAAC;QAE/C,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC;YACjB,OAAO,CAAC,GAAG,CAAC,IAAI,WAAW,UAAU,CAAC,CAAC;YACvC,OAAO,CAAC,GAAG,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;YAC/B,OAAO,CAAC,GAAG,CAAC,QAAQ,EAAE,YAAY,CAAC,CAAC;QACtC,CAAC;QAED,IAAI,YAAY,KAAK,iBAAiB,IAAI,iBAAiB,KAAK,SAAS,CAAC,OAAO,EAAE,CAAC;YAClF,IAAI,CAAC;gBACH,MAAM,8BAA8B,CAClC,MAAM,EACN,iBAAiB,EACjB,YAAY,EACZ,MAAM,EACN,WAAW,CACZ,CAAC;YACJ,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC;oBACjB,OAAO,CAAC,KAAK,CAAC,IAAI,WAAW,eAAe,EAAE,KAAK,CAAC,CAAC;gBACvD,CAAC;YACH,CAAC;QACH,CAAC;QAED,YAAY,CAAC,OAAO,GAAG,YAAY,CAAC;QACpC,mBAAmB,CAAC,YAAY,CAAC,CAAC;QAClC,aAAa,CAAC,OAAO,CAAC,CAAC;QACvB,MAAM,CAAC,iBAAiB,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC;IAClD,CAAC,CACF,CAAC;IAEF,SAAS,CAAC,GAAG,EAAE;QACb,YAAY,CAAC,OAAO,GAAG,gBAAgB,CAAC;IAC1C,CAAC,EAAE,CAAC,gBAAgB,CAAC,CAAC,CAAC;IAEvB,SAAS,CAAC,GAAG,EAAE;QACb,MAAM,gBAAgB,GAAG,gBAAgB,CAAC,aAAa,EAAE,CAAC;QAC1D,aAAa,CAAC,gBAAgB,CAAC,CAAC;IAClC,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,SAAS,CAAC,GAAG,EAAE;QACb,sBAAsB;QACtB,IAAI,QAAQ,CAAC,EAAE,KAAK,SAAS,IAAI,CAAC,UAAU,CAAC,UAAU,EAAE,CAAC;YACxD,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC;gBACjB,OAAO,CAAC,GAAG,CAAC,+BAA+B,CAAC,CAAC;YAC/C,CAAC;YACD,OAAO;QACT,CAAC;QAED,MAAM,YAAY,GAAG,gBAAgB,CAAC,YAAY,EAAE,CAAC;QACrD,YAAY,CAAC,OAAO,GAAG,YAAY,CAAC;QACpC,mBAAmB,CAAC,YAAY,CAAC,CAAC;QAElC,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC;YACjB,OAAO,CAAC,GAAG,CAAC,4BAA4B,CAAC,CAAC;YAC1C,OAAO,CAAC,GAAG,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC;YACjC,OAAO,CAAC,GAAG,CAAC,SAAS,EAAE,YAAY,CAAC,CAAC;QACvC,CAAC;QAED,WAAW;QACX,MAAM,cAAc,GAAG,gBAAgB,CAAC,0BAA0B,CAChE,KAAK,EAAE,OAAmB,EAAE,EAAE;YAC5B,MAAM,qBAAqB,CAAC,OAAO,EAAE,iBAAiB,CAAC,CAAC;QAC1D,CAAC,CACF,CAAC;QAEF,OAAO,GAAG,EAAE;YACV,cAAc,EAAE,CAAC;QACnB,CAAC,CAAC;IACJ,CAAC,EAAE,CAAC,MAAM,CAAC,KAAK,EAAE,UAAU,CAAC,UAAU,EAAE,qBAAqB,CAAC,CAAC,CAAC;IAEjE,OAAO,CACL,CAAC,gBAAgB,CACf,GAAG,CAAC,CAAC,MAAM,CAAC,CACZ,IAAI,QAAQ,CAAC,EACb,CACH,CAAC;AACJ,CAAC,CAAC;AAEF;;;;GAIG;AACH,MAAM,UAAU,cAAc,CAC5B,MAAmC,EACnC,MAAuB;IAEvB,MAAM,CAAC,SAAS,EAAE,YAAY,CAAC,GAAG,QAAQ,CAAY,SAAS,CAAC,OAAO,CAAC,CAAC;IACzE,MAAM,CAAC,UAAU,EAAE,aAAa,CAAC,GAAG,QAAQ,CAAa,gBAAgB,CAAC,aAAa,EAAE,CAAC,CAAC;IAC3F,MAAM,YAAY,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC,oBAAoB,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC;IAC3E,MAAM,YAAY,GAAG,MAAM,CAAC,SAAS,CAAC,CAAC;IAEvC,SAAS,CAAC,GAAG,EAAE;QACb,YAAY,CAAC,OAAO,GAAG,SAAS,CAAC;IACnC,CAAC,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC;IAEhB,MAAM,qBAAqB,GAAG,gBAAgB,CAAC,KAAK,EAAE,OAAmB,EAAE,EAAE;QAC3E,MAAM,YAAY,GAAG,gBAAgB,CAAC,YAAY,EAAE,CAAC;QACrD,MAAM,iBAAiB,GAAG,YAAY,CAAC,OAAO,CAAC;QAE/C,IAAI,YAAY,KAAK,iBAAiB,IAAI,iBAAiB,KAAK,SAAS,CAAC,OAAO,EAAE,CAAC;YAClF,IAAI,CAAC;gBACH,MAAM,8BAA8B,CAClC,MAAM,EACN,iBAAiB,EACjB,YAAY,EACZ,YAAY,EACZ,gBAAgB,CACjB,CAAC;YACJ,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,IAAI,YAAY,CAAC,KAAK,EAAE,CAAC;oBACvB,OAAO,CAAC,KAAK,CAAC,wBAAwB,EAAE,KAAK,CAAC,CAAC;gBACjD,CAAC;YACH,CAAC;QACH,CAAC;QAED,YAAY,CAAC,OAAO,GAAG,YAAY,CAAC;QACpC,YAAY,CAAC,YAAY,CAAC,CAAC;QAC3B,aAAa,CAAC,OAAO,CAAC,CAAC;QACvB,YAAY,CAAC,iBAAiB,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC;IACxD,CAAC,CAAC,CAAC;IAEH,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,QAAQ,CAAC,EAAE,KAAK,SAAS,IAAI,CAAC,UAAU,CAAC,UAAU,EAAE,CAAC;YACxD,OAAO;QACT,CAAC;QAED,MAAM,YAAY,GAAG,gBAAgB,CAAC,YAAY,EAAE,CAAC;QACrD,YAAY,CAAC,OAAO,GAAG,YAAY,CAAC;QACpC,YAAY,CAAC,YAAY,CAAC,CAAC;QAE3B,MAAM,cAAc,GAAG,gBAAgB,CAAC,0BAA0B,CAChE,KAAK,EAAE,OAAmB,EAAE,EAAE;YAC5B,MAAM,qBAAqB,CAAC,OAAO,CAAC,CAAC;QACvC,CAAC,CACF,CAAC;QAEF,OAAO,GAAG,EAAE;YACV,cAAc,EAAE,CAAC;QACnB,CAAC,CAAC;IACJ,CAAC,EAAE,CAAC,UAAU,CAAC,UAAU,EAAE,qBAAqB,EAAE,MAAM,CAAC,CAAC,CAAC;IAE3D,OAAO;QACL,SAAS;QACT,UAAU;QACV,UAAU,EAAE,UAAU,CAAC,UAAU;KAClC,CAAC;AACJ,CAAC","sourcesContent":["import React, { useEffect, useMemo, useRef, useState } from 'react';\nimport { Platform } from 'react-native';\nimport ExpoGaodeMapView from '../ExpoGaodeMapView';\n\nimport { useEventCallback } from '../hooks/useEventCallback';\nimport { PlatformDetector, DeviceInfo, FoldState } from '../utils/PlatformDetector';\nimport { MapViewProps, MapViewRef } from '../types';\n\n/**\n * 折叠屏适配配置\n */\nexport interface FoldableConfig {\n /** 折叠时是否自动调整缩放级别 */\n autoAdjustZoom?: boolean;\n /** 展开时的缩放级别增量 */\n unfoldedZoomDelta?: number;\n /** 是否在折叠/展开时保持中心点 */\n keepCenterOnFold?: boolean;\n /** 折叠状态变化回调 */\n onFoldStateChange?: (state: FoldState, deviceInfo: DeviceInfo) => void;\n /** 是否启用调试日志 */\n debug?: boolean;\n}\n\n/**\n * 折叠屏地图视图组件\n * \n * 自动适配折叠屏设备的展开/折叠状态变化\n */\nexport interface FoldableMapViewProps extends MapViewProps {\n /** 折叠屏适配配置 */\n foldableConfig?: FoldableConfig;\n}\n\nconst DEFAULT_FOLDABLE_CONFIG: Required<FoldableConfig> = {\n autoAdjustZoom: true,\n unfoldedZoomDelta: 1,\n keepCenterOnFold: true,\n onFoldStateChange: () => {},\n debug: false,\n};\n\nfunction clampZoomLevel(zoom: number): number {\n return Math.max(3, Math.min(20, zoom));\n}\n\nfunction createFoldableConfig(config?: FoldableConfig): Required<FoldableConfig> {\n return {\n ...DEFAULT_FOLDABLE_CONFIG,\n ...config,\n };\n}\n\nasync function applyFoldStateCameraAdjustment(\n mapRef: React.RefObject<MapViewRef | null>,\n oldState: FoldState,\n newState: FoldState,\n config: Required<FoldableConfig>,\n debugPrefix: 'FoldableMapView' | 'useFoldableMap'\n): Promise<void> {\n if (!mapRef.current || !config.autoAdjustZoom) {\n return;\n }\n\n const currentCamera = await mapRef.current.getCameraPosition();\n if (!currentCamera) {\n if (config.debug) {\n console.warn(`[${debugPrefix}] 无法获取相机位置`);\n }\n return;\n }\n\n const isUnfolding = newState === FoldState.UNFOLDED && oldState === FoldState.FOLDED;\n const isFolding = newState === FoldState.FOLDED && oldState === FoldState.UNFOLDED;\n\n if (config.debug) {\n console.log(`[${debugPrefix}] 折叠状态变化:`, {\n oldState,\n newState,\n isUnfolding,\n isFolding,\n currentZoom: currentCamera.zoom,\n });\n }\n\n if (!isUnfolding && !isFolding) {\n return;\n }\n\n const currentZoom = currentCamera.zoom ?? 15;\n const zoomDelta = isUnfolding ? config.unfoldedZoomDelta : -config.unfoldedZoomDelta;\n const nextZoom = clampZoomLevel(currentZoom + zoomDelta);\n\n if (config.debug) {\n console.log(`[${debugPrefix}] 调整缩放:`, {\n oldZoom: currentZoom,\n newZoom: nextZoom,\n delta: zoomDelta,\n });\n }\n\n await mapRef.current.moveCamera({\n target: config.keepCenterOnFold ? currentCamera.target : undefined,\n zoom: nextZoom,\n }, 300);\n}\n\nexport const FoldableMapView: React.FC<FoldableMapViewProps> = ({\n foldableConfig,\n ...mapProps\n}) => {\n const mapRef = useRef<MapViewRef>(null);\n const [currentFoldState, setCurrentFoldState] = useState<FoldState>(FoldState.UNKNOWN);\n const [deviceInfo, setDeviceInfo] = useState<DeviceInfo>(PlatformDetector.getDeviceInfo());\n const config = useMemo(() => createFoldableConfig(foldableConfig), [foldableConfig]);\n const foldStateRef = useRef(currentFoldState);\n\n const handleFoldStateChange = useEventCallback(\n async (newInfo: DeviceInfo, debugPrefix: 'FoldableMapView' | 'useFoldableMap') => {\n const newFoldState = PlatformDetector.getFoldState();\n const previousFoldState = foldStateRef.current;\n\n if (config.debug) {\n console.log(`[${debugPrefix}] 屏幕尺寸变化`);\n console.log('新设备信息:', newInfo);\n console.log('新折叠状态:', newFoldState);\n }\n\n if (newFoldState !== previousFoldState && previousFoldState !== FoldState.UNKNOWN) {\n try {\n await applyFoldStateCameraAdjustment(\n mapRef,\n previousFoldState,\n newFoldState,\n config,\n debugPrefix\n );\n } catch (error) {\n if (config.debug) {\n console.error(`[${debugPrefix}] 处理折叠状态变化失败:`, error);\n }\n }\n }\n\n foldStateRef.current = newFoldState;\n setCurrentFoldState(newFoldState);\n setDeviceInfo(newInfo);\n config.onFoldStateChange(newFoldState, newInfo);\n }\n );\n\n useEffect(() => {\n foldStateRef.current = currentFoldState;\n }, [currentFoldState]);\n\n useEffect(() => {\n const latestDeviceInfo = PlatformDetector.getDeviceInfo();\n setDeviceInfo(latestDeviceInfo);\n }, []);\n\n useEffect(() => {\n // 仅在 Android 折叠屏设备上启用\n if (Platform.OS !== 'android' || !deviceInfo.isFoldable) {\n if (config.debug) {\n console.log('[FoldableMapView] 非折叠屏设备,跳过适配');\n }\n return;\n }\n\n const initialState = PlatformDetector.getFoldState();\n foldStateRef.current = initialState;\n setCurrentFoldState(initialState);\n\n if (config.debug) {\n console.log('[FoldableMapView] 初始化折叠屏适配');\n console.log('设备信息:', deviceInfo);\n console.log('初始折叠状态:', initialState);\n }\n\n // 监听屏幕尺寸变化\n const removeListener = PlatformDetector.addDimensionChangeListener(\n async (newInfo: DeviceInfo) => {\n await handleFoldStateChange(newInfo, 'FoldableMapView');\n }\n );\n\n return () => {\n removeListener();\n };\n }, [config.debug, deviceInfo.isFoldable, handleFoldStateChange]);\n\n return (\n <ExpoGaodeMapView\n ref={mapRef}\n {...mapProps}\n />\n );\n};\n\n/**\n * 折叠屏适配 Hook\n * \n * 用于在现有地图组件中添加折叠屏适配功能\n */\nexport function useFoldableMap(\n mapRef: React.RefObject<MapViewRef>,\n config?: FoldableConfig\n) {\n const [foldState, setFoldState] = useState<FoldState>(FoldState.UNKNOWN);\n const [deviceInfo, setDeviceInfo] = useState<DeviceInfo>(PlatformDetector.getDeviceInfo());\n const mergedConfig = useMemo(() => createFoldableConfig(config), [config]);\n const foldStateRef = useRef(foldState);\n\n useEffect(() => {\n foldStateRef.current = foldState;\n }, [foldState]);\n\n const handleFoldStateChange = useEventCallback(async (newInfo: DeviceInfo) => {\n const newFoldState = PlatformDetector.getFoldState();\n const previousFoldState = foldStateRef.current;\n\n if (newFoldState !== previousFoldState && previousFoldState !== FoldState.UNKNOWN) {\n try {\n await applyFoldStateCameraAdjustment(\n mapRef,\n previousFoldState,\n newFoldState,\n mergedConfig,\n 'useFoldableMap'\n );\n } catch (error) {\n if (mergedConfig.debug) {\n console.error('[useFoldableMap] 调整失败:', error);\n }\n }\n }\n\n foldStateRef.current = newFoldState;\n setFoldState(newFoldState);\n setDeviceInfo(newInfo);\n mergedConfig.onFoldStateChange(newFoldState, newInfo);\n });\n\n useEffect(() => {\n if (Platform.OS !== 'android' || !deviceInfo.isFoldable) {\n return;\n }\n\n const initialState = PlatformDetector.getFoldState();\n foldStateRef.current = initialState;\n setFoldState(initialState);\n\n const removeListener = PlatformDetector.addDimensionChangeListener(\n async (newInfo: DeviceInfo) => {\n await handleFoldStateChange(newInfo);\n }\n );\n\n return () => {\n removeListener();\n };\n }, [deviceInfo.isFoldable, handleFoldStateChange, mapRef]);\n\n return {\n foldState,\n deviceInfo,\n isFoldable: deviceInfo.isFoldable,\n };\n}\n"]}
1
+ {"version":3,"file":"FoldableMapView.js","sourceRoot":"","sources":["../../src/components/FoldableMapView.tsx"],"names":[],"mappings":"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","sourcesContent":["import React, { useEffect, useMemo, useRef, useState } from 'react';\nimport { Platform } from 'react-native';\nimport ExpoGaodeMapView from '../ExpoGaodeMapView';\n\nimport { useEventCallback } from '../hooks/useEventCallback';\nimport { PlatformDetector, FoldState } from '../utils/PlatformDetector';\nimport type { DeviceInfo } from '../utils/PlatformDetector';\nimport type { MapViewProps, MapViewRef } from '../types';\n\n/**\n * 折叠屏适配配置\n */\nexport interface FoldableConfig {\n /** 折叠时是否自动调整缩放级别 */\n autoAdjustZoom?: boolean;\n /** 展开时的缩放级别增量 */\n unfoldedZoomDelta?: number;\n /** 是否在折叠/展开时保持中心点 */\n keepCenterOnFold?: boolean;\n /** 折叠状态变化回调 */\n onFoldStateChange?: (state: FoldState, deviceInfo: DeviceInfo) => void;\n /** 是否启用调试日志 */\n debug?: boolean;\n}\n\n/**\n * 折叠屏地图视图组件\n * \n * 自动适配折叠屏设备的展开/折叠状态变化\n */\nexport interface FoldableMapViewProps extends MapViewProps {\n /** 折叠屏适配配置 */\n foldableConfig?: FoldableConfig;\n}\n\nconst DEFAULT_FOLDABLE_CONFIG: Required<FoldableConfig> = {\n autoAdjustZoom: true,\n unfoldedZoomDelta: 1,\n keepCenterOnFold: true,\n onFoldStateChange: () => {},\n debug: false,\n};\n\nfunction clampZoomLevel(zoom: number): number {\n return Math.max(3, Math.min(20, zoom));\n}\n\nfunction createFoldableConfig(config?: FoldableConfig): Required<FoldableConfig> {\n return {\n ...DEFAULT_FOLDABLE_CONFIG,\n ...config,\n };\n}\n\nasync function applyFoldStateCameraAdjustment(\n mapRef: React.RefObject<MapViewRef | null>,\n oldState: FoldState,\n newState: FoldState,\n config: Required<FoldableConfig>,\n debugPrefix: 'FoldableMapView' | 'useFoldableMap'\n): Promise<void> {\n if (!mapRef.current || !config.autoAdjustZoom) {\n return;\n }\n\n const currentCamera = await mapRef.current.getCameraPosition();\n if (!currentCamera) {\n if (config.debug) {\n console.warn(`[${debugPrefix}] 无法获取相机位置`);\n }\n return;\n }\n\n const isUnfolding = newState === FoldState.UNFOLDED && oldState === FoldState.FOLDED;\n const isFolding = newState === FoldState.FOLDED && oldState === FoldState.UNFOLDED;\n\n if (config.debug) {\n console.log(`[${debugPrefix}] 折叠状态变化:`, {\n oldState,\n newState,\n isUnfolding,\n isFolding,\n currentZoom: currentCamera.zoom,\n });\n }\n\n if (!isUnfolding && !isFolding) {\n return;\n }\n\n const currentZoom = currentCamera.zoom ?? 15;\n const zoomDelta = isUnfolding ? config.unfoldedZoomDelta : -config.unfoldedZoomDelta;\n const nextZoom = clampZoomLevel(currentZoom + zoomDelta);\n\n if (config.debug) {\n console.log(`[${debugPrefix}] 调整缩放:`, {\n oldZoom: currentZoom,\n newZoom: nextZoom,\n delta: zoomDelta,\n });\n }\n\n await mapRef.current.moveCamera({\n target: config.keepCenterOnFold ? currentCamera.target : undefined,\n zoom: nextZoom,\n }, 300);\n}\n\nexport const FoldableMapView: React.FC<FoldableMapViewProps> = ({\n foldableConfig,\n ...mapProps\n}) => {\n const mapRef = useRef<MapViewRef>(null);\n const [currentFoldState, setCurrentFoldState] = useState<FoldState>(FoldState.UNKNOWN);\n const [deviceInfo, setDeviceInfo] = useState<DeviceInfo>(PlatformDetector.getDeviceInfo());\n const config = useMemo(() => createFoldableConfig(foldableConfig), [foldableConfig]);\n const foldStateRef = useRef(currentFoldState);\n\n const handleFoldStateChange = useEventCallback(\n async (newInfo: DeviceInfo, debugPrefix: 'FoldableMapView' | 'useFoldableMap') => {\n const newFoldState = PlatformDetector.getFoldState();\n const previousFoldState = foldStateRef.current;\n\n if (config.debug) {\n console.log(`[${debugPrefix}] 屏幕尺寸变化`);\n console.log('新设备信息:', newInfo);\n console.log('新折叠状态:', newFoldState);\n }\n\n if (newFoldState !== previousFoldState && previousFoldState !== FoldState.UNKNOWN) {\n try {\n await applyFoldStateCameraAdjustment(\n mapRef,\n previousFoldState,\n newFoldState,\n config,\n debugPrefix\n );\n } catch (error) {\n if (config.debug) {\n console.error(`[${debugPrefix}] 处理折叠状态变化失败:`, error);\n }\n }\n }\n\n foldStateRef.current = newFoldState;\n setCurrentFoldState(newFoldState);\n setDeviceInfo(newInfo);\n config.onFoldStateChange(newFoldState, newInfo);\n }\n );\n\n useEffect(() => {\n foldStateRef.current = currentFoldState;\n }, [currentFoldState]);\n\n useEffect(() => {\n const latestDeviceInfo = PlatformDetector.getDeviceInfo();\n setDeviceInfo(latestDeviceInfo);\n }, []);\n\n useEffect(() => {\n // 仅在 Android 折叠屏设备上启用\n if (Platform.OS !== 'android' || !deviceInfo.isFoldable) {\n if (config.debug) {\n console.log('[FoldableMapView] 非折叠屏设备,跳过适配');\n }\n return;\n }\n\n const initialState = PlatformDetector.getFoldState();\n foldStateRef.current = initialState;\n setCurrentFoldState(initialState);\n\n if (config.debug) {\n console.log('[FoldableMapView] 初始化折叠屏适配');\n console.log('设备信息:', deviceInfo);\n console.log('初始折叠状态:', initialState);\n }\n\n // 监听屏幕尺寸变化\n const removeListener = PlatformDetector.addDimensionChangeListener(\n async (newInfo: DeviceInfo) => {\n await handleFoldStateChange(newInfo, 'FoldableMapView');\n }\n );\n\n return () => {\n removeListener();\n };\n }, [config.debug, deviceInfo.isFoldable, handleFoldStateChange]);\n\n return (\n <ExpoGaodeMapView\n ref={mapRef}\n {...mapProps}\n />\n );\n};\n\n/**\n * 折叠屏适配 Hook\n * \n * 用于在现有地图组件中添加折叠屏适配功能\n */\nexport function useFoldableMap(\n mapRef: React.RefObject<MapViewRef>,\n config?: FoldableConfig\n) {\n const [foldState, setFoldState] = useState<FoldState>(FoldState.UNKNOWN);\n const [deviceInfo, setDeviceInfo] = useState<DeviceInfo>(PlatformDetector.getDeviceInfo());\n const mergedConfig = useMemo(() => createFoldableConfig(config), [config]);\n const foldStateRef = useRef(foldState);\n\n useEffect(() => {\n foldStateRef.current = foldState;\n }, [foldState]);\n\n const handleFoldStateChange = useEventCallback(async (newInfo: DeviceInfo) => {\n const newFoldState = PlatformDetector.getFoldState();\n const previousFoldState = foldStateRef.current;\n\n if (newFoldState !== previousFoldState && previousFoldState !== FoldState.UNKNOWN) {\n try {\n await applyFoldStateCameraAdjustment(\n mapRef,\n previousFoldState,\n newFoldState,\n mergedConfig,\n 'useFoldableMap'\n );\n } catch (error) {\n if (mergedConfig.debug) {\n console.error('[useFoldableMap] 调整失败:', error);\n }\n }\n }\n\n foldStateRef.current = newFoldState;\n setFoldState(newFoldState);\n setDeviceInfo(newInfo);\n mergedConfig.onFoldStateChange(newFoldState, newInfo);\n });\n\n useEffect(() => {\n if (Platform.OS !== 'android' || !deviceInfo.isFoldable) {\n return;\n }\n\n const initialState = PlatformDetector.getFoldState();\n foldStateRef.current = initialState;\n setFoldState(initialState);\n\n const removeListener = PlatformDetector.addDimensionChangeListener(\n async (newInfo: DeviceInfo) => {\n await handleFoldStateChange(newInfo);\n }\n );\n\n return () => {\n removeListener();\n };\n }, [deviceInfo.isFoldable, handleFoldStateChange, mapRef]);\n\n return {\n foldState,\n deviceInfo,\n isFoldable: deviceInfo.isFoldable,\n };\n}\n"]}
@@ -1,3 +1,4 @@
1
+ import { Fragment as _Fragment, jsx as _jsx } from "react/jsx-runtime";
1
2
  import React from 'react';
2
3
  /**
3
4
  * MapUI 组件
@@ -16,7 +17,7 @@ import React from 'react';
16
17
  * </MapView>
17
18
  */
18
19
  export const MapUI = ({ children }) => {
19
- return <>{children}</>;
20
+ return _jsx(_Fragment, { children: children });
20
21
  };
21
22
  // 静态标志,用于识别
22
23
  MapUI.isMapUI = true;
@@ -1 +1 @@
1
- {"version":3,"file":"MapUI.js","sourceRoot":"","sources":["../../src/components/MapUI.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B;;;;;;;;;;;;;;;GAeG;AACH,MAAM,CAAC,MAAM,KAAK,GAA0C,CAAC,EAAE,QAAQ,EAAE,EAAE,EAAE;IAC3E,OAAO,EAAE,CAAC,QAAQ,CAAC,GAAG,CAAC;AACzB,CAAC,CAAC;AAEF,YAAY;AACX,KAAyC,CAAC,OAAO,GAAG,IAAI,CAAC","sourcesContent":["import React from 'react';\n\n/**\n * MapUI 组件\n * 用于包裹不需要作为地图原生子组件(如 Marker)的普通 React 组件。\n * 被此组件包裹的内容将渲染在地图视图的上方(兄弟节点),而不是内部。\n * 这解决了在地图内部放置普通 View 导致的触摸事件冲突问题。\n * \n * 示例:\n * <MapView>\n * <Marker ... />\n * <MapUI>\n * <View style={{ position: 'absolute', ... }}>\n * <Text>悬浮层</Text>\n * </View>\n * </MapUI>\n * </MapView>\n */\nexport const MapUI: React.FC<React.PropsWithChildren<{}>> = ({ children }) => {\n return <>{children}</>;\n};\n\n// 静态标志,用于识别\n(MapUI as React.FC & { isMapUI: boolean }).isMapUI = true;\n"]}
1
+ {"version":3,"file":"MapUI.js","sourceRoot":"","sources":["../../src/components/MapUI.tsx"],"names":[],"mappings":";AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B;;;;;;;;;;;;;;;GAeG;AACH,MAAM,CAAC,MAAM,KAAK,GAA0C,CAAC,EAAE,QAAQ,EAAE,EAAE,EAAE;IAC3E,OAAO,4BAAG,QAAQ,GAAI,CAAC;AACzB,CAAC,CAAC;AAEF,YAAY;AACX,KAAyC,CAAC,OAAO,GAAG,IAAI,CAAC","sourcesContent":["import React from 'react';\n\n/**\n * MapUI 组件\n * 用于包裹不需要作为地图原生子组件(如 Marker)的普通 React 组件。\n * 被此组件包裹的内容将渲染在地图视图的上方(兄弟节点),而不是内部。\n * 这解决了在地图内部放置普通 View 导致的触摸事件冲突问题。\n * \n * 示例:\n * <MapView>\n * <Marker ... />\n * <MapUI>\n * <View style={{ position: 'absolute', ... }}>\n * <Text>悬浮层</Text>\n * </View>\n * </MapUI>\n * </MapView>\n */\nexport const MapUI: React.FC<React.PropsWithChildren<{}>> = ({ children }) => {\n return <>{children}</>;\n};\n\n// 静态标志,用于识别\n(MapUI as React.FC & { isMapUI: boolean }).isMapUI = true;\n"]}
@@ -1,5 +1,4 @@
1
- import * as React from 'react';
2
1
  import type { RouteOverlayProps } from '../types/route-playback.types';
3
- export declare function RouteOverlay({ points, showStartMarker, showEndMarker, polylineProps, startMarkerProps, endMarkerProps, }: RouteOverlayProps): React.JSX.Element | null;
2
+ export declare function RouteOverlay({ points, showStartMarker, showEndMarker, polylineProps, startMarkerProps, endMarkerProps, }: RouteOverlayProps): import("react/jsx-runtime").JSX.Element | null;
4
3
  export default RouteOverlay;
5
4
  //# sourceMappingURL=RouteOverlay.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"RouteOverlay.d.ts","sourceRoot":"","sources":["../../src/components/RouteOverlay.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAE/B,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,+BAA+B,CAAC;AAIvE,wBAAgB,YAAY,CAAC,EAC3B,MAAM,EACN,eAAsB,EACtB,aAAoB,EACpB,aAAa,EACb,gBAAgB,EAChB,cAAc,GACf,EAAE,iBAAiB,4BAuCnB;AAED,eAAe,YAAY,CAAC"}
1
+ {"version":3,"file":"RouteOverlay.d.ts","sourceRoot":"","sources":["../../src/components/RouteOverlay.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,+BAA+B,CAAC;AAIvE,wBAAgB,YAAY,CAAC,EAC3B,MAAM,EACN,eAAsB,EACtB,aAAoB,EACpB,aAAa,EACb,gBAAgB,EAChB,cAAc,GACf,EAAE,iBAAiB,kDA0CnB;AAED,eAAe,YAAY,CAAC"}
@@ -1,3 +1,4 @@
1
+ import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
1
2
  import * as React from 'react';
2
3
  import { normalizeLatLngList } from '../utils/GeoUtils';
3
4
  import { Marker, Polyline } from './overlays';
@@ -10,11 +11,10 @@ export function RouteOverlay({ points, showStartMarker = true, showEndMarker = t
10
11
  }
11
12
  const start = normalizedPoints[0];
12
13
  const end = normalizedPoints[normalizedPoints.length - 1];
13
- return (<>
14
- <Polyline points={normalizedPoints} strokeWidth={polylineProps?.strokeWidth ?? 6} strokeColor={polylineProps?.strokeColor ?? '#2563eb'} {...polylineProps}/>
15
- {showStartMarker ? (<Marker position={start} title={startMarkerProps?.title ?? '起点'} {...startMarkerProps}/>) : null}
16
- {showEndMarker ? (<Marker position={end} title={endMarkerProps?.title ?? '终点'} {...endMarkerProps}/>) : null}
17
- </>);
14
+ if (!start || !end) {
15
+ return null;
16
+ }
17
+ return (_jsxs(_Fragment, { children: [_jsx(Polyline, { points: normalizedPoints, strokeWidth: polylineProps?.strokeWidth ?? 6, strokeColor: polylineProps?.strokeColor ?? '#2563eb', ...polylineProps }), showStartMarker ? (_jsx(Marker, { position: start, title: startMarkerProps?.title ?? '起点', ...startMarkerProps })) : null, showEndMarker ? (_jsx(Marker, { position: end, title: endMarkerProps?.title ?? '终点', ...endMarkerProps })) : null] }));
18
18
  }
19
19
  export default RouteOverlay;
20
20
  //# sourceMappingURL=RouteOverlay.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"RouteOverlay.js","sourceRoot":"","sources":["../../src/components/RouteOverlay.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAG/B,OAAO,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AACxD,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAE9C,MAAM,UAAU,YAAY,CAAC,EAC3B,MAAM,EACN,eAAe,GAAG,IAAI,EACtB,aAAa,GAAG,IAAI,EACpB,aAAa,EACb,gBAAgB,EAChB,cAAc,GACI;IAClB,8BAA8B;IAC9B,yBAAyB;IACzB,MAAM,gBAAgB,GAAG,KAAK,CAAC,OAAO,CACpC,GAAG,EAAE,CAAC,mBAAmB,CAAC,MAAM,CAAC,EACjC,CAAC,MAAM,CAAC,CACT,CAAC;IAEF,IAAI,gBAAgB,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAClC,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,KAAK,GAAG,gBAAgB,CAAC,CAAC,CAAC,CAAC;IAClC,MAAM,GAAG,GAAG,gBAAgB,CAAC,gBAAgB,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IAE1D,OAAO,CACL,EACE;MAAA,CAAC,QAAQ,CACP,MAAM,CAAC,CAAC,gBAAgB,CAAC,CACzB,WAAW,CAAC,CAAC,aAAa,EAAE,WAAW,IAAI,CAAC,CAAC,CAC7C,WAAW,CAAC,CAAC,aAAa,EAAE,WAAW,IAAI,SAAS,CAAC,CACrD,IAAI,aAAa,CAAC,EAEpB;MAAA,CAAC,eAAe,CAAC,CAAC,CAAC,CACjB,CAAC,MAAM,CACL,QAAQ,CAAC,CAAC,KAAK,CAAC,CAChB,KAAK,CAAC,CAAC,gBAAgB,EAAE,KAAK,IAAI,IAAI,CAAC,CACvC,IAAI,gBAAgB,CAAC,EACrB,CACH,CAAC,CAAC,CAAC,IAAI,CACR;MAAA,CAAC,aAAa,CAAC,CAAC,CAAC,CACf,CAAC,MAAM,CACL,QAAQ,CAAC,CAAC,GAAG,CAAC,CACd,KAAK,CAAC,CAAC,cAAc,EAAE,KAAK,IAAI,IAAI,CAAC,CACrC,IAAI,cAAc,CAAC,EACnB,CACH,CAAC,CAAC,CAAC,IAAI,CACV;IAAA,GAAG,CACJ,CAAC;AACJ,CAAC;AAED,eAAe,YAAY,CAAC","sourcesContent":["import * as React from 'react';\n\nimport type { RouteOverlayProps } from '../types/route-playback.types';\nimport { normalizeLatLngList } from '../utils/GeoUtils';\nimport { Marker, Polyline } from './overlays';\n\nexport function RouteOverlay({\n points,\n showStartMarker = true,\n showEndMarker = true,\n polylineProps,\n startMarkerProps,\n endMarkerProps,\n}: RouteOverlayProps) {\n // 统一封装“主路径 + 起点 + 终点”的常见展示组合,\n // 这样业务侧不需要每次手动拼装 3 个覆盖物。\n const normalizedPoints = React.useMemo(\n () => normalizeLatLngList(points),\n [points]\n );\n\n if (normalizedPoints.length === 0) {\n return null;\n }\n\n const start = normalizedPoints[0];\n const end = normalizedPoints[normalizedPoints.length - 1];\n\n return (\n <>\n <Polyline\n points={normalizedPoints}\n strokeWidth={polylineProps?.strokeWidth ?? 6}\n strokeColor={polylineProps?.strokeColor ?? '#2563eb'}\n {...polylineProps}\n />\n {showStartMarker ? (\n <Marker\n position={start}\n title={startMarkerProps?.title ?? '起点'}\n {...startMarkerProps}\n />\n ) : null}\n {showEndMarker ? (\n <Marker\n position={end}\n title={endMarkerProps?.title ?? '终点'}\n {...endMarkerProps}\n />\n ) : null}\n </>\n );\n}\n\nexport default RouteOverlay;\n"]}
1
+ {"version":3,"file":"RouteOverlay.js","sourceRoot":"","sources":["../../src/components/RouteOverlay.tsx"],"names":[],"mappings":";AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAG/B,OAAO,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AACxD,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAE9C,MAAM,UAAU,YAAY,CAAC,EAC3B,MAAM,EACN,eAAe,GAAG,IAAI,EACtB,aAAa,GAAG,IAAI,EACpB,aAAa,EACb,gBAAgB,EAChB,cAAc,GACI;IAClB,8BAA8B;IAC9B,yBAAyB;IACzB,MAAM,gBAAgB,GAAG,KAAK,CAAC,OAAO,CACpC,GAAG,EAAE,CAAC,mBAAmB,CAAC,MAAM,CAAC,EACjC,CAAC,MAAM,CAAC,CACT,CAAC;IAEF,IAAI,gBAAgB,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAClC,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,KAAK,GAAG,gBAAgB,CAAC,CAAC,CAAC,CAAC;IAClC,MAAM,GAAG,GAAG,gBAAgB,CAAC,gBAAgB,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IAC1D,IAAI,CAAC,KAAK,IAAI,CAAC,GAAG,EAAE,CAAC;QACnB,OAAO,IAAI,CAAC;IACd,CAAC;IAED,OAAO,CACL,8BACE,KAAC,QAAQ,IACP,MAAM,EAAE,gBAAgB,EACxB,WAAW,EAAE,aAAa,EAAE,WAAW,IAAI,CAAC,EAC5C,WAAW,EAAE,aAAa,EAAE,WAAW,IAAI,SAAS,KAChD,aAAa,GACjB,EACD,eAAe,CAAC,CAAC,CAAC,CACjB,KAAC,MAAM,IACL,QAAQ,EAAE,KAAK,EACf,KAAK,EAAE,gBAAgB,EAAE,KAAK,IAAI,IAAI,KAClC,gBAAgB,GACpB,CACH,CAAC,CAAC,CAAC,IAAI,EACP,aAAa,CAAC,CAAC,CAAC,CACf,KAAC,MAAM,IACL,QAAQ,EAAE,GAAG,EACb,KAAK,EAAE,cAAc,EAAE,KAAK,IAAI,IAAI,KAChC,cAAc,GAClB,CACH,CAAC,CAAC,CAAC,IAAI,IACP,CACJ,CAAC;AACJ,CAAC;AAED,eAAe,YAAY,CAAC","sourcesContent":["import * as React from 'react';\n\nimport type { RouteOverlayProps } from '../types/route-playback.types';\nimport { normalizeLatLngList } from '../utils/GeoUtils';\nimport { Marker, Polyline } from './overlays';\n\nexport function RouteOverlay({\n points,\n showStartMarker = true,\n showEndMarker = true,\n polylineProps,\n startMarkerProps,\n endMarkerProps,\n}: RouteOverlayProps) {\n // 统一封装“主路径 + 起点 + 终点”的常见展示组合,\n // 这样业务侧不需要每次手动拼装 3 个覆盖物。\n const normalizedPoints = React.useMemo(\n () => normalizeLatLngList(points),\n [points]\n );\n\n if (normalizedPoints.length === 0) {\n return null;\n }\n\n const start = normalizedPoints[0];\n const end = normalizedPoints[normalizedPoints.length - 1];\n if (!start || !end) {\n return null;\n }\n\n return (\n <>\n <Polyline\n points={normalizedPoints}\n strokeWidth={polylineProps?.strokeWidth ?? 6}\n strokeColor={polylineProps?.strokeColor ?? '#2563eb'}\n {...polylineProps}\n />\n {showStartMarker ? (\n <Marker\n position={start}\n title={startMarkerProps?.title ?? '起点'}\n {...startMarkerProps}\n />\n ) : null}\n {showEndMarker ? (\n <Marker\n position={end}\n title={endMarkerProps?.title ?? '终点'}\n {...endMarkerProps}\n />\n ) : null}\n </>\n );\n}\n\nexport default RouteOverlay;\n"]}