expo-arcgis 0.2.4 โ 0.2.6
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.
- package/README.md +0 -5
- package/android/src/main/java/expo/modules/arcgis/ExpoArcgisExtrasModule.kt +3 -0
- package/android/src/main/java/expo/modules/arcgis/ExpoArcgisGeometryModule.kt +1 -0
- package/build/AnalysisOverlay.d.ts.map +1 -1
- package/build/AnalysisOverlay.js +2 -1
- package/build/AnalysisOverlay.js.map +1 -1
- package/build/DistanceMeasurement.d.ts.map +1 -1
- package/build/DistanceMeasurement.js +2 -1
- package/build/DistanceMeasurement.js.map +1 -1
- package/build/DynamicEntityLayer.d.ts.map +1 -1
- package/build/DynamicEntityLayer.js +2 -1
- package/build/DynamicEntityLayer.js.map +1 -1
- package/build/FeatureLayer.d.ts.map +1 -1
- package/build/FeatureLayer.js +2 -1
- package/build/FeatureLayer.js.map +1 -1
- package/build/GeometryEditor.d.ts.map +1 -1
- package/build/GeometryEditor.js +2 -1
- package/build/GeometryEditor.js.map +1 -1
- package/build/Graphic.d.ts.map +1 -1
- package/build/Graphic.js +2 -1
- package/build/Graphic.js.map +1 -1
- package/build/GraphicsOverlay.d.ts.map +1 -1
- package/build/GraphicsOverlay.js +2 -1
- package/build/GraphicsOverlay.js.map +1 -1
- package/build/GroupLayer.d.ts.map +1 -1
- package/build/GroupLayer.js +2 -1
- package/build/GroupLayer.js.map +1 -1
- package/build/ImageOverlay.d.ts.map +1 -1
- package/build/ImageOverlay.js +2 -1
- package/build/ImageOverlay.js.map +1 -1
- package/build/LineOfSight.d.ts.map +1 -1
- package/build/LineOfSight.js +2 -1
- package/build/LineOfSight.js.map +1 -1
- package/build/MapImageLayer.d.ts.map +1 -1
- package/build/MapImageLayer.js +2 -1
- package/build/MapImageLayer.js.map +1 -1
- package/build/SceneLayer.d.ts.map +1 -1
- package/build/SceneLayer.js +2 -1
- package/build/SceneLayer.js.map +1 -1
- package/build/TileLayer.d.ts.map +1 -1
- package/build/TileLayer.js +2 -1
- package/build/TileLayer.js.map +1 -1
- package/build/Viewshed.d.ts.map +1 -1
- package/build/Viewshed.js +2 -1
- package/build/Viewshed.js.map +1 -1
- package/build/createLayerComponent.d.ts.map +1 -1
- package/build/createLayerComponent.js +2 -1
- package/build/createLayerComponent.js.map +1 -1
- package/build/utils/detachQuietly.d.ts +16 -0
- package/build/utils/detachQuietly.d.ts.map +1 -0
- package/build/utils/detachQuietly.js +23 -0
- package/build/utils/detachQuietly.js.map +1 -0
- package/package.json +1 -1
- package/src/AnalysisOverlay.tsx +2 -1
- package/src/DistanceMeasurement.tsx +2 -1
- package/src/DynamicEntityLayer.tsx +2 -1
- package/src/FeatureLayer.tsx +2 -1
- package/src/GeometryEditor.tsx +2 -1
- package/src/Graphic.tsx +2 -1
- package/src/GraphicsOverlay.tsx +2 -1
- package/src/GroupLayer.tsx +2 -1
- package/src/ImageOverlay.tsx +2 -1
- package/src/LineOfSight.tsx +2 -1
- package/src/MapImageLayer.tsx +2 -1
- package/src/SceneLayer.tsx +2 -1
- package/src/TileLayer.tsx +2 -1
- package/src/Viewshed.tsx +2 -1
- package/src/createLayerComponent.tsx +2 -1
- package/src/utils/detachQuietly.ts +21 -0
package/README.md
CHANGED
|
@@ -8,11 +8,6 @@ authentication.
|
|
|
8
8
|
|
|
9
9
|
๐ **[Documentation & samples โ](https://alex-krassavin.github.io/expo-arcgis)**
|
|
10
10
|
|
|
11
|
-
> **Status โ early / pre-1.0.** The full surface below is implemented and **compile-verified** on both
|
|
12
|
-
> platforms (TypeScript ยท Android `compileDebugKotlin` ยท iOS pod build). On-device **runtime** validation
|
|
13
|
-
> (rendering, network calls, device sensors) should be done in your own app. The API may still change
|
|
14
|
-
> before 1.0. Pulls ArcGIS Maps SDK **300.0.0**.
|
|
15
|
-
|
|
16
11
|
## Features
|
|
17
12
|
|
|
18
13
|
| Area | What's covered |
|
|
@@ -103,6 +103,7 @@ class ExpoArcgisExtrasModule : Module() {
|
|
|
103
103
|
createRouteTracker(appContext, stops, params)
|
|
104
104
|
}
|
|
105
105
|
Class(RouteTrackerRef::class) {
|
|
106
|
+
Constructor { throw IllegalStateException("RouteTrackerRef is created natively (createRouteTracker) and cannot be constructed from JavaScript.") }
|
|
106
107
|
AsyncFunction("trackLocation") Coroutine { ref: RouteTrackerRef, location: Map<String, Any?> ->
|
|
107
108
|
ref.trackLocation(location)
|
|
108
109
|
}
|
|
@@ -113,6 +114,7 @@ class ExpoArcgisExtrasModule : Module() {
|
|
|
113
114
|
|
|
114
115
|
// Branch versioning โ a service geodatabase handle obtained from FeatureLayerRef.getServiceGeodatabase().
|
|
115
116
|
Class(ServiceGeodatabaseRef::class) {
|
|
117
|
+
Constructor { throw IllegalStateException("ServiceGeodatabaseRef is obtained from FeatureLayer.getServiceGeodatabase() and cannot be constructed from JavaScript.") }
|
|
116
118
|
AsyncFunction("fetchVersions") Coroutine { ref: ServiceGeodatabaseRef ->
|
|
117
119
|
ref.fetchVersions()
|
|
118
120
|
}
|
|
@@ -140,6 +142,7 @@ class ExpoArcgisExtrasModule : Module() {
|
|
|
140
142
|
openGeodatabase(appContext, path)
|
|
141
143
|
}
|
|
142
144
|
Class(GeodatabaseRef::class) {
|
|
145
|
+
Constructor { throw IllegalStateException("GeodatabaseRef is obtained from openGeodatabase() and cannot be constructed from JavaScript.") }
|
|
143
146
|
AsyncFunction("beginTransaction") Coroutine { ref: GeodatabaseRef -> ref.beginTransaction() }
|
|
144
147
|
AsyncFunction("commitTransaction") Coroutine { ref: GeodatabaseRef -> ref.commitTransaction() }
|
|
145
148
|
AsyncFunction("rollbackTransaction") Coroutine { ref: GeodatabaseRef -> ref.rollbackTransaction() }
|
|
@@ -103,6 +103,7 @@ class ExpoArcgisGeometryModule : Module() {
|
|
|
103
103
|
|
|
104
104
|
// Job handle for long-running downloads โ emits onProgress, awaits via result(), supports cancel().
|
|
105
105
|
Class(JobRef::class) {
|
|
106
|
+
Constructor { throw IllegalStateException("JobRef is returned by long-running operations and cannot be constructed from JavaScript.") }
|
|
106
107
|
Events("onProgress")
|
|
107
108
|
AsyncFunction("result") Coroutine { ref: JobRef -> ref.result() }
|
|
108
109
|
AsyncFunction("cancel") Coroutine { ref: JobRef -> ref.cancel() }
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AnalysisOverlay.d.ts","sourceRoot":"","sources":["../src/AnalysisOverlay.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAqB,KAAK,iBAAiB,EAAE,MAAM,OAAO,CAAC;AAElE,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"AnalysisOverlay.d.ts","sourceRoot":"","sources":["../src/AnalysisOverlay.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAqB,KAAK,iBAAiB,EAAE,MAAM,OAAO,CAAC;AAElE,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAK/D;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,EAAE,OAAO,EAAE,QAAQ,EAAE,EAAE,iBAAiB,CAAC,oBAAoB,CAAC,+BAyB7F"}
|
package/build/AnalysisOverlay.js
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { useEffect, useRef } from 'react';
|
|
2
2
|
import ExpoArcgisModule from './ExpoArcgisModule';
|
|
3
3
|
import { AnalysisOverlayContext, useGeoView } from './contexts';
|
|
4
|
+
import { detachQuietly } from './utils/detachQuietly';
|
|
4
5
|
/**
|
|
5
6
|
* Declarative analysis overlay. Mirrors the native `AnalysisOverlay` โ a `<SceneView>` can hold
|
|
6
7
|
* several. Registers itself with the nearest `<SceneView>` and hosts `<Viewshed>` / `<LineOfSight>`
|
|
@@ -16,7 +17,7 @@ export function AnalysisOverlay({ visible, children }) {
|
|
|
16
17
|
const overlay = ref.current;
|
|
17
18
|
view.addAnalysisOverlay(overlay);
|
|
18
19
|
return () => {
|
|
19
|
-
view.removeAnalysisOverlay(overlay);
|
|
20
|
+
detachQuietly(() => view.removeAnalysisOverlay(overlay));
|
|
20
21
|
overlay.release();
|
|
21
22
|
};
|
|
22
23
|
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AnalysisOverlay.js","sourceRoot":"","sources":["../src/AnalysisOverlay.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,EAA0B,MAAM,OAAO,CAAC;AAGlE,OAAO,gBAA6C,MAAM,oBAAoB,CAAC;AAC/E,OAAO,EAAE,sBAAsB,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"AnalysisOverlay.js","sourceRoot":"","sources":["../src/AnalysisOverlay.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,EAA0B,MAAM,OAAO,CAAC;AAGlE,OAAO,gBAA6C,MAAM,oBAAoB,CAAC;AAC/E,OAAO,EAAE,sBAAsB,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAChE,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAEtD;;;;GAIG;AACH,MAAM,UAAU,eAAe,CAAC,EAAE,OAAO,EAAE,QAAQ,EAA2C;IAC5F,MAAM,IAAI,GAAG,UAAU,EAAE,CAAC;IAC1B,MAAM,GAAG,GAAG,MAAM,CAAiC,SAAS,CAAC,CAAC;IAC9D,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC;QACjB,GAAG,CAAC,OAAO,GAAG,IAAI,gBAAgB,CAAC,kBAAkB,EAAE,CAAC;IAC1D,CAAC;IAED,SAAS,CAAC,GAAG,EAAE;QACb,MAAM,OAAO,GAAG,GAAG,CAAC,OAAQ,CAAC;QAC7B,IAAI,CAAC,kBAAkB,CAAC,OAAO,CAAC,CAAC;QACjC,OAAO,GAAG,EAAE;YACV,aAAa,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,qBAAqB,CAAC,OAAO,CAAC,CAAC,CAAC;YACzD,OAAO,CAAC,OAAO,EAAE,CAAC;QACpB,CAAC,CAAC;QACF,uDAAuD;IACzD,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,qDAAqD;IACrD,SAAS,CAAC,GAAG,EAAE;QACb,GAAG,CAAC,OAAO,EAAE,UAAU,CAAC,OAAO,IAAI,IAAI,CAAC,CAAC;IAC3C,CAAC,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC;IAEd,OAAO,CACL,CAAC,sBAAsB,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,QAAQ,CAAC,EAAE,sBAAsB,CAAC,QAAQ,CAAC,CAClG,CAAC;AACJ,CAAC","sourcesContent":["import { useEffect, useRef, type PropsWithChildren } from 'react';\n\nimport type { AnalysisOverlayProps } from './ExpoArcgis.types';\nimport ExpoArcgisModule, { type AnalysisOverlayRef } from './ExpoArcgisModule';\nimport { AnalysisOverlayContext, useGeoView } from './contexts';\nimport { detachQuietly } from './utils/detachQuietly';\n\n/**\n * Declarative analysis overlay. Mirrors the native `AnalysisOverlay` โ a `<SceneView>` can hold\n * several. Registers itself with the nearest `<SceneView>` and hosts `<Viewshed>` / `<LineOfSight>`\n * children. (Visual analyses are 3D only; inside a `<MapView>` this is a no-op.)\n */\nexport function AnalysisOverlay({ visible, children }: PropsWithChildren<AnalysisOverlayProps>) {\n const view = useGeoView();\n const ref = useRef<AnalysisOverlayRef | undefined>(undefined);\n if (!ref.current) {\n ref.current = new ExpoArcgisModule.AnalysisOverlayRef();\n }\n\n useEffect(() => {\n const overlay = ref.current!;\n view.addAnalysisOverlay(overlay);\n return () => {\n detachQuietly(() => view.removeAnalysisOverlay(overlay));\n overlay.release();\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n // Apply visibility on mount and whenever it changes.\n useEffect(() => {\n ref.current?.setVisible(visible ?? true);\n }, [visible]);\n\n return (\n <AnalysisOverlayContext.Provider value={ref.current}>{children}</AnalysisOverlayContext.Provider>\n );\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DistanceMeasurement.d.ts","sourceRoot":"","sources":["../src/DistanceMeasurement.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"DistanceMeasurement.d.ts","sourceRoot":"","sources":["../src/DistanceMeasurement.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,oBAAoB,CAAC;AAQnE;;;;GAIG;AACH,wBAAgB,mBAAmB,CAAC,EAClC,aAAa,EACb,WAAW,EACX,mBAAmB,GACpB,EAAE,wBAAwB,QAuC1B"}
|
|
@@ -4,6 +4,7 @@ import { useAnalysisOverlay } from './contexts';
|
|
|
4
4
|
import { usePrevious } from './hooks/usePrevious';
|
|
5
5
|
import { useUpdateEffect } from './hooks/useUpdateEffect';
|
|
6
6
|
import { getPropsDiffs } from './utils/getPropsDiffs';
|
|
7
|
+
import { detachQuietly } from './utils/detachQuietly';
|
|
7
8
|
/**
|
|
8
9
|
* Declarative exploratory distance measurement between two 3D points. Mirrors the native
|
|
9
10
|
* `ExploratoryLocationDistanceMeasurement`; draws itself on the nearest `<AnalysisOverlay>`
|
|
@@ -21,7 +22,7 @@ export function DistanceMeasurement({ startLocation, endLocation, onMeasurementC
|
|
|
21
22
|
const analysis = ref.current;
|
|
22
23
|
overlay.addAnalysis(analysis);
|
|
23
24
|
return () => {
|
|
24
|
-
overlay.removeAnalysis(analysis);
|
|
25
|
+
detachQuietly(() => overlay.removeAnalysis(analysis));
|
|
25
26
|
analysis.release();
|
|
26
27
|
};
|
|
27
28
|
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DistanceMeasurement.js","sourceRoot":"","sources":["../src/DistanceMeasurement.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,OAAO,CAAC;AAG1C,OAAO,gBAAiD,MAAM,oBAAoB,CAAC;AACnF,OAAO,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAChD,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAClD,OAAO,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAC1D,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAEtD;;;;GAIG;AACH,MAAM,UAAU,mBAAmB,CAAC,EAClC,aAAa,EACb,WAAW,EACX,mBAAmB,GACM;IACzB,MAAM,OAAO,GAAG,kBAAkB,EAAE,CAAC;IACrC,MAAM,GAAG,GAAG,MAAM,CAAqC,SAAS,CAAC,CAAC;IAClE,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC;QACjB,GAAG,CAAC,OAAO,GAAG,IAAI,gBAAgB,CAAC,sBAAsB,CAAC,EAAE,aAAa,EAAE,WAAW,EAAE,CAAC,CAAC;IAC5F,CAAC;IAED,MAAM,QAAQ,GAAG,EAAE,aAAa,EAAE,WAAW,EAAE,CAAC;IAChD,MAAM,IAAI,GAAG,WAAW,CAAC,QAAQ,CAAC,CAAC;IAEnC,SAAS,CAAC,GAAG,EAAE;QACb,MAAM,QAAQ,GAAG,GAAG,CAAC,OAAQ,CAAC;QAC9B,OAAO,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC;QAC9B,OAAO,GAAG,EAAE;YACV,OAAO,CAAC,cAAc,CAAC,QAAQ,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"DistanceMeasurement.js","sourceRoot":"","sources":["../src/DistanceMeasurement.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,OAAO,CAAC;AAG1C,OAAO,gBAAiD,MAAM,oBAAoB,CAAC;AACnF,OAAO,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAChD,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAClD,OAAO,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAC1D,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AACtD,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAEtD;;;;GAIG;AACH,MAAM,UAAU,mBAAmB,CAAC,EAClC,aAAa,EACb,WAAW,EACX,mBAAmB,GACM;IACzB,MAAM,OAAO,GAAG,kBAAkB,EAAE,CAAC;IACrC,MAAM,GAAG,GAAG,MAAM,CAAqC,SAAS,CAAC,CAAC;IAClE,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC;QACjB,GAAG,CAAC,OAAO,GAAG,IAAI,gBAAgB,CAAC,sBAAsB,CAAC,EAAE,aAAa,EAAE,WAAW,EAAE,CAAC,CAAC;IAC5F,CAAC;IAED,MAAM,QAAQ,GAAG,EAAE,aAAa,EAAE,WAAW,EAAE,CAAC;IAChD,MAAM,IAAI,GAAG,WAAW,CAAC,QAAQ,CAAC,CAAC;IAEnC,SAAS,CAAC,GAAG,EAAE;QACb,MAAM,QAAQ,GAAG,GAAG,CAAC,OAAQ,CAAC;QAC9B,OAAO,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC;QAC9B,OAAO,GAAG,EAAE;YACV,aAAa,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,cAAc,CAAC,QAAQ,CAAC,CAAC,CAAC;YACtD,QAAQ,CAAC,OAAO,EAAE,CAAC;QACrB,CAAC,CAAC;QACF,uDAAuD;IACzD,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,eAAe,CAAC,GAAG,EAAE;QACnB,MAAM,KAAK,GAAG,aAAa,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;QAC5C,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO;QAC/B,MAAM,OAAO,GAA4B,EAAE,CAAC;QAC5C,KAAK,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,EAAE;YACpB,OAAO,CAAC,GAAG,CAAC,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC;QAC/B,CAAC,CAAC,CAAC;QACH,GAAG,CAAC,OAAO,EAAE,UAAU,CAAC,OAAO,CAAC,CAAC;IACnC,CAAC,EAAE,CAAC,aAAa,EAAE,WAAW,CAAC,CAAC,CAAC;IAEjC,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,CAAC,mBAAmB;YAAE,OAAO;QACjC,MAAM,YAAY,GAAG,GAAG,CAAC,OAAQ,CAAC,WAAW,CAAC,qBAAqB,EAAE,CAAC,WAAW,EAAE,EAAE,CACnF,mBAAmB,CAAC,WAAW,CAAC,CACjC,CAAC;QACF,OAAO,GAAG,EAAE,CAAC,YAAY,CAAC,MAAM,EAAE,CAAC;IACrC,CAAC,EAAE,CAAC,mBAAmB,CAAC,CAAC,CAAC;IAE1B,OAAO,IAAI,CAAC;AACd,CAAC","sourcesContent":["import { useEffect, useRef } from 'react';\n\nimport type { DistanceMeasurementProps } from './ExpoArcgis.types';\nimport ExpoArcgisModule, { type DistanceMeasurementRef } from './ExpoArcgisModule';\nimport { useAnalysisOverlay } from './contexts';\nimport { usePrevious } from './hooks/usePrevious';\nimport { useUpdateEffect } from './hooks/useUpdateEffect';\nimport { getPropsDiffs } from './utils/getPropsDiffs';\nimport { detachQuietly } from './utils/detachQuietly';\n\n/**\n * Declarative exploratory distance measurement between two 3D points. Mirrors the native\n * `ExploratoryLocationDistanceMeasurement`; draws itself on the nearest `<AnalysisOverlay>`\n * (3D only) and reports the direct / horizontal / vertical distances via `onMeasurementChange`.\n */\nexport function DistanceMeasurement({\n startLocation,\n endLocation,\n onMeasurementChange,\n}: DistanceMeasurementProps) {\n const overlay = useAnalysisOverlay();\n const ref = useRef<DistanceMeasurementRef | undefined>(undefined);\n if (!ref.current) {\n ref.current = new ExpoArcgisModule.DistanceMeasurementRef({ startLocation, endLocation });\n }\n\n const geometry = { startLocation, endLocation };\n const prev = usePrevious(geometry);\n\n useEffect(() => {\n const analysis = ref.current!;\n overlay.addAnalysis(analysis);\n return () => {\n detachQuietly(() => overlay.removeAnalysis(analysis));\n analysis.release();\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n useUpdateEffect(() => {\n const diffs = getPropsDiffs(prev, geometry);\n if (diffs.length === 0) return;\n const changed: Record<string, unknown> = {};\n diffs.forEach((key) => {\n changed[key] = geometry[key];\n });\n ref.current?.applyProps(changed);\n }, [startLocation, endLocation]);\n\n useEffect(() => {\n if (!onMeasurementChange) return;\n const subscription = ref.current!.addListener('onMeasurementChange', (measurement) =>\n onMeasurementChange(measurement)\n );\n return () => subscription.remove();\n }, [onMeasurementChange]);\n\n return null;\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DynamicEntityLayer.d.ts","sourceRoot":"","sources":["../src/DynamicEntityLayer.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EACV,gBAAgB,EAChB,mBAAmB,EACnB,wBAAwB,EAEzB,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"DynamicEntityLayer.d.ts","sourceRoot":"","sources":["../src/DynamicEntityLayer.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EACV,gBAAgB,EAChB,mBAAmB,EACnB,wBAAwB,EAEzB,MAAM,oBAAoB,CAAC;AAQ5B;;;;;GAKG;AACH,eAAO,MAAM,kBAAkB;;;;;mBAwD42qC,CAAC;gBAAkB,CAAC;;;;;;;4DAD95qC,CAAC"}
|
|
@@ -4,6 +4,7 @@ import { useGeoModel } from './contexts';
|
|
|
4
4
|
import { usePrevious } from './hooks/usePrevious';
|
|
5
5
|
import { useUpdateEffect } from './hooks/useUpdateEffect';
|
|
6
6
|
import { getPropsDiffs } from './utils/getPropsDiffs';
|
|
7
|
+
import { detachQuietly } from './utils/detachQuietly';
|
|
7
8
|
/**
|
|
8
9
|
* Declarative real-time `DynamicEntityLayer`. Adds itself to the nearest `<Map>` / `<Scene>`, shows
|
|
9
10
|
* live moving entities from a `streamServiceUrl` (or a `customSource` you feed via the ref), reports
|
|
@@ -21,7 +22,7 @@ export const DynamicEntityLayer = forwardRef(function DynamicEntityLayer({ onCon
|
|
|
21
22
|
const layer = ref.current;
|
|
22
23
|
model.addLayer(layer);
|
|
23
24
|
return () => {
|
|
24
|
-
model.removeLayer(layer);
|
|
25
|
+
detachQuietly(() => model.removeLayer(layer));
|
|
25
26
|
layer.release();
|
|
26
27
|
};
|
|
27
28
|
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DynamicEntityLayer.js","sourceRoot":"","sources":["../src/DynamicEntityLayer.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,mBAAmB,EAAE,MAAM,EAAE,MAAM,OAAO,CAAC;AAQ3E,OAAO,gBAAgD,MAAM,oBAAoB,CAAC;AAClF,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AACzC,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAClD,OAAO,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAC1D,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAEtD;;;;;GAKG;AACH,MAAM,CAAC,MAAM,kBAAkB,GAAG,UAAU,CAC1C,SAAS,kBAAkB,CAAC,EAAE,wBAAwB,EAAE,qBAAqB,EAAE,GAAG,UAAU,EAAE,EAAE,MAAM;IACpG,MAAM,KAAK,GAAG,WAAW,EAAE,CAAC;IAC5B,MAAM,GAAG,GAAG,MAAM,CAAoC,SAAS,CAAC,CAAC;IACjE,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC;QACjB,GAAG,CAAC,OAAO,GAAG,IAAI,gBAAgB,CAAC,qBAAqB,CAAC,UAAU,CAAC,CAAC;IACvE,CAAC;IAED,MAAM,IAAI,GAAG,WAAW,CAAC,UAAU,CAAC,CAAC;IAErC,SAAS,CAAC,GAAG,EAAE;QACb,MAAM,KAAK,GAAG,GAAG,CAAC,OAAQ,CAAC;QAC3B,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;QACtB,OAAO,GAAG,EAAE;YACV,KAAK,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"DynamicEntityLayer.js","sourceRoot":"","sources":["../src/DynamicEntityLayer.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,mBAAmB,EAAE,MAAM,EAAE,MAAM,OAAO,CAAC;AAQ3E,OAAO,gBAAgD,MAAM,oBAAoB,CAAC;AAClF,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AACzC,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAClD,OAAO,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAC1D,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AACtD,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAEtD;;;;;GAKG;AACH,MAAM,CAAC,MAAM,kBAAkB,GAAG,UAAU,CAC1C,SAAS,kBAAkB,CAAC,EAAE,wBAAwB,EAAE,qBAAqB,EAAE,GAAG,UAAU,EAAE,EAAE,MAAM;IACpG,MAAM,KAAK,GAAG,WAAW,EAAE,CAAC;IAC5B,MAAM,GAAG,GAAG,MAAM,CAAoC,SAAS,CAAC,CAAC;IACjE,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC;QACjB,GAAG,CAAC,OAAO,GAAG,IAAI,gBAAgB,CAAC,qBAAqB,CAAC,UAAU,CAAC,CAAC;IACvE,CAAC;IAED,MAAM,IAAI,GAAG,WAAW,CAAC,UAAU,CAAC,CAAC;IAErC,SAAS,CAAC,GAAG,EAAE;QACb,MAAM,KAAK,GAAG,GAAG,CAAC,OAAQ,CAAC;QAC3B,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;QACtB,OAAO,GAAG,EAAE;YACV,aAAa,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,CAAC;YAC9C,KAAK,CAAC,OAAO,EAAE,CAAC;QAClB,CAAC,CAAC;QACF,uDAAuD;IACzD,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,iGAAiG;IACjG,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,CAAC,wBAAwB;YAAE,OAAO;QACtC,MAAM,GAAG,GAAG,GAAG,CAAC,OAAQ,CAAC,WAAW,CAClC,0BAA0B,EAC1B,CAAC,KAAmC,EAAE,EAAE,CAAC,wBAAwB,CAAC,KAAK,CAAC,MAAM,CAAC,CAChF,CAAC;QACF,OAAO,GAAG,EAAE,CAAC,GAAG,CAAC,MAAM,EAAE,CAAC;IAC5B,CAAC,EAAE,CAAC,wBAAwB,CAAC,CAAC,CAAC;IAE/B,4DAA4D;IAC5D,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,CAAC,qBAAqB;YAAE,OAAO;QACnC,MAAM,GAAG,GAAG,GAAG,CAAC,OAAQ,CAAC,WAAW,CAClC,uBAAuB,EACvB,CAAC,KAA0B,EAAE,EAAE,CAAC,qBAAqB,CAAC,EAAE,WAAW,EAAE,KAAK,EAAE,CAAC,CAC9E,CAAC;QACF,OAAO,GAAG,EAAE,CAAC,GAAG,CAAC,MAAM,EAAE,CAAC;IAC5B,CAAC,EAAE,CAAC,qBAAqB,CAAC,CAAC,CAAC;IAE5B,eAAe,CAAC,GAAG,EAAE;QACnB,MAAM,KAAK,GAAG,aAAa,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC;QAC9C,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO;QAC/B,MAAM,OAAO,GAA4B,EAAE,CAAC;QAC5C,KAAK,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,EAAE;YACpB,OAAO,CAAC,GAAa,CAAC,GAAI,UAAsC,CAAC,GAAa,CAAC,CAAC;QAClF,CAAC,CAAC,CAAC;QACH,GAAG,CAAC,OAAO,EAAE,UAAU,CAAC,OAAO,CAAC,CAAC;IACnC,CAAC,EAAE,CAAC,UAAU,CAAC,CAAC,CAAC;IAEjB,6GAA6G;IAC7G,mBAAmB,CAAC,MAAM,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC,OAAQ,EAAE,EAAE,CAAC,CAAC;IAEpD,OAAO,IAAI,CAAC;AACd,CAAC,CACF,CAAC","sourcesContent":["import { forwardRef, useEffect, useImperativeHandle, useRef } from 'react';\n\nimport type {\n ConnectionStatus,\n DynamicEntityChange,\n DynamicEntityLayerHandle,\n DynamicEntityLayerProps,\n} from './ExpoArcgis.types';\nimport ExpoArcgisModule, { type DynamicEntityLayerRef } from './ExpoArcgisModule';\nimport { useGeoModel } from './contexts';\nimport { usePrevious } from './hooks/usePrevious';\nimport { useUpdateEffect } from './hooks/useUpdateEffect';\nimport { getPropsDiffs } from './utils/getPropsDiffs';\nimport { detachQuietly } from './utils/detachQuietly';\n\n/**\n * Declarative real-time `DynamicEntityLayer`. Adds itself to the nearest `<Map>` / `<Scene>`, shows\n * live moving entities from a `streamServiceUrl` (or a `customSource` you feed via the ref), reports\n * connection state through `onConnectionStatusChange`, and exposes `queryDynamicEntities` /\n * `queryObservations` / `pushObservation` through a `ref`.\n */\nexport const DynamicEntityLayer = forwardRef<DynamicEntityLayerHandle, DynamicEntityLayerProps>(\n function DynamicEntityLayer({ onConnectionStatusChange, onDynamicEntityChange, ...layerProps }, handle) {\n const model = useGeoModel();\n const ref = useRef<DynamicEntityLayerRef | undefined>(undefined);\n if (!ref.current) {\n ref.current = new ExpoArcgisModule.DynamicEntityLayerRef(layerProps);\n }\n\n const prev = usePrevious(layerProps);\n\n useEffect(() => {\n const layer = ref.current!;\n model.addLayer(layer);\n return () => {\n detachQuietly(() => model.removeLayer(layer));\n layer.release();\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n // The connection-status callback is wired as an event listener (functions can't cross as props).\n useEffect(() => {\n if (!onConnectionStatusChange) return;\n const sub = ref.current!.addListener(\n 'onConnectionStatusChange',\n (event: { status: ConnectionStatus }) => onConnectionStatusChange(event.status)\n );\n return () => sub.remove();\n }, [onConnectionStatusChange]);\n\n // The entity-change callback is wired as an event listener.\n useEffect(() => {\n if (!onDynamicEntityChange) return;\n const sub = ref.current!.addListener(\n 'onDynamicEntityChange',\n (event: DynamicEntityChange) => onDynamicEntityChange({ nativeEvent: event })\n );\n return () => sub.remove();\n }, [onDynamicEntityChange]);\n\n useUpdateEffect(() => {\n const diffs = getPropsDiffs(prev, layerProps);\n if (diffs.length === 0) return;\n const changed: Record<string, unknown> = {};\n diffs.forEach((key) => {\n changed[key as string] = (layerProps as Record<string, unknown>)[key as string];\n });\n ref.current?.applyProps(changed);\n }, [layerProps]);\n\n // The native ref exposes queryDynamicEntities / queryObservations / pushObservation โ hand it over directly.\n useImperativeHandle(handle, () => ref.current!, []);\n\n return null;\n }\n);\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"FeatureLayer.d.ts","sourceRoot":"","sources":["../src/FeatureLayer.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,kBAAkB,EAAqB,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"FeatureLayer.d.ts","sourceRoot":"","sources":["../src/FeatureLayer.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,kBAAkB,EAAqB,MAAM,oBAAoB,CAAC;AAShF;;;GAGG;AACH,eAAO,MAAM,YAAY;;;;;;;;;;;YA2Co9Q,CAAC;;;gBAAimB,CAAC;gBAAkB,CAAC;;;;sDADlmS,CAAC"}
|
package/build/FeatureLayer.js
CHANGED
|
@@ -4,6 +4,7 @@ import { useGeoModel } from './contexts';
|
|
|
4
4
|
import { usePrevious } from './hooks/usePrevious';
|
|
5
5
|
import { useUpdateEffect } from './hooks/useUpdateEffect';
|
|
6
6
|
import { getPropsDiffs } from './utils/getPropsDiffs';
|
|
7
|
+
import { detachQuietly } from './utils/detachQuietly';
|
|
7
8
|
/**
|
|
8
9
|
* Declarative operational `FeatureLayer`. Adds itself to the nearest `<Map>` / `<Scene>`, and
|
|
9
10
|
* exposes async queries through a `ref` โ `queryFeatures` / `queryFeatureCount` / `queryExtent`.
|
|
@@ -24,7 +25,7 @@ export const FeatureLayer = forwardRef(function FeatureLayer(props, handle) {
|
|
|
24
25
|
const layer = ref.current;
|
|
25
26
|
model.addLayer(layer);
|
|
26
27
|
return () => {
|
|
27
|
-
model.removeLayer(layer);
|
|
28
|
+
detachQuietly(() => model.removeLayer(layer));
|
|
28
29
|
if (!isExternal.current)
|
|
29
30
|
layer.release();
|
|
30
31
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"FeatureLayer.js","sourceRoot":"","sources":["../src/FeatureLayer.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,mBAAmB,EAAE,MAAM,EAAE,MAAM,OAAO,CAAC;AAG3E,OAAO,sBAAsB,MAAM,0BAA0B,CAAC;AAE9D,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AACzC,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAClD,OAAO,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAC1D,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAEtD;;;GAGG;AACH,MAAM,CAAC,MAAM,YAAY,GAAG,UAAU,CACpC,SAAS,YAAY,CAAC,KAAK,EAAE,MAAM;IACjC,MAAM,KAAK,GAAG,WAAW,EAAE,CAAC;IAC5B,MAAM,GAAG,GAAG,MAAM,CAA8B,SAAS,CAAC,CAAC;IAC3D,gGAAgG;IAChG,sFAAsF;IACtF,MAAM,UAAU,GAAG,MAAM,CAAC,KAAK,CAAC,KAAK,IAAI,IAAI,CAAC,CAAC;IAC/C,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC;QACjB,GAAG,CAAC,OAAO;YACR,KAAK,CAAC,KAAoC;gBAC3C,IAAI,sBAAsB,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC;IACtD,CAAC;IAED,MAAM,IAAI,GAAG,WAAW,CAAC,KAAK,CAAC,CAAC;IAEhC,SAAS,CAAC,GAAG,EAAE;QACb,MAAM,KAAK,GAAG,GAAG,CAAC,OAAQ,CAAC;QAC3B,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;QACtB,OAAO,GAAG,EAAE;YACV,KAAK,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"FeatureLayer.js","sourceRoot":"","sources":["../src/FeatureLayer.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,mBAAmB,EAAE,MAAM,EAAE,MAAM,OAAO,CAAC;AAG3E,OAAO,sBAAsB,MAAM,0BAA0B,CAAC;AAE9D,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AACzC,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAClD,OAAO,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAC1D,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AACtD,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAEtD;;;GAGG;AACH,MAAM,CAAC,MAAM,YAAY,GAAG,UAAU,CACpC,SAAS,YAAY,CAAC,KAAK,EAAE,MAAM;IACjC,MAAM,KAAK,GAAG,WAAW,EAAE,CAAC;IAC5B,MAAM,GAAG,GAAG,MAAM,CAA8B,SAAS,CAAC,CAAC;IAC3D,gGAAgG;IAChG,sFAAsF;IACtF,MAAM,UAAU,GAAG,MAAM,CAAC,KAAK,CAAC,KAAK,IAAI,IAAI,CAAC,CAAC;IAC/C,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC;QACjB,GAAG,CAAC,OAAO;YACR,KAAK,CAAC,KAAoC;gBAC3C,IAAI,sBAAsB,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC;IACtD,CAAC;IAED,MAAM,IAAI,GAAG,WAAW,CAAC,KAAK,CAAC,CAAC;IAEhC,SAAS,CAAC,GAAG,EAAE;QACb,MAAM,KAAK,GAAG,GAAG,CAAC,OAAQ,CAAC;QAC3B,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;QACtB,OAAO,GAAG,EAAE;YACV,aAAa,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,CAAC;YAC9C,IAAI,CAAC,UAAU,CAAC,OAAO;gBAAE,KAAK,CAAC,OAAO,EAAE,CAAC;QAC3C,CAAC,CAAC;QACF,uDAAuD;IACzD,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,eAAe,CAAC,GAAG,EAAE;QACnB,MAAM,KAAK,GAAG,aAAa,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;QACzC,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO;QAC/B,MAAM,OAAO,GAA4B,EAAE,CAAC;QAC5C,KAAK,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,EAAE;YACpB,6EAA6E;YAC7E,IAAI,GAAG,KAAK,OAAO;gBAAE,OAAO,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC;QACjD,CAAC,CAAC,CAAC;QACH,IAAI,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,MAAM,GAAG,CAAC;YAAE,GAAG,CAAC,OAAO,EAAE,UAAU,CAAC,OAAO,CAAC,CAAC;IACxE,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC;IAEZ,2FAA2F;IAC3F,yFAAyF;IACzF,mBAAmB,CAAC,MAAM,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC,OAAQ,EAAE,EAAE,CAAC,CAAC;IAEpD,OAAO,IAAI,CAAC;AACd,CAAC,CACF,CAAC","sourcesContent":["import { forwardRef, useEffect, useImperativeHandle, useRef } from 'react';\n\nimport type { FeatureLayerHandle, FeatureLayerProps } from './ExpoArcgis.types';\nimport ExpoArcgisExtrasModule from './ExpoArcgisExtrasModule';\nimport type { FeatureLayerRef } from './ExpoArcgisModule';\nimport { useGeoModel } from './contexts';\nimport { usePrevious } from './hooks/usePrevious';\nimport { useUpdateEffect } from './hooks/useUpdateEffect';\nimport { getPropsDiffs } from './utils/getPropsDiffs';\nimport { detachQuietly } from './utils/detachQuietly';\n\n/**\n * Declarative operational `FeatureLayer`. Adds itself to the nearest `<Map>` / `<Scene>`, and\n * exposes async queries through a `ref` โ `queryFeatures` / `queryFeatureCount` / `queryExtent`.\n */\nexport const FeatureLayer = forwardRef<FeatureLayerHandle, FeatureLayerProps>(\n function FeatureLayer(props, handle) {\n const model = useGeoModel();\n const ref = useRef<FeatureLayerRef | undefined>(undefined);\n // An externally-provided `layer` (e.g. from a geodatabase/version) is owned by its producer, so\n // it's used as-is and never released here; otherwise build one from `url` / `source`.\n const isExternal = useRef(props.layer != null);\n if (!ref.current) {\n ref.current =\n (props.layer as unknown as FeatureLayerRef) ??\n new ExpoArcgisExtrasModule.FeatureLayerRef(props);\n }\n\n const prev = usePrevious(props);\n\n useEffect(() => {\n const layer = ref.current!;\n model.addLayer(layer);\n return () => {\n detachQuietly(() => model.removeLayer(layer));\n if (!isExternal.current) layer.release();\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n useUpdateEffect(() => {\n const diffs = getPropsDiffs(prev, props);\n if (diffs.length === 0) return;\n const changed: Record<string, unknown> = {};\n diffs.forEach((key) => {\n // `layer` is the ref itself (construction-only), not a native prop to apply.\n if (key !== 'layer') changed[key] = props[key];\n });\n if (Object.keys(changed).length > 0) ref.current?.applyProps(changed);\n }, [props]);\n\n // The native ref already exposes the query methods (typed to match FeatureLayerHandle), so\n // hand it over directly โ it's created synchronously in render, so it's always set here.\n useImperativeHandle(handle, () => ref.current!, []);\n\n return null;\n }\n);\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"GeometryEditor.d.ts","sourceRoot":"","sources":["../src/GeometryEditor.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,oBAAoB,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"GeometryEditor.d.ts","sourceRoot":"","sources":["../src/GeometryEditor.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,oBAAoB,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAKpF;;;;;;;GAOG;AACH,eAAO,MAAM,cAAc,sHAqD1B,CAAC"}
|
package/build/GeometryEditor.js
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { forwardRef, useEffect, useImperativeHandle, useRef } from 'react';
|
|
2
2
|
import ExpoArcgisModule from './ExpoArcgisModule';
|
|
3
3
|
import { useGeoView } from './contexts';
|
|
4
|
+
import { detachQuietly } from './utils/detachQuietly';
|
|
4
5
|
/**
|
|
5
6
|
* Interactive geometry editor. Mirrors the native `GeometryEditor` โ place it inside a
|
|
6
7
|
* `<MapView>` to let the user sketch a `type` geometry. Reports edits via `onGeometryChange`
|
|
@@ -20,7 +21,7 @@ export const GeometryEditor = forwardRef(function GeometryEditor({ type, active
|
|
|
20
21
|
const editor = ref.current;
|
|
21
22
|
view.setGeometryEditor(editor);
|
|
22
23
|
return () => {
|
|
23
|
-
view.setGeometryEditor(null);
|
|
24
|
+
detachQuietly(() => view.setGeometryEditor(null));
|
|
24
25
|
editor.release();
|
|
25
26
|
};
|
|
26
27
|
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"GeometryEditor.js","sourceRoot":"","sources":["../src/GeometryEditor.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,mBAAmB,EAAE,MAAM,EAAE,MAAM,OAAO,CAAC;AAG3E,OAAO,gBAA4C,MAAM,oBAAoB,CAAC;AAC9E,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"GeometryEditor.js","sourceRoot":"","sources":["../src/GeometryEditor.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,mBAAmB,EAAE,MAAM,EAAE,MAAM,OAAO,CAAC;AAG3E,OAAO,gBAA4C,MAAM,oBAAoB,CAAC;AAC9E,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AACxC,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAEtD;;;;;;;GAOG;AACH,MAAM,CAAC,MAAM,cAAc,GAAG,UAAU,CACtC,SAAS,cAAc,CAAC,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI,EAAE,IAAI,EAAE,gBAAgB,EAAE,EAAE,MAAM;IAC7E,MAAM,IAAI,GAAG,UAAU,EAAE,CAAC;IAC1B,MAAM,GAAG,GAAG,MAAM,CAAgC,SAAS,CAAC,CAAC;IAC7D,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC;QACjB,GAAG,CAAC,OAAO,GAAG,IAAI,gBAAgB,CAAC,iBAAiB,EAAE,CAAC;IACzD,CAAC;IAED,6DAA6D;IAC7D,SAAS,CAAC,GAAG,EAAE;QACb,MAAM,MAAM,GAAG,GAAG,CAAC,OAAQ,CAAC;QAC5B,IAAI,CAAC,iBAAiB,CAAC,MAAM,CAAC,CAAC;QAC/B,OAAO,GAAG,EAAE;YACV,aAAa,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC,CAAC;YAClD,MAAM,CAAC,OAAO,EAAE,CAAC;QACnB,CAAC,CAAC;QACF,uDAAuD;IACzD,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,kDAAkD;IAClD,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,CAAC,gBAAgB;YAAE,OAAO;QAC9B,MAAM,YAAY,GAAG,GAAG,CAAC,OAAQ,CAAC,WAAW,CAAC,kBAAkB,EAAE,CAAC,EAAE,QAAQ,EAAE,EAAE,EAAE;YACjF,gBAAgB,CAAC,QAAQ,IAAI,IAAI,CAAC,CAAC;QACrC,CAAC,CAAC,CAAC;QACH,OAAO,GAAG,EAAE,CAAC,YAAY,CAAC,MAAM,EAAE,CAAC;IACrC,CAAC,EAAE,CAAC,gBAAgB,CAAC,CAAC,CAAC;IAEvB,yEAAyE;IACzE,SAAS,CAAC,GAAG,EAAE;QACb,MAAM,MAAM,GAAG,GAAG,CAAC,OAAQ,CAAC;QAC5B,IAAI,MAAM,EAAE,CAAC;YACX,IAAI,IAAI;gBAAE,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;YAC/B,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QACrB,CAAC;aAAM,CAAC;YACN,MAAM,CAAC,IAAI,EAAE,CAAC;QAChB,CAAC;IACH,CAAC,EAAE,CAAC,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC;IAEzB,mBAAmB,CACjB,MAAM,EACN,GAAG,EAAE,CAAC,CAAC;QACL,IAAI,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC,OAAO,EAAE,IAAI,EAAE;QAC/B,IAAI,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC,OAAO,EAAE,IAAI,EAAE;QAC/B,KAAK,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC,OAAO,EAAE,aAAa,EAAE;QACzC,qBAAqB,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC,OAAO,EAAE,qBAAqB,EAAE;QACjE,IAAI,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC,OAAO,EAAE,IAAI,EAAE,IAAI,IAAI;KACxC,CAAC,EACF,EAAE,CACH,CAAC;IAEF,OAAO,IAAI,CAAC;AACd,CAAC,CACF,CAAC","sourcesContent":["import { forwardRef, useEffect, useImperativeHandle, useRef } from 'react';\n\nimport type { GeometryEditorHandle, GeometryEditorProps } from './ExpoArcgis.types';\nimport ExpoArcgisModule, { type GeometryEditorRef } from './ExpoArcgisModule';\nimport { useGeoView } from './contexts';\nimport { detachQuietly } from './utils/detachQuietly';\n\n/**\n * Interactive geometry editor. Mirrors the native `GeometryEditor` โ place it inside a\n * `<MapView>` to let the user sketch a `type` geometry. Reports edits via `onGeometryChange`\n * and exposes undo / redo / clear / stop through a `ref`.\n *\n * The native SDK binds the editor to 2D map views only, so `<GeometryEditor>` has no effect\n * inside a `<SceneView>`.\n */\nexport const GeometryEditor = forwardRef<GeometryEditorHandle, GeometryEditorProps>(\n function GeometryEditor({ type, active = true, tool, onGeometryChange }, handle) {\n const view = useGeoView();\n const ref = useRef<GeometryEditorRef | undefined>(undefined);\n if (!ref.current) {\n ref.current = new ExpoArcgisModule.GeometryEditorRef();\n }\n\n // Bind the editor to the nearest <MapView> for its lifetime.\n useEffect(() => {\n const editor = ref.current!;\n view.setGeometryEditor(editor);\n return () => {\n detachQuietly(() => view.setGeometryEditor(null));\n editor.release();\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n // Forward geometry-change events to the callback.\n useEffect(() => {\n if (!onGeometryChange) return;\n const subscription = ref.current!.addListener('onGeometryChange', ({ geometry }) => {\n onGeometryChange(geometry ?? null);\n });\n return () => subscription.remove();\n }, [onGeometryChange]);\n\n // Start / restart / stop editing as `active`, `type`, or `tool` changes.\n useEffect(() => {\n const editor = ref.current!;\n if (active) {\n if (tool) editor.setTool(tool);\n editor.start(type);\n } else {\n editor.stop();\n }\n }, [active, type, tool]);\n\n useImperativeHandle(\n handle,\n () => ({\n undo: () => ref.current?.undo(),\n redo: () => ref.current?.redo(),\n clear: () => ref.current?.clearGeometry(),\n deleteSelectedElement: () => ref.current?.deleteSelectedElement(),\n stop: () => ref.current?.stop() ?? null,\n }),\n []\n );\n\n return null;\n }\n);\n"]}
|
package/build/Graphic.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Graphic.d.ts","sourceRoot":"","sources":["../src/Graphic.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AACvD,OAAyB,EAAE,KAAK,UAAU,EAAE,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"Graphic.d.ts","sourceRoot":"","sources":["../src/Graphic.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AACvD,OAAyB,EAAE,KAAK,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAOvE;;;;GAIG;AACH,eAAO,MAAM,OAAO,qGA+BlB,CAAC"}
|
package/build/Graphic.js
CHANGED
|
@@ -4,6 +4,7 @@ import { useGraphicsOverlay } from './contexts';
|
|
|
4
4
|
import { usePrevious } from './hooks/usePrevious';
|
|
5
5
|
import { useUpdateEffect } from './hooks/useUpdateEffect';
|
|
6
6
|
import { getPropsDiffs } from './utils/getPropsDiffs';
|
|
7
|
+
import { detachQuietly } from './utils/detachQuietly';
|
|
7
8
|
/**
|
|
8
9
|
* Declarative point graphic. Draws itself on the nearest `<GraphicsOverlay>`. Forwards its native
|
|
9
10
|
* `GraphicRef` so the graphic can be handed to a GeoElement-anchored analysis โ e.g.
|
|
@@ -21,7 +22,7 @@ export const Graphic = forwardRef(function Graphic(props, fwdRef) {
|
|
|
21
22
|
const graphic = ref.current;
|
|
22
23
|
overlay.addGraphic(graphic);
|
|
23
24
|
return () => {
|
|
24
|
-
overlay.removeGraphic(graphic);
|
|
25
|
+
detachQuietly(() => overlay.removeGraphic(graphic));
|
|
25
26
|
graphic.release();
|
|
26
27
|
};
|
|
27
28
|
// eslint-disable-next-line react-hooks/exhaustive-deps
|
package/build/Graphic.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Graphic.js","sourceRoot":"","sources":["../src/Graphic.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,mBAAmB,EAAE,MAAM,EAAE,MAAM,OAAO,CAAC;AAG3E,OAAO,gBAAqC,MAAM,oBAAoB,CAAC;AACvE,OAAO,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAChD,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAClD,OAAO,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAC1D,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAEtD;;;;GAIG;AACH,MAAM,CAAC,MAAM,OAAO,GAAG,UAAU,CAA2B,SAAS,OAAO,CAAC,KAAK,EAAE,MAAM;IACxF,MAAM,OAAO,GAAG,kBAAkB,EAAE,CAAC;IACrC,MAAM,GAAG,GAAG,MAAM,CAAyB,SAAS,CAAC,CAAC;IACtD,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC;QACjB,GAAG,CAAC,OAAO,GAAG,IAAI,gBAAgB,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;IACvD,CAAC;IACD,mBAAmB,CAAC,MAAM,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC,OAAQ,EAAE,EAAE,CAAC,CAAC;IAEpD,MAAM,IAAI,GAAG,WAAW,CAAC,KAAK,CAAC,CAAC;IAEhC,SAAS,CAAC,GAAG,EAAE;QACb,MAAM,OAAO,GAAG,GAAG,CAAC,OAAQ,CAAC;QAC7B,OAAO,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;QAC5B,OAAO,GAAG,EAAE;YACV,OAAO,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"Graphic.js","sourceRoot":"","sources":["../src/Graphic.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,mBAAmB,EAAE,MAAM,EAAE,MAAM,OAAO,CAAC;AAG3E,OAAO,gBAAqC,MAAM,oBAAoB,CAAC;AACvE,OAAO,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAChD,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAClD,OAAO,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAC1D,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AACtD,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAEtD;;;;GAIG;AACH,MAAM,CAAC,MAAM,OAAO,GAAG,UAAU,CAA2B,SAAS,OAAO,CAAC,KAAK,EAAE,MAAM;IACxF,MAAM,OAAO,GAAG,kBAAkB,EAAE,CAAC;IACrC,MAAM,GAAG,GAAG,MAAM,CAAyB,SAAS,CAAC,CAAC;IACtD,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC;QACjB,GAAG,CAAC,OAAO,GAAG,IAAI,gBAAgB,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;IACvD,CAAC;IACD,mBAAmB,CAAC,MAAM,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC,OAAQ,EAAE,EAAE,CAAC,CAAC;IAEpD,MAAM,IAAI,GAAG,WAAW,CAAC,KAAK,CAAC,CAAC;IAEhC,SAAS,CAAC,GAAG,EAAE;QACb,MAAM,OAAO,GAAG,GAAG,CAAC,OAAQ,CAAC;QAC7B,OAAO,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;QAC5B,OAAO,GAAG,EAAE;YACV,aAAa,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC,CAAC;YACpD,OAAO,CAAC,OAAO,EAAE,CAAC;QACpB,CAAC,CAAC;QACF,uDAAuD;IACzD,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,eAAe,CAAC,GAAG,EAAE;QACnB,MAAM,KAAK,GAAG,aAAa,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;QACzC,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO;QAC/B,MAAM,OAAO,GAA4B,EAAE,CAAC;QAC5C,KAAK,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,EAAE;YACpB,OAAO,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC;QAC5B,CAAC,CAAC,CAAC;QACH,GAAG,CAAC,OAAO,EAAE,UAAU,CAAC,OAAO,CAAC,CAAC;IACnC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC;IAEZ,OAAO,IAAI,CAAC;AACd,CAAC,CAAC,CAAC","sourcesContent":["import { forwardRef, useEffect, useImperativeHandle, useRef } from 'react';\n\nimport type { GraphicProps } from './ExpoArcgis.types';\nimport ExpoArcgisModule, { type GraphicRef } from './ExpoArcgisModule';\nimport { useGraphicsOverlay } from './contexts';\nimport { usePrevious } from './hooks/usePrevious';\nimport { useUpdateEffect } from './hooks/useUpdateEffect';\nimport { getPropsDiffs } from './utils/getPropsDiffs';\nimport { detachQuietly } from './utils/detachQuietly';\n\n/**\n * Declarative point graphic. Draws itself on the nearest `<GraphicsOverlay>`. Forwards its native\n * `GraphicRef` so the graphic can be handed to a GeoElement-anchored analysis โ e.g.\n * `<Viewshed graphic={ref}>` / `<LineOfSight observerGraphic={ref}>`.\n */\nexport const Graphic = forwardRef<GraphicRef, GraphicProps>(function Graphic(props, fwdRef) {\n const overlay = useGraphicsOverlay();\n const ref = useRef<GraphicRef | undefined>(undefined);\n if (!ref.current) {\n ref.current = new ExpoArcgisModule.GraphicRef(props);\n }\n useImperativeHandle(fwdRef, () => ref.current!, []);\n\n const prev = usePrevious(props);\n\n useEffect(() => {\n const graphic = ref.current!;\n overlay.addGraphic(graphic);\n return () => {\n detachQuietly(() => overlay.removeGraphic(graphic));\n graphic.release();\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n useUpdateEffect(() => {\n const diffs = getPropsDiffs(prev, props);\n if (diffs.length === 0) return;\n const changed: Record<string, unknown> = {};\n diffs.forEach((key) => {\n changed[key] = props[key];\n });\n ref.current?.applyProps(changed);\n }, [props]);\n\n return null;\n});\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"GraphicsOverlay.d.ts","sourceRoot":"","sources":["../src/GraphicsOverlay.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAqB,KAAK,iBAAiB,EAAE,MAAM,OAAO,CAAC;AAElE,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"GraphicsOverlay.d.ts","sourceRoot":"","sources":["../src/GraphicsOverlay.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAqB,KAAK,iBAAiB,EAAE,MAAM,OAAO,CAAC;AAElE,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAKnD,MAAM,MAAM,oBAAoB,GAAG;IACjC,sEAAsE;IACtE,QAAQ,CAAC,EAAE,QAAQ,CAAC;CACrB,CAAC;AAEF;;;GAGG;AACH,wBAAgB,eAAe,CAAC,EAAE,QAAQ,EAAE,QAAQ,EAAE,EAAE,iBAAiB,CAAC,oBAAoB,CAAC,+BAyB9F"}
|
package/build/GraphicsOverlay.js
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { useEffect, useRef } from 'react';
|
|
2
2
|
import ExpoArcgisModule from './ExpoArcgisModule';
|
|
3
3
|
import { GraphicsOverlayContext, useGeoView } from './contexts';
|
|
4
|
+
import { detachQuietly } from './utils/detachQuietly';
|
|
4
5
|
/**
|
|
5
6
|
* Declarative graphics overlay. Mirrors the native `GraphicsOverlay` โ a view can hold several.
|
|
6
7
|
* Registers itself with the nearest `<MapView>` / `<SceneView>` and hosts `<Graphic>` children.
|
|
@@ -15,7 +16,7 @@ export function GraphicsOverlay({ renderer, children }) {
|
|
|
15
16
|
const overlay = ref.current;
|
|
16
17
|
view.add(overlay);
|
|
17
18
|
return () => {
|
|
18
|
-
view.remove(overlay);
|
|
19
|
+
detachQuietly(() => view.remove(overlay));
|
|
19
20
|
overlay.release();
|
|
20
21
|
};
|
|
21
22
|
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"GraphicsOverlay.js","sourceRoot":"","sources":["../src/GraphicsOverlay.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,EAA0B,MAAM,OAAO,CAAC;AAGlE,OAAO,gBAA6C,MAAM,oBAAoB,CAAC;AAC/E,OAAO,EAAE,sBAAsB,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"GraphicsOverlay.js","sourceRoot":"","sources":["../src/GraphicsOverlay.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,EAA0B,MAAM,OAAO,CAAC;AAGlE,OAAO,gBAA6C,MAAM,oBAAoB,CAAC;AAC/E,OAAO,EAAE,sBAAsB,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAChE,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAOtD;;;GAGG;AACH,MAAM,UAAU,eAAe,CAAC,EAAE,QAAQ,EAAE,QAAQ,EAA2C;IAC7F,MAAM,IAAI,GAAG,UAAU,EAAE,CAAC;IAC1B,MAAM,GAAG,GAAG,MAAM,CAAiC,SAAS,CAAC,CAAC;IAC9D,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC;QACjB,GAAG,CAAC,OAAO,GAAG,IAAI,gBAAgB,CAAC,kBAAkB,EAAE,CAAC;IAC1D,CAAC;IAED,SAAS,CAAC,GAAG,EAAE;QACb,MAAM,OAAO,GAAG,GAAG,CAAC,OAAQ,CAAC;QAC7B,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QAClB,OAAO,GAAG,EAAE;YACV,aAAa,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC;YAC1C,OAAO,CAAC,OAAO,EAAE,CAAC;QACpB,CAAC,CAAC;QACF,uDAAuD;IACzD,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,sFAAsF;IACtF,SAAS,CAAC,GAAG,EAAE;QACb,GAAG,CAAC,OAAO,EAAE,WAAW,CAAC,QAAQ,IAAI,IAAI,CAAC,CAAC;IAC7C,CAAC,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC;IAEf,OAAO,CACL,CAAC,sBAAsB,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,QAAQ,CAAC,EAAE,sBAAsB,CAAC,QAAQ,CAAC,CAClG,CAAC;AACJ,CAAC","sourcesContent":["import { useEffect, useRef, type PropsWithChildren } from 'react';\n\nimport type { Renderer } from './ExpoArcgis.types';\nimport ExpoArcgisModule, { type GraphicsOverlayRef } from './ExpoArcgisModule';\nimport { GraphicsOverlayContext, useGeoView } from './contexts';\nimport { detachQuietly } from './utils/detachQuietly';\n\nexport type GraphicsOverlayProps = {\n /** Renderer applied to graphics that set no `symbol` of their own. */\n renderer?: Renderer;\n};\n\n/**\n * Declarative graphics overlay. Mirrors the native `GraphicsOverlay` โ a view can hold several.\n * Registers itself with the nearest `<MapView>` / `<SceneView>` and hosts `<Graphic>` children.\n */\nexport function GraphicsOverlay({ renderer, children }: PropsWithChildren<GraphicsOverlayProps>) {\n const view = useGeoView();\n const ref = useRef<GraphicsOverlayRef | undefined>(undefined);\n if (!ref.current) {\n ref.current = new ExpoArcgisModule.GraphicsOverlayRef();\n }\n\n useEffect(() => {\n const overlay = ref.current!;\n view.add(overlay);\n return () => {\n detachQuietly(() => view.remove(overlay));\n overlay.release();\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n // Apply the renderer on mount and whenever it changes (pass a stable/memoized value).\n useEffect(() => {\n ref.current?.setRenderer(renderer ?? null);\n }, [renderer]);\n\n return (\n <GraphicsOverlayContext.Provider value={ref.current}>{children}</GraphicsOverlayContext.Provider>\n );\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"GroupLayer.d.ts","sourceRoot":"","sources":["../src/GroupLayer.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAqB,KAAK,iBAAiB,EAAE,MAAM,OAAO,CAAC;AAElE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"GroupLayer.d.ts","sourceRoot":"","sources":["../src/GroupLayer.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAqB,KAAK,iBAAiB,EAAE,MAAM,OAAO,CAAC;AAElE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AASrD;;;;GAIG;AACH,wBAAgB,UAAU,CAAC,EAAE,QAAQ,EAAE,GAAG,KAAK,EAAE,EAAE,iBAAiB,CAAC,UAAU,CAAC,+BAoC/E"}
|
package/build/GroupLayer.js
CHANGED
|
@@ -4,6 +4,7 @@ import { GeoModelContext, useGeoModel } from './contexts';
|
|
|
4
4
|
import { usePrevious } from './hooks/usePrevious';
|
|
5
5
|
import { useUpdateEffect } from './hooks/useUpdateEffect';
|
|
6
6
|
import { getPropsDiffs } from './utils/getPropsDiffs';
|
|
7
|
+
import { detachQuietly } from './utils/detachQuietly';
|
|
7
8
|
/**
|
|
8
9
|
* Declarative `GroupLayer` โ a container that groups its child layers as a single unit on the
|
|
9
10
|
* nearest `<Map>` / `<Scene>`. Child layers (`<FeatureLayer>`, `<TileLayer>`, โฆ, even nested
|
|
@@ -20,7 +21,7 @@ export function GroupLayer({ children, ...props }) {
|
|
|
20
21
|
const group = ref.current;
|
|
21
22
|
model.addLayer(group);
|
|
22
23
|
return () => {
|
|
23
|
-
model.removeLayer(group);
|
|
24
|
+
detachQuietly(() => model.removeLayer(group));
|
|
24
25
|
group.release();
|
|
25
26
|
};
|
|
26
27
|
// eslint-disable-next-line react-hooks/exhaustive-deps
|
package/build/GroupLayer.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"GroupLayer.js","sourceRoot":"","sources":["../src/GroupLayer.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,EAA0B,MAAM,OAAO,CAAC;AAGlE,OAAO,wBAAwB,MAAM,4BAA4B,CAAC;AAElE,OAAO,EAAE,eAAe,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAC1D,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAClD,OAAO,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAC1D,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAEtD;;;;GAIG;AACH,MAAM,UAAU,UAAU,CAAC,EAAE,QAAQ,EAAE,GAAG,KAAK,EAAiC;IAC9E,MAAM,KAAK,GAAG,WAAW,EAAE,CAAC;IAC5B,MAAM,GAAG,GAAG,MAAM,CAA4B,SAAS,CAAC,CAAC;IACzD,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC;QACjB,GAAG,CAAC,OAAO,GAAG,IAAI,wBAAwB,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;IAClE,CAAC;IAED,MAAM,IAAI,GAAG,WAAW,CAAC,KAAK,CAAC,CAAC;IAEhC,SAAS,CAAC,GAAG,EAAE;QACb,MAAM,KAAK,GAAG,GAAG,CAAC,OAAQ,CAAC;QAC3B,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;QACtB,OAAO,GAAG,EAAE;YACV,KAAK,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"GroupLayer.js","sourceRoot":"","sources":["../src/GroupLayer.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,EAA0B,MAAM,OAAO,CAAC;AAGlE,OAAO,wBAAwB,MAAM,4BAA4B,CAAC;AAElE,OAAO,EAAE,eAAe,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAC1D,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAClD,OAAO,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAC1D,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AACtD,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAEtD;;;;GAIG;AACH,MAAM,UAAU,UAAU,CAAC,EAAE,QAAQ,EAAE,GAAG,KAAK,EAAiC;IAC9E,MAAM,KAAK,GAAG,WAAW,EAAE,CAAC;IAC5B,MAAM,GAAG,GAAG,MAAM,CAA4B,SAAS,CAAC,CAAC;IACzD,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC;QACjB,GAAG,CAAC,OAAO,GAAG,IAAI,wBAAwB,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;IAClE,CAAC;IAED,MAAM,IAAI,GAAG,WAAW,CAAC,KAAK,CAAC,CAAC;IAEhC,SAAS,CAAC,GAAG,EAAE;QACb,MAAM,KAAK,GAAG,GAAG,CAAC,OAAQ,CAAC;QAC3B,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;QACtB,OAAO,GAAG,EAAE;YACV,aAAa,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,CAAC;YAC9C,KAAK,CAAC,OAAO,EAAE,CAAC;QAClB,CAAC,CAAC;QACF,uDAAuD;IACzD,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,eAAe,CAAC,GAAG,EAAE;QACnB,MAAM,KAAK,GAAG,aAAa,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;QACzC,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO;QAC/B,MAAM,OAAO,GAA4B,EAAE,CAAC;QAC5C,KAAK,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,EAAE;YACpB,OAAO,CAAC,GAAa,CAAC,GAAI,KAAiC,CAAC,GAAa,CAAC,CAAC;QAC7E,CAAC,CAAC,CAAC;QACH,GAAG,CAAC,OAAO,EAAE,UAAU,CAAC,OAAO,CAAC,CAAC;IACnC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC;IAEZ,+FAA+F;IAC/F,2CAA2C;IAC3C,OAAO,CACL,CAAC,eAAe,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,OAAiC,CAAC,CACrE;MAAA,CAAC,QAAQ,CACX;IAAA,EAAE,eAAe,CAAC,QAAQ,CAAC,CAC5B,CAAC;AACJ,CAAC","sourcesContent":["import { useEffect, useRef, type PropsWithChildren } from 'react';\n\nimport type { LayerProps } from './ExpoArcgis.types';\nimport ExpoArcgisGeometryModule from './ExpoArcgisGeometryModule';\nimport type { GeoModelRef, GroupLayerRef } from './ExpoArcgisModule';\nimport { GeoModelContext, useGeoModel } from './contexts';\nimport { usePrevious } from './hooks/usePrevious';\nimport { useUpdateEffect } from './hooks/useUpdateEffect';\nimport { getPropsDiffs } from './utils/getPropsDiffs';\nimport { detachQuietly } from './utils/detachQuietly';\n\n/**\n * Declarative `GroupLayer` โ a container that groups its child layers as a single unit on the\n * nearest `<Map>` / `<Scene>`. Child layers (`<FeatureLayer>`, `<TileLayer>`, โฆ, even nested\n * `<GroupLayer>`s) declared inside add themselves to the group instead of the map.\n */\nexport function GroupLayer({ children, ...props }: PropsWithChildren<LayerProps>) {\n const model = useGeoModel();\n const ref = useRef<GroupLayerRef | undefined>(undefined);\n if (!ref.current) {\n ref.current = new ExpoArcgisGeometryModule.GroupLayerRef(props);\n }\n\n const prev = usePrevious(props);\n\n useEffect(() => {\n const group = ref.current!;\n model.addLayer(group);\n return () => {\n detachQuietly(() => model.removeLayer(group));\n group.release();\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n useUpdateEffect(() => {\n const diffs = getPropsDiffs(prev, props);\n if (diffs.length === 0) return;\n const changed: Record<string, unknown> = {};\n diffs.forEach((key) => {\n changed[key as string] = (props as Record<string, unknown>)[key as string];\n });\n ref.current?.applyProps(changed);\n }, [props]);\n\n // The group is itself a layer host โ children consume it through the same GeoModel context and\n // attach to the group rather than the map.\n return (\n <GeoModelContext.Provider value={ref.current as unknown as GeoModelRef}>\n {children}\n </GeoModelContext.Provider>\n );\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ImageOverlay.d.ts","sourceRoot":"","sources":["../src/ImageOverlay.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"ImageOverlay.d.ts","sourceRoot":"","sources":["../src/ImageOverlay.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAM5D;;;;GAIG;AACH,wBAAgB,YAAY,CAAC,EAAE,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,EAAE,iBAAiB,QAuB7E"}
|
package/build/ImageOverlay.js
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { useEffect, useRef } from 'react';
|
|
2
2
|
import ExtrasModule from './ExpoArcgisExtrasModule';
|
|
3
3
|
import { useGeoView } from './contexts';
|
|
4
|
+
import { detachQuietly } from './utils/detachQuietly';
|
|
4
5
|
/**
|
|
5
6
|
* Declarative image overlay. Displays a single georeferenced image (a local file) at a map extent on
|
|
6
7
|
* the nearest `<MapView>`. Update `imagePath` to swap the displayed frame โ e.g. to animate a
|
|
@@ -16,7 +17,7 @@ export function ImageOverlay({ imagePath, extent, opacity }) {
|
|
|
16
17
|
const overlay = ref.current;
|
|
17
18
|
view.addImageOverlay(overlay);
|
|
18
19
|
return () => {
|
|
19
|
-
view.removeImageOverlay(overlay);
|
|
20
|
+
detachQuietly(() => view.removeImageOverlay(overlay));
|
|
20
21
|
overlay.release();
|
|
21
22
|
};
|
|
22
23
|
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ImageOverlay.js","sourceRoot":"","sources":["../src/ImageOverlay.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,OAAO,CAAC;AAG1C,OAAO,YAAY,MAAM,0BAA0B,CAAC;AAEpD,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"ImageOverlay.js","sourceRoot":"","sources":["../src/ImageOverlay.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,OAAO,CAAC;AAG1C,OAAO,YAAY,MAAM,0BAA0B,CAAC;AAEpD,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AACxC,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAEtD;;;;GAIG;AACH,MAAM,UAAU,YAAY,CAAC,EAAE,SAAS,EAAE,MAAM,EAAE,OAAO,EAAqB;IAC5E,MAAM,IAAI,GAAG,UAAU,EAAE,CAAC;IAC1B,MAAM,GAAG,GAAG,MAAM,CAA8B,SAAS,CAAC,CAAC;IAC3D,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC;QACjB,GAAG,CAAC,OAAO,GAAG,IAAI,YAAY,CAAC,eAAe,EAAE,CAAC;IACnD,CAAC;IAED,SAAS,CAAC,GAAG,EAAE;QACb,MAAM,OAAO,GAAG,GAAG,CAAC,OAAQ,CAAC;QAC7B,IAAI,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC;QAC9B,OAAO,GAAG,EAAE;YACV,aAAa,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,kBAAkB,CAAC,OAAO,CAAC,CAAC,CAAC;YACtD,OAAO,CAAC,OAAO,EAAE,CAAC;QACpB,CAAC,CAAC;QACF,uDAAuD;IACzD,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,qEAAqE;IACrE,SAAS,CAAC,GAAG,EAAE;QACb,GAAG,CAAC,OAAO,EAAE,QAAQ,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC;IACpD,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;IAEjC,OAAO,IAAI,CAAC;AACd,CAAC","sourcesContent":["import { useEffect, useRef } from 'react';\n\nimport type { ImageOverlayProps } from './ExpoArcgis.types';\nimport ExtrasModule from './ExpoArcgisExtrasModule';\nimport type { ImageOverlayRef } from './ExpoArcgisModule';\nimport { useGeoView } from './contexts';\nimport { detachQuietly } from './utils/detachQuietly';\n\n/**\n * Declarative image overlay. Displays a single georeferenced image (a local file) at a map extent on\n * the nearest `<MapView>`. Update `imagePath` to swap the displayed frame โ e.g. to animate a\n * sequence of georeferenced images. No-op inside a `<SceneView>`.\n */\nexport function ImageOverlay({ imagePath, extent, opacity }: ImageOverlayProps) {\n const view = useGeoView();\n const ref = useRef<ImageOverlayRef | undefined>(undefined);\n if (!ref.current) {\n ref.current = new ExtrasModule.ImageOverlayRef();\n }\n\n useEffect(() => {\n const overlay = ref.current!;\n view.addImageOverlay(overlay);\n return () => {\n detachQuietly(() => view.removeImageOverlay(overlay));\n overlay.release();\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n // Re-apply the frame whenever the image, extent, or opacity changes.\n useEffect(() => {\n ref.current?.setFrame(imagePath, extent, opacity);\n }, [imagePath, extent, opacity]);\n\n return null;\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"LineOfSight.d.ts","sourceRoot":"","sources":["../src/LineOfSight.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,0BAA0B,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AACvF,OAAyB,EAEvB,KAAK,UAAU,EAEhB,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"LineOfSight.d.ts","sourceRoot":"","sources":["../src/LineOfSight.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,0BAA0B,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AACvF,OAAyB,EAEvB,KAAK,UAAU,EAEhB,MAAM,oBAAoB,CAAC;AAO5B;;;;;;;;;;;;GAYG;AACH,wBAAgB,WAAW,CACzB,KAAK,EACD,gBAAgB,GAChB,CAAC,0BAA0B,GAAG;IAAE,eAAe,EAAE,UAAU,CAAC;IAAC,aAAa,EAAE,UAAU,CAAA;CAAE,CAAC,QA6D9F"}
|
package/build/LineOfSight.js
CHANGED
|
@@ -4,6 +4,7 @@ import { useAnalysisOverlay } from './contexts';
|
|
|
4
4
|
import { usePrevious } from './hooks/usePrevious';
|
|
5
5
|
import { useUpdateEffect } from './hooks/useUpdateEffect';
|
|
6
6
|
import { getPropsDiffs } from './utils/getPropsDiffs';
|
|
7
|
+
import { detachQuietly } from './utils/detachQuietly';
|
|
7
8
|
/**
|
|
8
9
|
* Declarative exploratory line of sight between an observer and a target.
|
|
9
10
|
*
|
|
@@ -40,7 +41,7 @@ export function LineOfSight(props) {
|
|
|
40
41
|
const analysis = analysisRef.current;
|
|
41
42
|
overlay.addAnalysis(analysis);
|
|
42
43
|
return () => {
|
|
43
|
-
overlay.removeAnalysis(analysis);
|
|
44
|
+
detachQuietly(() => overlay.removeAnalysis(analysis));
|
|
44
45
|
analysis.release();
|
|
45
46
|
};
|
|
46
47
|
// eslint-disable-next-line react-hooks/exhaustive-deps
|
package/build/LineOfSight.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"LineOfSight.js","sourceRoot":"","sources":["../src/LineOfSight.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,OAAO,CAAC;AAG1C,OAAO,gBAIN,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAChD,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAClD,OAAO,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAC1D,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAEtD;;;;;;;;;;;;GAYG;AACH,MAAM,UAAU,WAAW,CACzB,KAE6F;IAE7F,MAAM,OAAO,GAAG,kBAAkB,EAAE,CAAC;IACrC,MAAM,WAAW,GAAG,MAAM,CAAwD,SAAS,CAAC,CAAC;IAE7F,IAAI,CAAC,WAAW,CAAC,OAAO,EAAE,CAAC;QACzB,IAAI,iBAAiB,IAAI,KAAK,EAAE,CAAC;YAC/B,WAAW,CAAC,OAAO,GAAG,IAAI,gBAAgB,CAAC,wBAAwB,CACjE,KAAK,CAAC,eAAe,EACrB,KAAK,CAAC,aAAa,CACpB,CAAC;QACJ,CAAC;aAAM,CAAC;YACN,WAAW,CAAC,OAAO,GAAG,IAAI,gBAAgB,CAAC,cAAc,CAAC;gBACxD,QAAQ,EAAE,KAAK,CAAC,QAAQ;gBACxB,MAAM,EAAE,KAAK,CAAC,MAAM;aACrB,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,MAAM,eAAe,GAAG,CAAC,CAAC,iBAAiB,IAAI,KAAK,CAAC,CAAC;IACtD,MAAM,QAAQ,GAAG,eAAe;QAC9B,CAAC,CAAC,EAAE,QAAQ,EAAG,KAA0B,CAAC,QAAQ,EAAE,MAAM,EAAG,KAA0B,CAAC,MAAM,EAAE;QAChG,CAAC,CAAC,SAAS,CAAC;IACd,MAAM,IAAI,GAAG,WAAW,CAAC,QAAQ,CAAC,CAAC;IAEnC,SAAS,CAAC,GAAG,EAAE;QACb,MAAM,QAAQ,GAAG,WAAW,CAAC,OAAQ,CAAC;QACtC,OAAO,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC;QAC9B,OAAO,GAAG,EAAE;YACV,OAAO,CAAC,cAAc,CAAC,QAAQ,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"LineOfSight.js","sourceRoot":"","sources":["../src/LineOfSight.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,OAAO,CAAC;AAG1C,OAAO,gBAIN,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAChD,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAClD,OAAO,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAC1D,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AACtD,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAEtD;;;;;;;;;;;;GAYG;AACH,MAAM,UAAU,WAAW,CACzB,KAE6F;IAE7F,MAAM,OAAO,GAAG,kBAAkB,EAAE,CAAC;IACrC,MAAM,WAAW,GAAG,MAAM,CAAwD,SAAS,CAAC,CAAC;IAE7F,IAAI,CAAC,WAAW,CAAC,OAAO,EAAE,CAAC;QACzB,IAAI,iBAAiB,IAAI,KAAK,EAAE,CAAC;YAC/B,WAAW,CAAC,OAAO,GAAG,IAAI,gBAAgB,CAAC,wBAAwB,CACjE,KAAK,CAAC,eAAe,EACrB,KAAK,CAAC,aAAa,CACpB,CAAC;QACJ,CAAC;aAAM,CAAC;YACN,WAAW,CAAC,OAAO,GAAG,IAAI,gBAAgB,CAAC,cAAc,CAAC;gBACxD,QAAQ,EAAE,KAAK,CAAC,QAAQ;gBACxB,MAAM,EAAE,KAAK,CAAC,MAAM;aACrB,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,MAAM,eAAe,GAAG,CAAC,CAAC,iBAAiB,IAAI,KAAK,CAAC,CAAC;IACtD,MAAM,QAAQ,GAAG,eAAe;QAC9B,CAAC,CAAC,EAAE,QAAQ,EAAG,KAA0B,CAAC,QAAQ,EAAE,MAAM,EAAG,KAA0B,CAAC,MAAM,EAAE;QAChG,CAAC,CAAC,SAAS,CAAC;IACd,MAAM,IAAI,GAAG,WAAW,CAAC,QAAQ,CAAC,CAAC;IAEnC,SAAS,CAAC,GAAG,EAAE;QACb,MAAM,QAAQ,GAAG,WAAW,CAAC,OAAQ,CAAC;QACtC,OAAO,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC;QAC9B,OAAO,GAAG,EAAE;YACV,aAAa,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,cAAc,CAAC,QAAQ,CAAC,CAAC,CAAC;YACtD,QAAQ,CAAC,OAAO,EAAE,CAAC;QACrB,CAAC,CAAC;QACF,uDAAuD;IACzD,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,kEAAkE;IAClE,eAAe,CAAC,GAAG,EAAE;QACnB,IAAI,CAAC,QAAQ,IAAI,CAAC,IAAI;YAAE,OAAO;QAC/B,MAAM,KAAK,GAAG,aAAa,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;QAC5C,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO;QAC/B,MAAM,OAAO,GAA4B,EAAE,CAAC;QAC5C,KAAK,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,EAAE;YACpB,OAAO,CAAC,GAAG,CAAC,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC;QAC/B,CAAC,CAAC,CAAC;QACF,WAAW,CAAC,OAA0B,EAAE,UAAU,CAAC,OAAO,CAAC,CAAC;IAC/D,CAAC,EAAE,CAAC,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,CAAC,CAAC,CAAC;IAE3C,oDAAoD;IACpD,MAAM,EAAE,wBAAwB,EAAE,GAAG,KAAK,CAAC;IAC3C,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,CAAC,wBAAwB;YAAE,OAAO;QACtC,MAAM,YAAY,GAAG,WAAW,CAAC,OAAQ,CAAC,WAAW,CACnD,0BAA0B,EAC1B,CAAC,EAAE,UAAU,EAAE,EAAE,EAAE;YACjB,wBAAwB,CAAC,UAAU,CAAC,CAAC;QACvC,CAAC,CACF,CAAC;QACF,OAAO,GAAG,EAAE,CAAC,YAAY,CAAC,MAAM,EAAE,CAAC;IACrC,CAAC,EAAE,CAAC,wBAAwB,CAAC,CAAC,CAAC;IAE/B,OAAO,IAAI,CAAC;AACd,CAAC","sourcesContent":["import { useEffect, useRef } from 'react';\n\nimport type { GeoElementLineOfSightProps, LineOfSightProps } from './ExpoArcgis.types';\nimport ExpoArcgisModule, {\n type GeoElementLineOfSightRef,\n type GraphicRef,\n type LineOfSightRef,\n} from './ExpoArcgisModule';\nimport { useAnalysisOverlay } from './contexts';\nimport { usePrevious } from './hooks/usePrevious';\nimport { useUpdateEffect } from './hooks/useUpdateEffect';\nimport { getPropsDiffs } from './utils/getPropsDiffs';\nimport { detachQuietly } from './utils/detachQuietly';\n\n/**\n * Declarative exploratory line of sight between an observer and a target.\n *\n * Two modes:\n * - **Location-based** (`LineOfSightProps`): fixed observer and target points โ mirrors the native\n * `ExploratoryLocationLineOfSight`.\n * - **GeoElement-anchored** (`GeoElementLineOfSightProps + observerGraphic + targetGraphic`): both\n * endpoints follow `<Graphic>`s as they move โ mirrors the native\n * `ExploratoryGeoElementLineOfSight`.\n *\n * Both modes draw on the nearest `<AnalysisOverlay>` (3D / `<SceneView>` only) and report the\n * target's visibility via `onTargetVisibilityChange`.\n */\nexport function LineOfSight(\n props:\n | LineOfSightProps\n | (GeoElementLineOfSightProps & { observerGraphic: GraphicRef; targetGraphic: GraphicRef })\n) {\n const overlay = useAnalysisOverlay();\n const analysisRef = useRef<LineOfSightRef | GeoElementLineOfSightRef | undefined>(undefined);\n\n if (!analysisRef.current) {\n if ('observerGraphic' in props) {\n analysisRef.current = new ExpoArcgisModule.GeoElementLineOfSightRef(\n props.observerGraphic,\n props.targetGraphic\n );\n } else {\n analysisRef.current = new ExpoArcgisModule.LineOfSightRef({\n observer: props.observer,\n target: props.target,\n });\n }\n }\n\n const isLocationBased = !('observerGraphic' in props);\n const geometry = isLocationBased\n ? { observer: (props as LineOfSightProps).observer, target: (props as LineOfSightProps).target }\n : undefined;\n const prev = usePrevious(geometry);\n\n useEffect(() => {\n const analysis = analysisRef.current!;\n overlay.addAnalysis(analysis);\n return () => {\n detachQuietly(() => overlay.removeAnalysis(analysis));\n analysis.release();\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n // Location-based only: propagate observer / target point changes.\n useUpdateEffect(() => {\n if (!geometry || !prev) return;\n const diffs = getPropsDiffs(prev, geometry);\n if (diffs.length === 0) return;\n const changed: Record<string, unknown> = {};\n diffs.forEach((key) => {\n changed[key] = geometry[key];\n });\n (analysisRef.current as LineOfSightRef)?.applyProps(changed);\n }, [geometry?.observer, geometry?.target]);\n\n // Subscribe to the native target-visibility stream.\n const { onTargetVisibilityChange } = props;\n useEffect(() => {\n if (!onTargetVisibilityChange) return;\n const subscription = analysisRef.current!.addListener(\n 'onTargetVisibilityChange',\n ({ visibility }) => {\n onTargetVisibilityChange(visibility);\n }\n );\n return () => subscription.remove();\n }, [onTargetVisibilityChange]);\n\n return null;\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MapImageLayer.d.ts","sourceRoot":"","sources":["../src/MapImageLayer.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"MapImageLayer.d.ts","sourceRoot":"","sources":["../src/MapImageLayer.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AAQ7D,qGAAqG;AACrG,wBAAgB,aAAa,CAAC,KAAK,EAAE,kBAAkB,QA8BtD"}
|
package/build/MapImageLayer.js
CHANGED
|
@@ -4,6 +4,7 @@ import { useGeoModel } from './contexts';
|
|
|
4
4
|
import { usePrevious } from './hooks/usePrevious';
|
|
5
5
|
import { useUpdateEffect } from './hooks/useUpdateEffect';
|
|
6
6
|
import { getPropsDiffs } from './utils/getPropsDiffs';
|
|
7
|
+
import { detachQuietly } from './utils/detachQuietly';
|
|
7
8
|
/** Declarative operational `ArcGISMapImageLayer`. Adds itself to the nearest `<Map>` / `<Scene>`. */
|
|
8
9
|
export function MapImageLayer(props) {
|
|
9
10
|
const model = useGeoModel();
|
|
@@ -16,7 +17,7 @@ export function MapImageLayer(props) {
|
|
|
16
17
|
const layer = ref.current;
|
|
17
18
|
model.addLayer(layer);
|
|
18
19
|
return () => {
|
|
19
|
-
model.removeLayer(layer);
|
|
20
|
+
detachQuietly(() => model.removeLayer(layer));
|
|
20
21
|
layer.release();
|
|
21
22
|
};
|
|
22
23
|
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MapImageLayer.js","sourceRoot":"","sources":["../src/MapImageLayer.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,OAAO,CAAC;AAG1C,OAAO,gBAAmC,MAAM,oBAAoB,CAAC;AACrE,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AACzC,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAClD,OAAO,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAC1D,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAEtD,qGAAqG;AACrG,MAAM,UAAU,aAAa,CAAC,KAAyB;IACrD,MAAM,KAAK,GAAG,WAAW,EAAE,CAAC;IAC5B,MAAM,GAAG,GAAG,MAAM,CAAuB,SAAS,CAAC,CAAC;IACpD,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC;QACjB,GAAG,CAAC,OAAO,GAAG,IAAI,gBAAgB,CAAC,gBAAgB,CAAC,KAAK,CAAC,CAAC;IAC7D,CAAC;IAED,MAAM,IAAI,GAAG,WAAW,CAAC,KAAK,CAAC,CAAC;IAEhC,SAAS,CAAC,GAAG,EAAE;QACb,MAAM,KAAK,GAAG,GAAG,CAAC,OAAQ,CAAC;QAC3B,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;QACtB,OAAO,GAAG,EAAE;YACV,KAAK,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"MapImageLayer.js","sourceRoot":"","sources":["../src/MapImageLayer.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,OAAO,CAAC;AAG1C,OAAO,gBAAmC,MAAM,oBAAoB,CAAC;AACrE,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AACzC,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAClD,OAAO,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAC1D,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AACtD,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAEtD,qGAAqG;AACrG,MAAM,UAAU,aAAa,CAAC,KAAyB;IACrD,MAAM,KAAK,GAAG,WAAW,EAAE,CAAC;IAC5B,MAAM,GAAG,GAAG,MAAM,CAAuB,SAAS,CAAC,CAAC;IACpD,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC;QACjB,GAAG,CAAC,OAAO,GAAG,IAAI,gBAAgB,CAAC,gBAAgB,CAAC,KAAK,CAAC,CAAC;IAC7D,CAAC;IAED,MAAM,IAAI,GAAG,WAAW,CAAC,KAAK,CAAC,CAAC;IAEhC,SAAS,CAAC,GAAG,EAAE;QACb,MAAM,KAAK,GAAG,GAAG,CAAC,OAAQ,CAAC;QAC3B,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;QACtB,OAAO,GAAG,EAAE;YACV,aAAa,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,CAAC;YAC9C,KAAK,CAAC,OAAO,EAAE,CAAC;QAClB,CAAC,CAAC;QACF,uDAAuD;IACzD,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,eAAe,CAAC,GAAG,EAAE;QACnB,MAAM,KAAK,GAAG,aAAa,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;QACzC,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO;QAC/B,MAAM,OAAO,GAA4B,EAAE,CAAC;QAC5C,KAAK,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,EAAE;YACpB,OAAO,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC;QAC5B,CAAC,CAAC,CAAC;QACH,GAAG,CAAC,OAAO,EAAE,UAAU,CAAC,OAAO,CAAC,CAAC;IACnC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC;IAEZ,OAAO,IAAI,CAAC;AACd,CAAC","sourcesContent":["import { useEffect, useRef } from 'react';\n\nimport type { MapImageLayerProps } from './ExpoArcgis.types';\nimport ExpoArcgisModule, { type LayerRef } from './ExpoArcgisModule';\nimport { useGeoModel } from './contexts';\nimport { usePrevious } from './hooks/usePrevious';\nimport { useUpdateEffect } from './hooks/useUpdateEffect';\nimport { getPropsDiffs } from './utils/getPropsDiffs';\nimport { detachQuietly } from './utils/detachQuietly';\n\n/** Declarative operational `ArcGISMapImageLayer`. Adds itself to the nearest `<Map>` / `<Scene>`. */\nexport function MapImageLayer(props: MapImageLayerProps) {\n const model = useGeoModel();\n const ref = useRef<LayerRef | undefined>(undefined);\n if (!ref.current) {\n ref.current = new ExpoArcgisModule.MapImageLayerRef(props);\n }\n\n const prev = usePrevious(props);\n\n useEffect(() => {\n const layer = ref.current!;\n model.addLayer(layer);\n return () => {\n detachQuietly(() => model.removeLayer(layer));\n layer.release();\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n useUpdateEffect(() => {\n const diffs = getPropsDiffs(prev, props);\n if (diffs.length === 0) return;\n const changed: Record<string, unknown> = {};\n diffs.forEach((key) => {\n changed[key] = props[key];\n });\n ref.current?.applyProps(changed);\n }, [props]);\n\n return null;\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SceneLayer.d.ts","sourceRoot":"","sources":["../src/SceneLayer.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"SceneLayer.d.ts","sourceRoot":"","sources":["../src/SceneLayer.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAQ1D,uGAAuG;AACvG,wBAAgB,UAAU,CAAC,KAAK,EAAE,eAAe,QA8BhD"}
|
package/build/SceneLayer.js
CHANGED
|
@@ -4,6 +4,7 @@ import { useGeoModel } from './contexts';
|
|
|
4
4
|
import { usePrevious } from './hooks/usePrevious';
|
|
5
5
|
import { useUpdateEffect } from './hooks/useUpdateEffect';
|
|
6
6
|
import { getPropsDiffs } from './utils/getPropsDiffs';
|
|
7
|
+
import { detachQuietly } from './utils/detachQuietly';
|
|
7
8
|
/** Declarative operational `ArcGISSceneLayer` (3D). Adds itself to the nearest `<Scene>` / `<Map>`. */
|
|
8
9
|
export function SceneLayer(props) {
|
|
9
10
|
const model = useGeoModel();
|
|
@@ -16,7 +17,7 @@ export function SceneLayer(props) {
|
|
|
16
17
|
const layer = ref.current;
|
|
17
18
|
model.addLayer(layer);
|
|
18
19
|
return () => {
|
|
19
|
-
model.removeLayer(layer);
|
|
20
|
+
detachQuietly(() => model.removeLayer(layer));
|
|
20
21
|
layer.release();
|
|
21
22
|
};
|
|
22
23
|
// eslint-disable-next-line react-hooks/exhaustive-deps
|
package/build/SceneLayer.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SceneLayer.js","sourceRoot":"","sources":["../src/SceneLayer.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,OAAO,CAAC;AAG1C,OAAO,gBAAmC,MAAM,oBAAoB,CAAC;AACrE,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AACzC,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAClD,OAAO,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAC1D,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAEtD,uGAAuG;AACvG,MAAM,UAAU,UAAU,CAAC,KAAsB;IAC/C,MAAM,KAAK,GAAG,WAAW,EAAE,CAAC;IAC5B,MAAM,GAAG,GAAG,MAAM,CAAuB,SAAS,CAAC,CAAC;IACpD,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC;QACjB,GAAG,CAAC,OAAO,GAAG,IAAI,gBAAgB,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;IAC1D,CAAC;IAED,MAAM,IAAI,GAAG,WAAW,CAAC,KAAK,CAAC,CAAC;IAEhC,SAAS,CAAC,GAAG,EAAE;QACb,MAAM,KAAK,GAAG,GAAG,CAAC,OAAQ,CAAC;QAC3B,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;QACtB,OAAO,GAAG,EAAE;YACV,KAAK,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"SceneLayer.js","sourceRoot":"","sources":["../src/SceneLayer.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,OAAO,CAAC;AAG1C,OAAO,gBAAmC,MAAM,oBAAoB,CAAC;AACrE,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AACzC,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAClD,OAAO,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAC1D,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AACtD,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAEtD,uGAAuG;AACvG,MAAM,UAAU,UAAU,CAAC,KAAsB;IAC/C,MAAM,KAAK,GAAG,WAAW,EAAE,CAAC;IAC5B,MAAM,GAAG,GAAG,MAAM,CAAuB,SAAS,CAAC,CAAC;IACpD,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC;QACjB,GAAG,CAAC,OAAO,GAAG,IAAI,gBAAgB,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;IAC1D,CAAC;IAED,MAAM,IAAI,GAAG,WAAW,CAAC,KAAK,CAAC,CAAC;IAEhC,SAAS,CAAC,GAAG,EAAE;QACb,MAAM,KAAK,GAAG,GAAG,CAAC,OAAQ,CAAC;QAC3B,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;QACtB,OAAO,GAAG,EAAE;YACV,aAAa,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,CAAC;YAC9C,KAAK,CAAC,OAAO,EAAE,CAAC;QAClB,CAAC,CAAC;QACF,uDAAuD;IACzD,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,eAAe,CAAC,GAAG,EAAE;QACnB,MAAM,KAAK,GAAG,aAAa,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;QACzC,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO;QAC/B,MAAM,OAAO,GAA4B,EAAE,CAAC;QAC5C,KAAK,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,EAAE;YACpB,OAAO,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC;QAC5B,CAAC,CAAC,CAAC;QACH,GAAG,CAAC,OAAO,EAAE,UAAU,CAAC,OAAO,CAAC,CAAC;IACnC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC;IAEZ,OAAO,IAAI,CAAC;AACd,CAAC","sourcesContent":["import { useEffect, useRef } from 'react';\n\nimport type { SceneLayerProps } from './ExpoArcgis.types';\nimport ExpoArcgisModule, { type LayerRef } from './ExpoArcgisModule';\nimport { useGeoModel } from './contexts';\nimport { usePrevious } from './hooks/usePrevious';\nimport { useUpdateEffect } from './hooks/useUpdateEffect';\nimport { getPropsDiffs } from './utils/getPropsDiffs';\nimport { detachQuietly } from './utils/detachQuietly';\n\n/** Declarative operational `ArcGISSceneLayer` (3D). Adds itself to the nearest `<Scene>` / `<Map>`. */\nexport function SceneLayer(props: SceneLayerProps) {\n const model = useGeoModel();\n const ref = useRef<LayerRef | undefined>(undefined);\n if (!ref.current) {\n ref.current = new ExpoArcgisModule.SceneLayerRef(props);\n }\n\n const prev = usePrevious(props);\n\n useEffect(() => {\n const layer = ref.current!;\n model.addLayer(layer);\n return () => {\n detachQuietly(() => model.removeLayer(layer));\n layer.release();\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n useUpdateEffect(() => {\n const diffs = getPropsDiffs(prev, props);\n if (diffs.length === 0) return;\n const changed: Record<string, unknown> = {};\n diffs.forEach((key) => {\n changed[key] = props[key];\n });\n ref.current?.applyProps(changed);\n }, [props]);\n\n return null;\n}\n"]}
|
package/build/TileLayer.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TileLayer.d.ts","sourceRoot":"","sources":["../src/TileLayer.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"TileLayer.d.ts","sourceRoot":"","sources":["../src/TileLayer.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAQzD,kGAAkG;AAClG,wBAAgB,SAAS,CAAC,KAAK,EAAE,cAAc,QA8B9C"}
|
package/build/TileLayer.js
CHANGED
|
@@ -4,6 +4,7 @@ import { useGeoModel } from './contexts';
|
|
|
4
4
|
import { usePrevious } from './hooks/usePrevious';
|
|
5
5
|
import { useUpdateEffect } from './hooks/useUpdateEffect';
|
|
6
6
|
import { getPropsDiffs } from './utils/getPropsDiffs';
|
|
7
|
+
import { detachQuietly } from './utils/detachQuietly';
|
|
7
8
|
/** Declarative operational `ArcGISTiledLayer`. Adds itself to the nearest `<Map>` / `<Scene>`. */
|
|
8
9
|
export function TileLayer(props) {
|
|
9
10
|
const model = useGeoModel();
|
|
@@ -16,7 +17,7 @@ export function TileLayer(props) {
|
|
|
16
17
|
const layer = ref.current;
|
|
17
18
|
model.addLayer(layer);
|
|
18
19
|
return () => {
|
|
19
|
-
model.removeLayer(layer);
|
|
20
|
+
detachQuietly(() => model.removeLayer(layer));
|
|
20
21
|
layer.release();
|
|
21
22
|
};
|
|
22
23
|
// eslint-disable-next-line react-hooks/exhaustive-deps
|
package/build/TileLayer.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TileLayer.js","sourceRoot":"","sources":["../src/TileLayer.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,OAAO,CAAC;AAG1C,OAAO,gBAAmC,MAAM,oBAAoB,CAAC;AACrE,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AACzC,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAClD,OAAO,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAC1D,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAEtD,kGAAkG;AAClG,MAAM,UAAU,SAAS,CAAC,KAAqB;IAC7C,MAAM,KAAK,GAAG,WAAW,EAAE,CAAC;IAC5B,MAAM,GAAG,GAAG,MAAM,CAAuB,SAAS,CAAC,CAAC;IACpD,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC;QACjB,GAAG,CAAC,OAAO,GAAG,IAAI,gBAAgB,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;IAC1D,CAAC;IAED,MAAM,IAAI,GAAG,WAAW,CAAC,KAAK,CAAC,CAAC;IAEhC,SAAS,CAAC,GAAG,EAAE;QACb,MAAM,KAAK,GAAG,GAAG,CAAC,OAAQ,CAAC;QAC3B,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;QACtB,OAAO,GAAG,EAAE;YACV,KAAK,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"TileLayer.js","sourceRoot":"","sources":["../src/TileLayer.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,OAAO,CAAC;AAG1C,OAAO,gBAAmC,MAAM,oBAAoB,CAAC;AACrE,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AACzC,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAClD,OAAO,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAC1D,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AACtD,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAEtD,kGAAkG;AAClG,MAAM,UAAU,SAAS,CAAC,KAAqB;IAC7C,MAAM,KAAK,GAAG,WAAW,EAAE,CAAC;IAC5B,MAAM,GAAG,GAAG,MAAM,CAAuB,SAAS,CAAC,CAAC;IACpD,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC;QACjB,GAAG,CAAC,OAAO,GAAG,IAAI,gBAAgB,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;IAC1D,CAAC;IAED,MAAM,IAAI,GAAG,WAAW,CAAC,KAAK,CAAC,CAAC;IAEhC,SAAS,CAAC,GAAG,EAAE;QACb,MAAM,KAAK,GAAG,GAAG,CAAC,OAAQ,CAAC;QAC3B,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;QACtB,OAAO,GAAG,EAAE;YACV,aAAa,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,CAAC;YAC9C,KAAK,CAAC,OAAO,EAAE,CAAC;QAClB,CAAC,CAAC;QACF,uDAAuD;IACzD,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,eAAe,CAAC,GAAG,EAAE;QACnB,MAAM,KAAK,GAAG,aAAa,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;QACzC,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO;QAC/B,MAAM,OAAO,GAA4B,EAAE,CAAC;QAC5C,KAAK,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,EAAE;YACpB,OAAO,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC;QAC5B,CAAC,CAAC,CAAC;QACH,GAAG,CAAC,OAAO,EAAE,UAAU,CAAC,OAAO,CAAC,CAAC;IACnC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC;IAEZ,OAAO,IAAI,CAAC;AACd,CAAC","sourcesContent":["import { useEffect, useRef } from 'react';\n\nimport type { TileLayerProps } from './ExpoArcgis.types';\nimport ExpoArcgisModule, { type LayerRef } from './ExpoArcgisModule';\nimport { useGeoModel } from './contexts';\nimport { usePrevious } from './hooks/usePrevious';\nimport { useUpdateEffect } from './hooks/useUpdateEffect';\nimport { getPropsDiffs } from './utils/getPropsDiffs';\nimport { detachQuietly } from './utils/detachQuietly';\n\n/** Declarative operational `ArcGISTiledLayer`. Adds itself to the nearest `<Map>` / `<Scene>`. */\nexport function TileLayer(props: TileLayerProps) {\n const model = useGeoModel();\n const ref = useRef<LayerRef | undefined>(undefined);\n if (!ref.current) {\n ref.current = new ExpoArcgisModule.TiledLayerRef(props);\n }\n\n const prev = usePrevious(props);\n\n useEffect(() => {\n const layer = ref.current!;\n model.addLayer(layer);\n return () => {\n detachQuietly(() => model.removeLayer(layer));\n layer.release();\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n useUpdateEffect(() => {\n const diffs = getPropsDiffs(prev, props);\n if (diffs.length === 0) return;\n const changed: Record<string, unknown> = {};\n diffs.forEach((key) => {\n changed[key] = props[key];\n });\n ref.current?.applyProps(changed);\n }, [props]);\n\n return null;\n}\n"]}
|
package/build/Viewshed.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Viewshed.d.ts","sourceRoot":"","sources":["../src/Viewshed.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,uBAAuB,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACjF,OAAyB,EAEvB,KAAK,UAAU,EAEhB,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"Viewshed.d.ts","sourceRoot":"","sources":["../src/Viewshed.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,uBAAuB,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACjF,OAAyB,EAEvB,KAAK,UAAU,EAEhB,MAAM,oBAAoB,CAAC;AAO5B;;;;;;;;;;GAUG;AACH,wBAAgB,QAAQ,CACtB,KAAK,EAAE,aAAa,GAAG,CAAC,uBAAuB,GAAG;IAAE,OAAO,EAAE,UAAU,CAAA;CAAE,CAAC,QA2C3E"}
|
package/build/Viewshed.js
CHANGED
|
@@ -4,6 +4,7 @@ import { useAnalysisOverlay } from './contexts';
|
|
|
4
4
|
import { usePrevious } from './hooks/usePrevious';
|
|
5
5
|
import { useUpdateEffect } from './hooks/useUpdateEffect';
|
|
6
6
|
import { getPropsDiffs } from './utils/getPropsDiffs';
|
|
7
|
+
import { detachQuietly } from './utils/detachQuietly';
|
|
7
8
|
/**
|
|
8
9
|
* Declarative exploratory viewshed โ the area visible from an observer.
|
|
9
10
|
*
|
|
@@ -32,7 +33,7 @@ export function Viewshed(props) {
|
|
|
32
33
|
const analysis = analysisRef.current;
|
|
33
34
|
overlay.addAnalysis(analysis);
|
|
34
35
|
return () => {
|
|
35
|
-
overlay.removeAnalysis(analysis);
|
|
36
|
+
detachQuietly(() => overlay.removeAnalysis(analysis));
|
|
36
37
|
analysis.release();
|
|
37
38
|
};
|
|
38
39
|
// eslint-disable-next-line react-hooks/exhaustive-deps
|
package/build/Viewshed.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Viewshed.js","sourceRoot":"","sources":["../src/Viewshed.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,OAAO,CAAC;AAG1C,OAAO,gBAIN,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAChD,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAClD,OAAO,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAC1D,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAEtD;;;;;;;;;;GAUG;AACH,MAAM,UAAU,QAAQ,CACtB,KAA0E;IAE1E,MAAM,OAAO,GAAG,kBAAkB,EAAE,CAAC;IACrC,MAAM,WAAW,GAAG,MAAM,CAAkD,SAAS,CAAC,CAAC;IAEvF,IAAI,CAAC,WAAW,CAAC,OAAO,EAAE,CAAC;QACzB,IAAI,SAAS,IAAI,KAAK,EAAE,CAAC;YACvB,MAAM,EAAE,OAAO,EAAE,GAAG,IAAI,EAAE,GAAG,KAAK,CAAC;YACnC,WAAW,CAAC,OAAO,GAAG,IAAI,gBAAgB,CAAC,qBAAqB,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;QAClF,CAAC;aAAM,CAAC;YACN,WAAW,CAAC,OAAO,GAAG,IAAI,gBAAgB,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;QAChE,CAAC;IACH,CAAC;IAED,MAAM,IAAI,GAAG,WAAW,CAAC,KAAK,CAAC,CAAC;IAEhC,SAAS,CAAC,GAAG,EAAE;QACb,MAAM,QAAQ,GAAG,WAAW,CAAC,OAAQ,CAAC;QACtC,OAAO,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC;QAC9B,OAAO,GAAG,EAAE;YACV,OAAO,CAAC,cAAc,CAAC,QAAQ,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"Viewshed.js","sourceRoot":"","sources":["../src/Viewshed.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,OAAO,CAAC;AAG1C,OAAO,gBAIN,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAChD,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAClD,OAAO,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAC1D,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AACtD,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAEtD;;;;;;;;;;GAUG;AACH,MAAM,UAAU,QAAQ,CACtB,KAA0E;IAE1E,MAAM,OAAO,GAAG,kBAAkB,EAAE,CAAC;IACrC,MAAM,WAAW,GAAG,MAAM,CAAkD,SAAS,CAAC,CAAC;IAEvF,IAAI,CAAC,WAAW,CAAC,OAAO,EAAE,CAAC;QACzB,IAAI,SAAS,IAAI,KAAK,EAAE,CAAC;YACvB,MAAM,EAAE,OAAO,EAAE,GAAG,IAAI,EAAE,GAAG,KAAK,CAAC;YACnC,WAAW,CAAC,OAAO,GAAG,IAAI,gBAAgB,CAAC,qBAAqB,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;QAClF,CAAC;aAAM,CAAC;YACN,WAAW,CAAC,OAAO,GAAG,IAAI,gBAAgB,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;QAChE,CAAC;IACH,CAAC;IAED,MAAM,IAAI,GAAG,WAAW,CAAC,KAAK,CAAC,CAAC;IAEhC,SAAS,CAAC,GAAG,EAAE;QACb,MAAM,QAAQ,GAAG,WAAW,CAAC,OAAQ,CAAC;QACtC,OAAO,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC;QAC9B,OAAO,GAAG,EAAE;YACV,aAAa,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,cAAc,CAAC,QAAQ,CAAC,CAAC,CAAC;YACtD,QAAQ,CAAC,OAAO,EAAE,CAAC;QACrB,CAAC,CAAC;QACF,uDAAuD;IACzD,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,eAAe,CAAC,GAAG,EAAE;QACnB,MAAM,KAAK,GAAG,aAAa,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;QACzC,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO;QAC/B,oFAAoF;QACpF,MAAM,OAAO,GAA4B,EAAE,CAAC;QAC5C,KAAK,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,EAAE;YACpB,qFAAqF;YACrF,IAAK,GAAc,KAAK,SAAS,EAAE,CAAC;gBAClC,OAAO,CAAC,GAAa,CAAC,GAAI,KAAiC,CAAC,GAAa,CAAC,CAAC;YAC7E,CAAC;QACH,CAAC,CAAC,CAAC;QACH,IAAI,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACpC,WAAW,CAAC,OAAO,EAAE,UAAU,CAAC,OAAO,CAAC,CAAC;QAC3C,CAAC;IACH,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC;IAEZ,OAAO,IAAI,CAAC;AACd,CAAC","sourcesContent":["import { useEffect, useRef } from 'react';\n\nimport type { GeoElementViewshedProps, ViewshedProps } from './ExpoArcgis.types';\nimport ExpoArcgisModule, {\n type GeoElementViewshedRef,\n type GraphicRef,\n type ViewshedRef,\n} from './ExpoArcgisModule';\nimport { useAnalysisOverlay } from './contexts';\nimport { usePrevious } from './hooks/usePrevious';\nimport { useUpdateEffect } from './hooks/useUpdateEffect';\nimport { getPropsDiffs } from './utils/getPropsDiffs';\nimport { detachQuietly } from './utils/detachQuietly';\n\n/**\n * Declarative exploratory viewshed โ the area visible from an observer.\n *\n * Two modes:\n * - **Location-based** (`ViewshedProps`): fixed observer point โ mirrors the native\n * `ExploratoryLocationViewshed`.\n * - **GeoElement-anchored** (`GeoElementViewshedProps + graphic`): observer follows a `<Graphic>`\n * as it moves โ mirrors the native `ExploratoryGeoElementViewshed`.\n *\n * Both modes draw on the nearest `<AnalysisOverlay>` (3D / `<SceneView>` only).\n */\nexport function Viewshed(\n props: ViewshedProps | (GeoElementViewshedProps & { graphic: GraphicRef })\n) {\n const overlay = useAnalysisOverlay();\n const analysisRef = useRef<ViewshedRef | GeoElementViewshedRef | undefined>(undefined);\n\n if (!analysisRef.current) {\n if ('graphic' in props) {\n const { graphic, ...rest } = props;\n analysisRef.current = new ExpoArcgisModule.GeoElementViewshedRef(graphic, rest);\n } else {\n analysisRef.current = new ExpoArcgisModule.ViewshedRef(props);\n }\n }\n\n const prev = usePrevious(props);\n\n useEffect(() => {\n const analysis = analysisRef.current!;\n overlay.addAnalysis(analysis);\n return () => {\n detachQuietly(() => overlay.removeAnalysis(analysis));\n analysis.release();\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n useUpdateEffect(() => {\n const diffs = getPropsDiffs(prev, props);\n if (diffs.length === 0) return;\n // `graphic` is construction-only โ skip it (remount to change the tracked graphic).\n const changed: Record<string, unknown> = {};\n diffs.forEach((key) => {\n // `graphic` is construction-only โ skip it (TS doesn't model it as a diff key here).\n if ((key as string) !== 'graphic') {\n changed[key as string] = (props as Record<string, unknown>)[key as string];\n }\n });\n if (Object.keys(changed).length > 0) {\n analysisRef.current?.applyProps(changed);\n }\n }, [props]);\n\n return null;\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"createLayerComponent.d.ts","sourceRoot":"","sources":["../src/createLayerComponent.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"createLayerComponent.d.ts","sourceRoot":"","sources":["../src/createLayerComponent.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAOnD;;;;;GAKG;AACH,wBAAgB,oBAAoB,CAAC,CAAC,SAAS,MAAM,EAAE,CAAC,GAAG,OAAO,EAChE,OAAO,EAAE,CAAC,KAAK,EAAE,CAAC,KAAK,QAAQ,oHAsChC"}
|
|
@@ -3,6 +3,7 @@ import { useGeoModel } from './contexts';
|
|
|
3
3
|
import { usePrevious } from './hooks/usePrevious';
|
|
4
4
|
import { useUpdateEffect } from './hooks/useUpdateEffect';
|
|
5
5
|
import { getPropsDiffs } from './utils/getPropsDiffs';
|
|
6
|
+
import { detachQuietly } from './utils/detachQuietly';
|
|
6
7
|
/**
|
|
7
8
|
* Builds a declarative operational-layer component from a native `LayerRef` factory.
|
|
8
9
|
* Mirrors `<TileLayer>` / `<MapImageLayer>`: creates the ref once, attaches it to the nearest
|
|
@@ -23,7 +24,7 @@ export function createLayerComponent(makeRef) {
|
|
|
23
24
|
const layer = ref.current;
|
|
24
25
|
model.addLayer(layer);
|
|
25
26
|
return () => {
|
|
26
|
-
model.removeLayer(layer);
|
|
27
|
+
detachQuietly(() => model.removeLayer(layer));
|
|
27
28
|
layer.release();
|
|
28
29
|
};
|
|
29
30
|
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"createLayerComponent.js","sourceRoot":"","sources":["../src/createLayerComponent.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,mBAAmB,EAAE,MAAM,EAAE,MAAM,OAAO,CAAC;AAG3E,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AACzC,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAClD,OAAO,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAC1D,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAEtD;;;;;GAKG;AACH,MAAM,UAAU,oBAAoB,CAClC,OAA+B;IAE/B,OAAO,UAAU,CAAO,SAAS,KAAK,CAAC,QAAQ,EAAE,MAAM;QACrD,+FAA+F;QAC/F,MAAM,KAAK,GAAG,QAAa,CAAC;QAC5B,MAAM,KAAK,GAAG,WAAW,EAAE,CAAC;QAC5B,MAAM,GAAG,GAAG,MAAM,CAAuB,SAAS,CAAC,CAAC;QACpD,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC;YACjB,GAAG,CAAC,OAAO,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC;QAC/B,CAAC;QAED,MAAM,IAAI,GAAG,WAAW,CAAC,KAAK,CAAC,CAAC;QAEhC,SAAS,CAAC,GAAG,EAAE;YACb,MAAM,KAAK,GAAG,GAAG,CAAC,OAAQ,CAAC;YAC3B,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;YACtB,OAAO,GAAG,EAAE;gBACV,KAAK,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"createLayerComponent.js","sourceRoot":"","sources":["../src/createLayerComponent.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,mBAAmB,EAAE,MAAM,EAAE,MAAM,OAAO,CAAC;AAG3E,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AACzC,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAClD,OAAO,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAC1D,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AACtD,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAEtD;;;;;GAKG;AACH,MAAM,UAAU,oBAAoB,CAClC,OAA+B;IAE/B,OAAO,UAAU,CAAO,SAAS,KAAK,CAAC,QAAQ,EAAE,MAAM;QACrD,+FAA+F;QAC/F,MAAM,KAAK,GAAG,QAAa,CAAC;QAC5B,MAAM,KAAK,GAAG,WAAW,EAAE,CAAC;QAC5B,MAAM,GAAG,GAAG,MAAM,CAAuB,SAAS,CAAC,CAAC;QACpD,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC;YACjB,GAAG,CAAC,OAAO,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC;QAC/B,CAAC;QAED,MAAM,IAAI,GAAG,WAAW,CAAC,KAAK,CAAC,CAAC;QAEhC,SAAS,CAAC,GAAG,EAAE;YACb,MAAM,KAAK,GAAG,GAAG,CAAC,OAAQ,CAAC;YAC3B,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;YACtB,OAAO,GAAG,EAAE;gBACV,aAAa,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,CAAC;gBAC9C,KAAK,CAAC,OAAO,EAAE,CAAC;YAClB,CAAC,CAAC;YACF,uDAAuD;QACzD,CAAC,EAAE,EAAE,CAAC,CAAC;QAEP,eAAe,CAAC,GAAG,EAAE;YACnB,MAAM,KAAK,GAAG,aAAa,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;YACzC,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;gBAAE,OAAO;YAC/B,MAAM,OAAO,GAA4B,EAAE,CAAC;YAC5C,KAAK,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,EAAE;gBACpB,OAAO,CAAC,GAAa,CAAC,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC;YACtC,CAAC,CAAC,CAAC;YACH,GAAG,CAAC,OAAO,EAAE,UAAU,CAAC,OAAO,CAAC,CAAC;QACnC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC;QAEZ,4FAA4F;QAC5F,mBAAmB,CAAC,MAAM,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC,OAAY,EAAE,EAAE,CAAC,CAAC;QAExD,OAAO,IAAI,CAAC;IACd,CAAC,CAAC,CAAC;AACL,CAAC","sourcesContent":["import { forwardRef, useEffect, useImperativeHandle, useRef } from 'react';\n\nimport type { LayerRef } from './ExpoArcgisModule';\nimport { useGeoModel } from './contexts';\nimport { usePrevious } from './hooks/usePrevious';\nimport { useUpdateEffect } from './hooks/useUpdateEffect';\nimport { getPropsDiffs } from './utils/getPropsDiffs';\nimport { detachQuietly } from './utils/detachQuietly';\n\n/**\n * Builds a declarative operational-layer component from a native `LayerRef` factory.\n * Mirrors `<TileLayer>` / `<MapImageLayer>`: creates the ref once, attaches it to the nearest\n * `<Map>` / `<Scene>` via `useGeoModel`, reconciles prop changes via `applyProps`, and forwards the\n * native ref (typed `H`) so a layer's inspection/query methods are callable through a `ref`.\n */\nexport function createLayerComponent<P extends object, H = unknown>(\n makeRef: (props: P) => LayerRef\n) {\n return forwardRef<H, P>(function Layer(rawProps, handle) {\n // forwardRef types props as `PropsWithoutRef<P>`; our `P` has no ref prop, so treat it as `P`.\n const props = rawProps as P;\n const model = useGeoModel();\n const ref = useRef<LayerRef | undefined>(undefined);\n if (!ref.current) {\n ref.current = makeRef(props);\n }\n\n const prev = usePrevious(props);\n\n useEffect(() => {\n const layer = ref.current!;\n model.addLayer(layer);\n return () => {\n detachQuietly(() => model.removeLayer(layer));\n layer.release();\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n useUpdateEffect(() => {\n const diffs = getPropsDiffs(prev, props);\n if (diffs.length === 0) return;\n const changed: Record<string, unknown> = {};\n diffs.forEach((key) => {\n changed[key as string] = props[key];\n });\n ref.current?.applyProps(changed);\n }, [props]);\n\n // Expose the native ref so layers with extra methods (e.g. KmlLayer.getNodes) are callable.\n useImperativeHandle(handle, () => ref.current as H, []);\n\n return null;\n });\n}\n"]}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Runs a SharedObject *detach* call โ e.g. `overlay.removeGraphic(g)`, `model.removeLayer(l)`,
|
|
3
|
+
* `view.setGeometryEditor(null)` โ that may race with React's unmount ordering.
|
|
4
|
+
*
|
|
5
|
+
* When a subtree unmounts, React releases a parent SharedObject (the `<Map>` / `<MapView>` /
|
|
6
|
+
* `<GraphicsOverlay>` / `<AnalysisOverlay>` โฆ) before its children's effect cleanups run. The child
|
|
7
|
+
* then detaching itself from that already-released parent throws
|
|
8
|
+
* `NativeSharedObjectNotFoundException` (the native receiver/argument can no longer be resolved).
|
|
9
|
+
* That is benign at teardown โ there is nothing left to detach from โ so we swallow it. When only
|
|
10
|
+
* the child unmounts (the parent stays mounted), the detach runs normally and removes the child.
|
|
11
|
+
*
|
|
12
|
+
* The child still releases its *own* SharedObject afterwards: that object is owned by the child and
|
|
13
|
+
* is always alive at this point, so its `release()` is left unguarded.
|
|
14
|
+
*/
|
|
15
|
+
export declare function detachQuietly(detach: () => void): void;
|
|
16
|
+
//# sourceMappingURL=detachQuietly.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"detachQuietly.d.ts","sourceRoot":"","sources":["../../src/utils/detachQuietly.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AACH,wBAAgB,aAAa,CAAC,MAAM,EAAE,MAAM,IAAI,GAAG,IAAI,CAMtD"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Runs a SharedObject *detach* call โ e.g. `overlay.removeGraphic(g)`, `model.removeLayer(l)`,
|
|
3
|
+
* `view.setGeometryEditor(null)` โ that may race with React's unmount ordering.
|
|
4
|
+
*
|
|
5
|
+
* When a subtree unmounts, React releases a parent SharedObject (the `<Map>` / `<MapView>` /
|
|
6
|
+
* `<GraphicsOverlay>` / `<AnalysisOverlay>` โฆ) before its children's effect cleanups run. The child
|
|
7
|
+
* then detaching itself from that already-released parent throws
|
|
8
|
+
* `NativeSharedObjectNotFoundException` (the native receiver/argument can no longer be resolved).
|
|
9
|
+
* That is benign at teardown โ there is nothing left to detach from โ so we swallow it. When only
|
|
10
|
+
* the child unmounts (the parent stays mounted), the detach runs normally and removes the child.
|
|
11
|
+
*
|
|
12
|
+
* The child still releases its *own* SharedObject afterwards: that object is owned by the child and
|
|
13
|
+
* is always alive at this point, so its `release()` is left unguarded.
|
|
14
|
+
*/
|
|
15
|
+
export function detachQuietly(detach) {
|
|
16
|
+
try {
|
|
17
|
+
detach();
|
|
18
|
+
}
|
|
19
|
+
catch {
|
|
20
|
+
// Parent SharedObject already released by its own unmount โ nothing to detach from.
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
//# sourceMappingURL=detachQuietly.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"detachQuietly.js","sourceRoot":"","sources":["../../src/utils/detachQuietly.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AACH,MAAM,UAAU,aAAa,CAAC,MAAkB;IAC9C,IAAI,CAAC;QACH,MAAM,EAAE,CAAC;IACX,CAAC;IAAC,MAAM,CAAC;QACP,oFAAoF;IACtF,CAAC;AACH,CAAC","sourcesContent":["/**\n * Runs a SharedObject *detach* call โ e.g. `overlay.removeGraphic(g)`, `model.removeLayer(l)`,\n * `view.setGeometryEditor(null)` โ that may race with React's unmount ordering.\n *\n * When a subtree unmounts, React releases a parent SharedObject (the `<Map>` / `<MapView>` /\n * `<GraphicsOverlay>` / `<AnalysisOverlay>` โฆ) before its children's effect cleanups run. The child\n * then detaching itself from that already-released parent throws\n * `NativeSharedObjectNotFoundException` (the native receiver/argument can no longer be resolved).\n * That is benign at teardown โ there is nothing left to detach from โ so we swallow it. When only\n * the child unmounts (the parent stays mounted), the detach runs normally and removes the child.\n *\n * The child still releases its *own* SharedObject afterwards: that object is owned by the child and\n * is always alive at this point, so its `release()` is left unguarded.\n */\nexport function detachQuietly(detach: () => void): void {\n try {\n detach();\n } catch {\n // Parent SharedObject already released by its own unmount โ nothing to detach from.\n }\n}\n"]}
|
package/package.json
CHANGED
package/src/AnalysisOverlay.tsx
CHANGED
|
@@ -3,6 +3,7 @@ import { useEffect, useRef, type PropsWithChildren } from 'react';
|
|
|
3
3
|
import type { AnalysisOverlayProps } from './ExpoArcgis.types';
|
|
4
4
|
import ExpoArcgisModule, { type AnalysisOverlayRef } from './ExpoArcgisModule';
|
|
5
5
|
import { AnalysisOverlayContext, useGeoView } from './contexts';
|
|
6
|
+
import { detachQuietly } from './utils/detachQuietly';
|
|
6
7
|
|
|
7
8
|
/**
|
|
8
9
|
* Declarative analysis overlay. Mirrors the native `AnalysisOverlay` โ a `<SceneView>` can hold
|
|
@@ -20,7 +21,7 @@ export function AnalysisOverlay({ visible, children }: PropsWithChildren<Analysi
|
|
|
20
21
|
const overlay = ref.current!;
|
|
21
22
|
view.addAnalysisOverlay(overlay);
|
|
22
23
|
return () => {
|
|
23
|
-
view.removeAnalysisOverlay(overlay);
|
|
24
|
+
detachQuietly(() => view.removeAnalysisOverlay(overlay));
|
|
24
25
|
overlay.release();
|
|
25
26
|
};
|
|
26
27
|
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
@@ -6,6 +6,7 @@ import { useAnalysisOverlay } from './contexts';
|
|
|
6
6
|
import { usePrevious } from './hooks/usePrevious';
|
|
7
7
|
import { useUpdateEffect } from './hooks/useUpdateEffect';
|
|
8
8
|
import { getPropsDiffs } from './utils/getPropsDiffs';
|
|
9
|
+
import { detachQuietly } from './utils/detachQuietly';
|
|
9
10
|
|
|
10
11
|
/**
|
|
11
12
|
* Declarative exploratory distance measurement between two 3D points. Mirrors the native
|
|
@@ -30,7 +31,7 @@ export function DistanceMeasurement({
|
|
|
30
31
|
const analysis = ref.current!;
|
|
31
32
|
overlay.addAnalysis(analysis);
|
|
32
33
|
return () => {
|
|
33
|
-
overlay.removeAnalysis(analysis);
|
|
34
|
+
detachQuietly(() => overlay.removeAnalysis(analysis));
|
|
34
35
|
analysis.release();
|
|
35
36
|
};
|
|
36
37
|
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
@@ -11,6 +11,7 @@ import { useGeoModel } from './contexts';
|
|
|
11
11
|
import { usePrevious } from './hooks/usePrevious';
|
|
12
12
|
import { useUpdateEffect } from './hooks/useUpdateEffect';
|
|
13
13
|
import { getPropsDiffs } from './utils/getPropsDiffs';
|
|
14
|
+
import { detachQuietly } from './utils/detachQuietly';
|
|
14
15
|
|
|
15
16
|
/**
|
|
16
17
|
* Declarative real-time `DynamicEntityLayer`. Adds itself to the nearest `<Map>` / `<Scene>`, shows
|
|
@@ -32,7 +33,7 @@ export const DynamicEntityLayer = forwardRef<DynamicEntityLayerHandle, DynamicEn
|
|
|
32
33
|
const layer = ref.current!;
|
|
33
34
|
model.addLayer(layer);
|
|
34
35
|
return () => {
|
|
35
|
-
model.removeLayer(layer);
|
|
36
|
+
detachQuietly(() => model.removeLayer(layer));
|
|
36
37
|
layer.release();
|
|
37
38
|
};
|
|
38
39
|
// eslint-disable-next-line react-hooks/exhaustive-deps
|
package/src/FeatureLayer.tsx
CHANGED
|
@@ -7,6 +7,7 @@ import { useGeoModel } from './contexts';
|
|
|
7
7
|
import { usePrevious } from './hooks/usePrevious';
|
|
8
8
|
import { useUpdateEffect } from './hooks/useUpdateEffect';
|
|
9
9
|
import { getPropsDiffs } from './utils/getPropsDiffs';
|
|
10
|
+
import { detachQuietly } from './utils/detachQuietly';
|
|
10
11
|
|
|
11
12
|
/**
|
|
12
13
|
* Declarative operational `FeatureLayer`. Adds itself to the nearest `<Map>` / `<Scene>`, and
|
|
@@ -31,7 +32,7 @@ export const FeatureLayer = forwardRef<FeatureLayerHandle, FeatureLayerProps>(
|
|
|
31
32
|
const layer = ref.current!;
|
|
32
33
|
model.addLayer(layer);
|
|
33
34
|
return () => {
|
|
34
|
-
model.removeLayer(layer);
|
|
35
|
+
detachQuietly(() => model.removeLayer(layer));
|
|
35
36
|
if (!isExternal.current) layer.release();
|
|
36
37
|
};
|
|
37
38
|
// eslint-disable-next-line react-hooks/exhaustive-deps
|
package/src/GeometryEditor.tsx
CHANGED
|
@@ -3,6 +3,7 @@ import { forwardRef, useEffect, useImperativeHandle, useRef } from 'react';
|
|
|
3
3
|
import type { GeometryEditorHandle, GeometryEditorProps } from './ExpoArcgis.types';
|
|
4
4
|
import ExpoArcgisModule, { type GeometryEditorRef } from './ExpoArcgisModule';
|
|
5
5
|
import { useGeoView } from './contexts';
|
|
6
|
+
import { detachQuietly } from './utils/detachQuietly';
|
|
6
7
|
|
|
7
8
|
/**
|
|
8
9
|
* Interactive geometry editor. Mirrors the native `GeometryEditor` โ place it inside a
|
|
@@ -25,7 +26,7 @@ export const GeometryEditor = forwardRef<GeometryEditorHandle, GeometryEditorPro
|
|
|
25
26
|
const editor = ref.current!;
|
|
26
27
|
view.setGeometryEditor(editor);
|
|
27
28
|
return () => {
|
|
28
|
-
view.setGeometryEditor(null);
|
|
29
|
+
detachQuietly(() => view.setGeometryEditor(null));
|
|
29
30
|
editor.release();
|
|
30
31
|
};
|
|
31
32
|
// eslint-disable-next-line react-hooks/exhaustive-deps
|
package/src/Graphic.tsx
CHANGED
|
@@ -6,6 +6,7 @@ import { useGraphicsOverlay } from './contexts';
|
|
|
6
6
|
import { usePrevious } from './hooks/usePrevious';
|
|
7
7
|
import { useUpdateEffect } from './hooks/useUpdateEffect';
|
|
8
8
|
import { getPropsDiffs } from './utils/getPropsDiffs';
|
|
9
|
+
import { detachQuietly } from './utils/detachQuietly';
|
|
9
10
|
|
|
10
11
|
/**
|
|
11
12
|
* Declarative point graphic. Draws itself on the nearest `<GraphicsOverlay>`. Forwards its native
|
|
@@ -26,7 +27,7 @@ export const Graphic = forwardRef<GraphicRef, GraphicProps>(function Graphic(pro
|
|
|
26
27
|
const graphic = ref.current!;
|
|
27
28
|
overlay.addGraphic(graphic);
|
|
28
29
|
return () => {
|
|
29
|
-
overlay.removeGraphic(graphic);
|
|
30
|
+
detachQuietly(() => overlay.removeGraphic(graphic));
|
|
30
31
|
graphic.release();
|
|
31
32
|
};
|
|
32
33
|
// eslint-disable-next-line react-hooks/exhaustive-deps
|
package/src/GraphicsOverlay.tsx
CHANGED
|
@@ -3,6 +3,7 @@ import { useEffect, useRef, type PropsWithChildren } from 'react';
|
|
|
3
3
|
import type { Renderer } from './ExpoArcgis.types';
|
|
4
4
|
import ExpoArcgisModule, { type GraphicsOverlayRef } from './ExpoArcgisModule';
|
|
5
5
|
import { GraphicsOverlayContext, useGeoView } from './contexts';
|
|
6
|
+
import { detachQuietly } from './utils/detachQuietly';
|
|
6
7
|
|
|
7
8
|
export type GraphicsOverlayProps = {
|
|
8
9
|
/** Renderer applied to graphics that set no `symbol` of their own. */
|
|
@@ -24,7 +25,7 @@ export function GraphicsOverlay({ renderer, children }: PropsWithChildren<Graphi
|
|
|
24
25
|
const overlay = ref.current!;
|
|
25
26
|
view.add(overlay);
|
|
26
27
|
return () => {
|
|
27
|
-
view.remove(overlay);
|
|
28
|
+
detachQuietly(() => view.remove(overlay));
|
|
28
29
|
overlay.release();
|
|
29
30
|
};
|
|
30
31
|
// eslint-disable-next-line react-hooks/exhaustive-deps
|
package/src/GroupLayer.tsx
CHANGED
|
@@ -7,6 +7,7 @@ import { GeoModelContext, useGeoModel } from './contexts';
|
|
|
7
7
|
import { usePrevious } from './hooks/usePrevious';
|
|
8
8
|
import { useUpdateEffect } from './hooks/useUpdateEffect';
|
|
9
9
|
import { getPropsDiffs } from './utils/getPropsDiffs';
|
|
10
|
+
import { detachQuietly } from './utils/detachQuietly';
|
|
10
11
|
|
|
11
12
|
/**
|
|
12
13
|
* Declarative `GroupLayer` โ a container that groups its child layers as a single unit on the
|
|
@@ -26,7 +27,7 @@ export function GroupLayer({ children, ...props }: PropsWithChildren<LayerProps>
|
|
|
26
27
|
const group = ref.current!;
|
|
27
28
|
model.addLayer(group);
|
|
28
29
|
return () => {
|
|
29
|
-
model.removeLayer(group);
|
|
30
|
+
detachQuietly(() => model.removeLayer(group));
|
|
30
31
|
group.release();
|
|
31
32
|
};
|
|
32
33
|
// eslint-disable-next-line react-hooks/exhaustive-deps
|
package/src/ImageOverlay.tsx
CHANGED
|
@@ -4,6 +4,7 @@ import type { ImageOverlayProps } from './ExpoArcgis.types';
|
|
|
4
4
|
import ExtrasModule from './ExpoArcgisExtrasModule';
|
|
5
5
|
import type { ImageOverlayRef } from './ExpoArcgisModule';
|
|
6
6
|
import { useGeoView } from './contexts';
|
|
7
|
+
import { detachQuietly } from './utils/detachQuietly';
|
|
7
8
|
|
|
8
9
|
/**
|
|
9
10
|
* Declarative image overlay. Displays a single georeferenced image (a local file) at a map extent on
|
|
@@ -21,7 +22,7 @@ export function ImageOverlay({ imagePath, extent, opacity }: ImageOverlayProps)
|
|
|
21
22
|
const overlay = ref.current!;
|
|
22
23
|
view.addImageOverlay(overlay);
|
|
23
24
|
return () => {
|
|
24
|
-
view.removeImageOverlay(overlay);
|
|
25
|
+
detachQuietly(() => view.removeImageOverlay(overlay));
|
|
25
26
|
overlay.release();
|
|
26
27
|
};
|
|
27
28
|
// eslint-disable-next-line react-hooks/exhaustive-deps
|
package/src/LineOfSight.tsx
CHANGED
|
@@ -10,6 +10,7 @@ import { useAnalysisOverlay } from './contexts';
|
|
|
10
10
|
import { usePrevious } from './hooks/usePrevious';
|
|
11
11
|
import { useUpdateEffect } from './hooks/useUpdateEffect';
|
|
12
12
|
import { getPropsDiffs } from './utils/getPropsDiffs';
|
|
13
|
+
import { detachQuietly } from './utils/detachQuietly';
|
|
13
14
|
|
|
14
15
|
/**
|
|
15
16
|
* Declarative exploratory line of sight between an observer and a target.
|
|
@@ -56,7 +57,7 @@ export function LineOfSight(
|
|
|
56
57
|
const analysis = analysisRef.current!;
|
|
57
58
|
overlay.addAnalysis(analysis);
|
|
58
59
|
return () => {
|
|
59
|
-
overlay.removeAnalysis(analysis);
|
|
60
|
+
detachQuietly(() => overlay.removeAnalysis(analysis));
|
|
60
61
|
analysis.release();
|
|
61
62
|
};
|
|
62
63
|
// eslint-disable-next-line react-hooks/exhaustive-deps
|
package/src/MapImageLayer.tsx
CHANGED
|
@@ -6,6 +6,7 @@ import { useGeoModel } from './contexts';
|
|
|
6
6
|
import { usePrevious } from './hooks/usePrevious';
|
|
7
7
|
import { useUpdateEffect } from './hooks/useUpdateEffect';
|
|
8
8
|
import { getPropsDiffs } from './utils/getPropsDiffs';
|
|
9
|
+
import { detachQuietly } from './utils/detachQuietly';
|
|
9
10
|
|
|
10
11
|
/** Declarative operational `ArcGISMapImageLayer`. Adds itself to the nearest `<Map>` / `<Scene>`. */
|
|
11
12
|
export function MapImageLayer(props: MapImageLayerProps) {
|
|
@@ -21,7 +22,7 @@ export function MapImageLayer(props: MapImageLayerProps) {
|
|
|
21
22
|
const layer = ref.current!;
|
|
22
23
|
model.addLayer(layer);
|
|
23
24
|
return () => {
|
|
24
|
-
model.removeLayer(layer);
|
|
25
|
+
detachQuietly(() => model.removeLayer(layer));
|
|
25
26
|
layer.release();
|
|
26
27
|
};
|
|
27
28
|
// eslint-disable-next-line react-hooks/exhaustive-deps
|
package/src/SceneLayer.tsx
CHANGED
|
@@ -6,6 +6,7 @@ import { useGeoModel } from './contexts';
|
|
|
6
6
|
import { usePrevious } from './hooks/usePrevious';
|
|
7
7
|
import { useUpdateEffect } from './hooks/useUpdateEffect';
|
|
8
8
|
import { getPropsDiffs } from './utils/getPropsDiffs';
|
|
9
|
+
import { detachQuietly } from './utils/detachQuietly';
|
|
9
10
|
|
|
10
11
|
/** Declarative operational `ArcGISSceneLayer` (3D). Adds itself to the nearest `<Scene>` / `<Map>`. */
|
|
11
12
|
export function SceneLayer(props: SceneLayerProps) {
|
|
@@ -21,7 +22,7 @@ export function SceneLayer(props: SceneLayerProps) {
|
|
|
21
22
|
const layer = ref.current!;
|
|
22
23
|
model.addLayer(layer);
|
|
23
24
|
return () => {
|
|
24
|
-
model.removeLayer(layer);
|
|
25
|
+
detachQuietly(() => model.removeLayer(layer));
|
|
25
26
|
layer.release();
|
|
26
27
|
};
|
|
27
28
|
// eslint-disable-next-line react-hooks/exhaustive-deps
|
package/src/TileLayer.tsx
CHANGED
|
@@ -6,6 +6,7 @@ import { useGeoModel } from './contexts';
|
|
|
6
6
|
import { usePrevious } from './hooks/usePrevious';
|
|
7
7
|
import { useUpdateEffect } from './hooks/useUpdateEffect';
|
|
8
8
|
import { getPropsDiffs } from './utils/getPropsDiffs';
|
|
9
|
+
import { detachQuietly } from './utils/detachQuietly';
|
|
9
10
|
|
|
10
11
|
/** Declarative operational `ArcGISTiledLayer`. Adds itself to the nearest `<Map>` / `<Scene>`. */
|
|
11
12
|
export function TileLayer(props: TileLayerProps) {
|
|
@@ -21,7 +22,7 @@ export function TileLayer(props: TileLayerProps) {
|
|
|
21
22
|
const layer = ref.current!;
|
|
22
23
|
model.addLayer(layer);
|
|
23
24
|
return () => {
|
|
24
|
-
model.removeLayer(layer);
|
|
25
|
+
detachQuietly(() => model.removeLayer(layer));
|
|
25
26
|
layer.release();
|
|
26
27
|
};
|
|
27
28
|
// eslint-disable-next-line react-hooks/exhaustive-deps
|
package/src/Viewshed.tsx
CHANGED
|
@@ -10,6 +10,7 @@ import { useAnalysisOverlay } from './contexts';
|
|
|
10
10
|
import { usePrevious } from './hooks/usePrevious';
|
|
11
11
|
import { useUpdateEffect } from './hooks/useUpdateEffect';
|
|
12
12
|
import { getPropsDiffs } from './utils/getPropsDiffs';
|
|
13
|
+
import { detachQuietly } from './utils/detachQuietly';
|
|
13
14
|
|
|
14
15
|
/**
|
|
15
16
|
* Declarative exploratory viewshed โ the area visible from an observer.
|
|
@@ -43,7 +44,7 @@ export function Viewshed(
|
|
|
43
44
|
const analysis = analysisRef.current!;
|
|
44
45
|
overlay.addAnalysis(analysis);
|
|
45
46
|
return () => {
|
|
46
|
-
overlay.removeAnalysis(analysis);
|
|
47
|
+
detachQuietly(() => overlay.removeAnalysis(analysis));
|
|
47
48
|
analysis.release();
|
|
48
49
|
};
|
|
49
50
|
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
@@ -5,6 +5,7 @@ import { useGeoModel } from './contexts';
|
|
|
5
5
|
import { usePrevious } from './hooks/usePrevious';
|
|
6
6
|
import { useUpdateEffect } from './hooks/useUpdateEffect';
|
|
7
7
|
import { getPropsDiffs } from './utils/getPropsDiffs';
|
|
8
|
+
import { detachQuietly } from './utils/detachQuietly';
|
|
8
9
|
|
|
9
10
|
/**
|
|
10
11
|
* Builds a declarative operational-layer component from a native `LayerRef` factory.
|
|
@@ -30,7 +31,7 @@ export function createLayerComponent<P extends object, H = unknown>(
|
|
|
30
31
|
const layer = ref.current!;
|
|
31
32
|
model.addLayer(layer);
|
|
32
33
|
return () => {
|
|
33
|
-
model.removeLayer(layer);
|
|
34
|
+
detachQuietly(() => model.removeLayer(layer));
|
|
34
35
|
layer.release();
|
|
35
36
|
};
|
|
36
37
|
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Runs a SharedObject *detach* call โ e.g. `overlay.removeGraphic(g)`, `model.removeLayer(l)`,
|
|
3
|
+
* `view.setGeometryEditor(null)` โ that may race with React's unmount ordering.
|
|
4
|
+
*
|
|
5
|
+
* When a subtree unmounts, React releases a parent SharedObject (the `<Map>` / `<MapView>` /
|
|
6
|
+
* `<GraphicsOverlay>` / `<AnalysisOverlay>` โฆ) before its children's effect cleanups run. The child
|
|
7
|
+
* then detaching itself from that already-released parent throws
|
|
8
|
+
* `NativeSharedObjectNotFoundException` (the native receiver/argument can no longer be resolved).
|
|
9
|
+
* That is benign at teardown โ there is nothing left to detach from โ so we swallow it. When only
|
|
10
|
+
* the child unmounts (the parent stays mounted), the detach runs normally and removes the child.
|
|
11
|
+
*
|
|
12
|
+
* The child still releases its *own* SharedObject afterwards: that object is owned by the child and
|
|
13
|
+
* is always alive at this point, so its `release()` is left unguarded.
|
|
14
|
+
*/
|
|
15
|
+
export function detachQuietly(detach: () => void): void {
|
|
16
|
+
try {
|
|
17
|
+
detach();
|
|
18
|
+
} catch {
|
|
19
|
+
// Parent SharedObject already released by its own unmount โ nothing to detach from.
|
|
20
|
+
}
|
|
21
|
+
}
|