@reearth/core 0.0.7-alpha.13 → 0.0.7-alpha.15

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (39) hide show
  1. package/dist/core.js +6864 -5606
  2. package/dist/core.umd.cjs +71 -71
  3. package/dist/index.d.ts +56 -13
  4. package/package.json +8 -5
  5. package/src/Map/Layer/hooks.ts +6 -3
  6. package/src/Map/Layer/index.tsx +2 -0
  7. package/src/Map/Layers/hooks.ts +17 -0
  8. package/src/Map/Layers/index.tsx +12 -1
  9. package/src/Map/Layers/keys.ts +1 -0
  10. package/src/Map/Sketch/hooks.ts +405 -399
  11. package/src/Map/Sketch/index.tsx +65 -18
  12. package/src/Map/Sketch/sketchMachine.ts +359 -4
  13. package/src/Map/Sketch/sketchMachine.typegen.ts +58 -1
  14. package/src/Map/Sketch/types.ts +10 -20
  15. package/src/Map/Sketch/usePluginSketchLayer.ts +105 -0
  16. package/src/Map/Sketch/useSketch.ts +559 -0
  17. package/src/Map/Sketch/useSketchFeature.ts +198 -0
  18. package/src/Map/hooks.ts +32 -1
  19. package/src/Map/index.tsx +24 -0
  20. package/src/Map/ref.ts +8 -0
  21. package/src/Map/types/index.ts +21 -1
  22. package/src/Map/types/viewerProperty.ts +2 -0
  23. package/src/Visualizer/coreContext.tsx +2 -0
  24. package/src/Visualizer/hooks.ts +25 -0
  25. package/src/Visualizer/index.tsx +13 -0
  26. package/src/engines/Cesium/Feature/index.tsx +6 -2
  27. package/src/engines/Cesium/Sketch/ControlPoint.tsx +128 -24
  28. package/src/engines/Cesium/Sketch/ExtrudedControlPoints.tsx +70 -25
  29. package/src/engines/Cesium/Sketch/ExtrudedMeasurement.tsx +3 -1
  30. package/src/engines/Cesium/Sketch/ExtrudedPolygonEntity.tsx +14 -14
  31. package/src/engines/Cesium/Sketch/PolylineEntity.tsx +7 -4
  32. package/src/engines/Cesium/Sketch/SurfaceAddingPoints.tsx +60 -0
  33. package/src/engines/Cesium/Sketch/SurfaceControlPoints.tsx +125 -35
  34. package/src/engines/Cesium/Sketch/constants.ts +5 -0
  35. package/src/engines/Cesium/Sketch/index.tsx +68 -29
  36. package/src/engines/Cesium/core/labels/JapanGSIOptimalBVmapVectorMapLabel/JapanGSIOptimalBVmapLabelImagery.tsx +8 -1
  37. package/src/engines/Cesium/core/labels/JapanGSIOptimalBVmapVectorMapLabel/JapanGSIOptimalBVmapVectorMapLabel.tsx +14 -2
  38. package/src/engines/Cesium/core/labels/LabelImageryLayers.tsx +10 -1
  39. package/src/engines/Cesium/hooks/useEngineRef.ts +36 -0
@@ -0,0 +1,198 @@
1
+ import { Dispatch, RefObject, SetStateAction, useCallback } from "react";
2
+
3
+ import { LazyLayer } from "../Layers";
4
+ import { LayersRef } from "../types";
5
+
6
+ import { SketchEventProps, SketchFeature, SketchOptions, SketchType } from "./types";
7
+
8
+ import { OnLayerSelectType } from ".";
9
+
10
+ type Props = {
11
+ sketchOptions: SketchOptions;
12
+ from: "editor" | "plugin";
13
+ updateType: Dispatch<SetStateAction<SketchType | undefined>>;
14
+ layersRef: RefObject<LayersRef>;
15
+ pluginSketchLayerCreate: (feature: SketchFeature) => {
16
+ layerId: string | undefined;
17
+ featureId: string;
18
+ };
19
+ pluginSketchLayerFeatureAdd: (
20
+ layer: LazyLayer,
21
+ feature: SketchFeature,
22
+ ) =>
23
+ | {
24
+ layerId?: undefined;
25
+ featureId?: undefined;
26
+ }
27
+ | {
28
+ layerId: string;
29
+ featureId: string;
30
+ };
31
+ pluginSketchLayerFeatureUpdate: (
32
+ layer: LazyLayer,
33
+ feature: SketchFeature,
34
+ ) =>
35
+ | {
36
+ layerId?: undefined;
37
+ featureId?: undefined;
38
+ }
39
+ | {
40
+ layerId: string;
41
+ featureId: string;
42
+ };
43
+ pluginSketchLayerFeatureRemove: (layer: LazyLayer, featureId: string) => void;
44
+ onSketchFeatureCreate?: (feature: SketchFeature | null) => void;
45
+ onSketchFeatureUpdate?: (feature: SketchFeature) => void;
46
+ onSketchFeatureDelete?: (layerId: string, featureId: string) => void;
47
+ onSketchPluginFeatureCreate?: (props: SketchEventProps) => void;
48
+ onSketchPluginFeatureUpdate?: (props: SketchEventProps) => void;
49
+ onSketchPluginFeatureDelete?: (props: { layerId: string; featureId: string }) => void;
50
+ onLayerSelect?: OnLayerSelectType;
51
+ };
52
+
53
+ export default ({
54
+ sketchOptions,
55
+ from,
56
+ updateType,
57
+ layersRef,
58
+ onSketchFeatureCreate,
59
+ pluginSketchLayerCreate,
60
+ pluginSketchLayerFeatureAdd,
61
+ pluginSketchLayerFeatureUpdate,
62
+ pluginSketchLayerFeatureRemove,
63
+ onSketchPluginFeatureCreate,
64
+ onSketchPluginFeatureUpdate,
65
+ onSketchPluginFeatureDelete,
66
+ onSketchFeatureUpdate,
67
+ onSketchFeatureDelete,
68
+ onLayerSelect,
69
+ }: Props) => {
70
+ const handleFeatureCreate = useCallback(
71
+ (feature: SketchFeature) => {
72
+ if (sketchOptions.autoResetInteractionMode) {
73
+ updateType(undefined);
74
+ }
75
+
76
+ if (from === "editor" && sketchOptions.dataOnly) {
77
+ onSketchFeatureCreate?.(feature);
78
+ return;
79
+ }
80
+
81
+ if (!sketchOptions.dataOnly) {
82
+ const selectedLayer = layersRef.current?.selectedLayer();
83
+ const { layerId, featureId } =
84
+ !layersRef?.current?.isTempLayer(selectedLayer?.id) ||
85
+ selectedLayer?.type !== "simple" ||
86
+ selectedLayer.computed?.layer.type !== "simple"
87
+ ? pluginSketchLayerCreate(feature)
88
+ : pluginSketchLayerFeatureAdd(selectedLayer, feature);
89
+
90
+ if (layerId && featureId) {
91
+ requestAnimationFrame(() => {
92
+ onLayerSelect?.(
93
+ layerId,
94
+ featureId,
95
+ layerId
96
+ ? () =>
97
+ new Promise(resolve => {
98
+ // Wait until computed feature is ready
99
+ queueMicrotask(() => {
100
+ resolve(layersRef.current?.findById?.(layerId)?.computed);
101
+ });
102
+ })
103
+ : undefined,
104
+ undefined,
105
+ undefined,
106
+ );
107
+ });
108
+
109
+ onSketchPluginFeatureCreate?.({ layerId, featureId, feature });
110
+ }
111
+ } else {
112
+ onSketchPluginFeatureCreate?.({ feature });
113
+ }
114
+ },
115
+ [
116
+ layersRef,
117
+ from,
118
+ sketchOptions.dataOnly,
119
+ sketchOptions.autoResetInteractionMode,
120
+ pluginSketchLayerCreate,
121
+ pluginSketchLayerFeatureAdd,
122
+ onSketchFeatureCreate,
123
+ onSketchPluginFeatureCreate,
124
+ onLayerSelect,
125
+ updateType,
126
+ ],
127
+ );
128
+
129
+ const handleFeatureUpdate = useCallback(
130
+ (feature: SketchFeature) => {
131
+ if (from === "editor" && sketchOptions.dataOnly) {
132
+ onSketchFeatureUpdate?.(feature);
133
+ return;
134
+ }
135
+
136
+ if (!sketchOptions.dataOnly) {
137
+ const selectedLayer = layersRef.current?.selectedLayer();
138
+ if (!selectedLayer) return;
139
+
140
+ const { layerId, featureId } = pluginSketchLayerFeatureUpdate(selectedLayer, feature);
141
+
142
+ if (layerId && featureId) {
143
+ setTimeout(() => {
144
+ layersRef.current?.selectFeatures([
145
+ {
146
+ layerId,
147
+ featureId: [featureId],
148
+ },
149
+ ]);
150
+ }, 20);
151
+
152
+ onSketchPluginFeatureUpdate?.({ layerId, featureId, feature });
153
+ }
154
+ } else {
155
+ onSketchPluginFeatureUpdate?.({ feature });
156
+ }
157
+ },
158
+ [
159
+ from,
160
+ sketchOptions.dataOnly,
161
+ layersRef,
162
+ pluginSketchLayerFeatureUpdate,
163
+ onSketchFeatureUpdate,
164
+ onSketchPluginFeatureUpdate,
165
+ ],
166
+ );
167
+
168
+ const handleFeatureDelete = useCallback(
169
+ (layerId: string, featureId: string) => {
170
+ if (from === "editor" && sketchOptions.dataOnly) {
171
+ onSketchFeatureDelete?.(layerId, featureId);
172
+ return;
173
+ }
174
+
175
+ if (!sketchOptions.dataOnly) {
176
+ const layer = layersRef.current?.findById(layerId);
177
+ if (!layer) return;
178
+ pluginSketchLayerFeatureRemove(layer, featureId);
179
+ layersRef.current?.selectFeatures([]);
180
+ }
181
+ onSketchPluginFeatureDelete?.({ layerId, featureId });
182
+ },
183
+ [
184
+ from,
185
+ sketchOptions.dataOnly,
186
+ layersRef,
187
+ pluginSketchLayerFeatureRemove,
188
+ onSketchFeatureDelete,
189
+ onSketchPluginFeatureDelete,
190
+ ],
191
+ );
192
+
193
+ return {
194
+ handleFeatureCreate,
195
+ handleFeatureUpdate,
196
+ handleFeatureDelete,
197
+ };
198
+ };
package/src/Map/hooks.ts CHANGED
@@ -13,7 +13,7 @@ import type {
13
13
  } from "./types";
14
14
  import useTimelineManager, { TimelineManagerRef } from "./useTimelineManager";
15
15
 
16
- import { CursorType } from ".";
16
+ import { CursorType, SketchEditingFeature } from ".";
17
17
 
18
18
  export type { MapRef } from "./ref";
19
19
 
@@ -26,6 +26,8 @@ export default function ({
26
26
  timelineManagerRef,
27
27
  cursor,
28
28
  onLayerSelect,
29
+ onMount,
30
+ onAPIReady,
29
31
  }: {
30
32
  ref: Ref<MapRef>;
31
33
  timelineManagerRef?: TimelineManagerRef;
@@ -37,7 +39,10 @@ export default function ({
37
39
  options?: LayerSelectionReason,
38
40
  info?: SelectedFeatureInfo,
39
41
  ) => void;
42
+ onMount?: () => void;
43
+ onAPIReady?: () => void;
40
44
  }) {
45
+ const [mapAPIReady, setMapAPIReady] = useState({ engine: false, layers: false, sketch: false });
41
46
  const engineRef = useRef<EngineRef>(null);
42
47
  const layersRef = useRef<LayersRef>(null);
43
48
  const sketchRef = useRef<SketchRef>(null);
@@ -55,6 +60,12 @@ export default function ({
55
60
  [timelineManagerRef],
56
61
  );
57
62
 
63
+ useEffect(() => {
64
+ if (onAPIReady && mapAPIReady.engine && mapAPIReady.layers && mapAPIReady.sketch) {
65
+ onAPIReady?.();
66
+ }
67
+ }, [onAPIReady, mapAPIReady]);
68
+
58
69
  // selectLayer logic
59
70
  // 1. Map/hooks(here) is the source
60
71
  // 1.2 State updates propagate up, through onLayerSelect, to update
@@ -111,6 +122,21 @@ export default function ({
111
122
  }
112
123
  }, [cursor]);
113
124
 
125
+ const [sketchEditingFeature, setSketchEditingFeature] = useState<
126
+ SketchEditingFeature | undefined
127
+ >();
128
+
129
+ const handleEngineMount = useCallback(() => {
130
+ setMapAPIReady(s => ({ ...s, engine: true }));
131
+ onMount?.();
132
+ }, [onMount]);
133
+ const handleLayersMount = useCallback(() => {
134
+ setMapAPIReady(s => ({ ...s, layers: true }));
135
+ }, []);
136
+ const handleSketchMount = useCallback(() => {
137
+ setMapAPIReady(s => ({ ...s, sketch: true }));
138
+ }, []);
139
+
114
140
  return {
115
141
  engineRef,
116
142
  layersRef,
@@ -119,5 +145,10 @@ export default function ({
119
145
  requestingRenderMode,
120
146
  handleLayerSelect,
121
147
  handleEngineLayerSelect,
148
+ sketchEditingFeature,
149
+ setSketchEditingFeature,
150
+ handleEngineMount,
151
+ handleLayersMount,
152
+ handleSketchMount,
122
153
  };
123
154
  }
package/src/Map/index.tsx CHANGED
@@ -34,6 +34,7 @@ export type CursorType = "auto" | "grab" | "crosshair";
34
34
  export type Props = {
35
35
  engines?: Record<string, Engine>;
36
36
  engine?: string;
37
+ onAPIReady?: () => void;
37
38
  } & Omit<
38
39
  LayersProps,
39
40
  | "Feature"
@@ -67,7 +68,13 @@ function MapFn(
67
68
  onSketchTypeChange,
68
69
  onSketchFeatureCreate,
69
70
  onSketchPluginFeatureCreate,
71
+ onSketchFeatureUpdate,
72
+ onSketchPluginFeatureUpdate,
73
+ onSketchFeatureDelete,
74
+ onSketchPluginFeatureDelete,
70
75
  featureFlags = INTERACTION_MODES.default,
76
+ onMount,
77
+ onAPIReady,
71
78
  ...props
72
79
  }: Props,
73
80
  ref: Ref<MapRef>,
@@ -82,11 +89,18 @@ function MapFn(
82
89
  requestingRenderMode,
83
90
  handleLayerSelect,
84
91
  handleEngineLayerSelect,
92
+ sketchEditingFeature,
93
+ setSketchEditingFeature,
94
+ handleEngineMount,
95
+ handleLayersMount,
96
+ handleSketchMount,
85
97
  } = useHooks({
86
98
  ref,
87
99
  timelineManagerRef,
88
100
  cursor,
89
101
  onLayerSelect,
102
+ onMount,
103
+ onAPIReady,
90
104
  });
91
105
 
92
106
  const selectedLayerIds = useMemo(
@@ -111,6 +125,7 @@ function MapFn(
111
125
  timelineManagerRef={timelineManagerRef}
112
126
  onLayerSelect={handleEngineLayerSelect}
113
127
  featureFlags={featureFlags}
128
+ onMount={handleEngineMount}
114
129
  {...props}>
115
130
  <Layers
116
131
  ref={layersRef}
@@ -128,7 +143,9 @@ function MapFn(
128
143
  meta={props.meta}
129
144
  viewerProperty={props.property}
130
145
  requestingRenderMode={requestingRenderMode}
146
+ sketchEditingFeature={sketchEditingFeature}
131
147
  onLayerSelect={handleLayerSelect}
148
+ onMount={handleLayersMount}
132
149
  />
133
150
  <Sketch
134
151
  ref={sketchRef}
@@ -142,6 +159,13 @@ function MapFn(
142
159
  onSketchTypeChange={onSketchTypeChange}
143
160
  onSketchFeatureCreate={onSketchFeatureCreate}
144
161
  onSketchPluginFeatureCreate={onSketchPluginFeatureCreate}
162
+ onSketchFeatureUpdate={onSketchFeatureUpdate}
163
+ onSketchPluginFeatureUpdate={onSketchPluginFeatureUpdate}
164
+ onSketchFeatureDelete={onSketchFeatureDelete}
165
+ onSketchPluginFeatureDelete={onSketchPluginFeatureDelete}
166
+ sketchEditingFeature={sketchEditingFeature}
167
+ onSketchEditFeature={setSketchEditingFeature}
168
+ onMount={handleSketchMount}
145
169
  />
146
170
  </Engine>
147
171
  ) : null;
package/src/Map/ref.ts CHANGED
@@ -82,6 +82,7 @@ const engineRefKeys: FunctionKeys<EngineRef> = {
82
82
  unselectFeatures: 1,
83
83
  pickManyFromViewport: 1,
84
84
  getExtrudedHeight: 1,
85
+ getExtrudedPoint: 1,
85
86
  getSurfaceDistance: 1,
86
87
  equalsEpsilon2d: 1,
87
88
  equalsEpsilon3d: 1,
@@ -89,6 +90,7 @@ const engineRefKeys: FunctionKeys<EngineRef> = {
89
90
  setCursor: 1,
90
91
  bringToFront: 1,
91
92
  sendToBack: 1,
93
+ calcRectangleControlPoint: 1,
92
94
  };
93
95
 
94
96
  const layersRefKeys: FunctionKeys<LayersRef> = {
@@ -104,6 +106,7 @@ const layersRefKeys: FunctionKeys<LayersRef> = {
104
106
  hide: 1,
105
107
  isLayer: 1,
106
108
  isComputedLayer: 1,
109
+ isTempLayer: 1,
107
110
  layers: 1,
108
111
  override: 1,
109
112
  replace: 1,
@@ -122,6 +125,11 @@ const sketchRefKeys: FunctionKeys<SketchRef> = {
122
125
  setType: 1,
123
126
  getOptions: 1,
124
127
  overrideOptions: 1,
128
+ editFeature: 1,
129
+ applyEdit: 1,
130
+ cancelEdit: 1,
131
+ deleteFeature: 1,
132
+ onEditFeatureChange: 1,
125
133
  };
126
134
 
127
135
  export function mapRef({
@@ -38,7 +38,13 @@ import type {
38
38
  LayerSelectionReason,
39
39
  Ref as LayersRef,
40
40
  } from "../Layers";
41
- import { SketchType, SketchOptions, SketchComponentType } from "../Sketch/types";
41
+ import {
42
+ SketchType,
43
+ SketchOptions,
44
+ SketchComponentType,
45
+ SketchEditFeatureChangeCb,
46
+ SketchEditingFeature,
47
+ } from "../Sketch/types";
42
48
  import type { TimelineManagerRef } from "../useTimelineManager";
43
49
 
44
50
  import type { SceneMode, ViewerProperty } from "./viewerProperty";
@@ -114,6 +120,10 @@ export type EngineRef = {
114
120
  position: [x: number, y: number, z: number],
115
121
  windowPosition: [x: number, y: number],
116
122
  ) => number | undefined;
123
+ getExtrudedPoint: (
124
+ position: [x: number, y: number, z: number],
125
+ extrutedHeight: number,
126
+ ) => Position3d | undefined;
117
127
  getSurfaceDistance: (point1: Cartesian3, point2: Cartesian3) => number | undefined;
118
128
  equalsEpsilon2d: (
119
129
  point1: Position2d,
@@ -196,6 +206,11 @@ export type EngineRef = {
196
206
  // TODO: Get condition as expression for plugin
197
207
  condition?: (f: PickedFeature) => boolean,
198
208
  ) => PickedFeature[] | undefined;
209
+ calcRectangleControlPoint: (
210
+ p1: Position3d,
211
+ p2: Position3d,
212
+ p3: Position3d,
213
+ ) => [p1: Position3d, p2: Position3d, p3: Position3d];
199
214
  } & MouseEventHandles;
200
215
 
201
216
  export type EngineProps = {
@@ -360,4 +375,9 @@ export type SketchRef = {
360
375
  setType: (type: SketchType | undefined, from?: "editor" | "plugin") => void;
361
376
  getOptions: () => SketchOptions;
362
377
  overrideOptions: (options: SketchOptions) => void;
378
+ editFeature: (feature: SketchEditingFeature | undefined) => void;
379
+ cancelEdit: (ignoreAutoReSelect?: boolean) => void;
380
+ applyEdit: () => void;
381
+ deleteFeature: (layerId: string, featureId: string) => void;
382
+ onEditFeatureChange: (cb: SketchEditFeatureChangeCb) => void;
363
383
  };
@@ -132,6 +132,8 @@ export type TileLabelProperty = {
132
132
  id: string;
133
133
  labelType: "japan_gsi_optimal_bvmap";
134
134
  style: Record<string, any>;
135
+ near?: number;
136
+ far?: number;
135
137
  };
136
138
 
137
139
  export type SkyProperty = {
@@ -26,6 +26,8 @@ type CoreContext = {
26
26
  handleCameraForceHorizontalRollChange?: (enable?: boolean) => void;
27
27
  handleInteractionModeChange?: (mode?: InteractionModeType | undefined) => void;
28
28
  onSketchPluginFeatureCreate?: (cb: SketchEventCallback) => void;
29
+ onSketchPluginFeatureUpdate?: (cb: SketchEventCallback) => void;
30
+ onSketchPluginFeatureDelete?: (cb: SketchEventCallback) => void;
29
31
  onSketchTypeChange?: (cb: (type: SketchType | undefined) => void) => void;
30
32
  onLayerVisibility?: (cb: (e: LayerVisibilityEvent) => void) => void;
31
33
  onLayerLoad?: (cb: (e: LayerLoadEvent) => void) => void;
@@ -206,6 +206,25 @@ export default function useHooks(
206
206
  onSketchPluginFeatureCreateCallbacksRef.current.forEach(fn => fn(props));
207
207
  }, []);
208
208
 
209
+ const onSketchPluginFeatureUpdateCallbacksRef = useRef<SketchEventCallback[]>([]);
210
+ const onSketchPluginFeatureUpdate = useCallback((cb: SketchEventCallback) => {
211
+ onSketchPluginFeatureUpdateCallbacksRef.current.push(cb);
212
+ }, []);
213
+ const handleSketchPluginFeatureUpdate = useCallback((props: SketchEventProps) => {
214
+ onSketchPluginFeatureUpdateCallbacksRef.current.forEach(fn => fn(props));
215
+ }, []);
216
+
217
+ const onSketchPluginFeatureDeleteCallbacksRef = useRef<SketchEventCallback[]>([]);
218
+ const onSketchPluginFeatureDelete = useCallback((cb: SketchEventCallback) => {
219
+ onSketchPluginFeatureDeleteCallbacksRef.current.push(cb);
220
+ }, []);
221
+ const handleSketchPluginFeatureDelete = useCallback(
222
+ (props: { layerId: string; featureId: string }) => {
223
+ onSketchPluginFeatureDeleteCallbacksRef.current.forEach(fn => fn(props));
224
+ },
225
+ [],
226
+ );
227
+
209
228
  const onSketchTypeChangeCallbacksRef = useRef<((type: SketchType | undefined) => void)[]>([]);
210
229
  const onSketchTypeChange = useCallback((cb: (type: SketchType | undefined) => void) => {
211
230
  onSketchTypeChangeCallbacksRef.current.push(cb);
@@ -256,6 +275,8 @@ export default function useHooks(
256
275
  handleCameraForceHorizontalRollChange,
257
276
  handleInteractionModeChange: changeInteractionMode,
258
277
  onSketchPluginFeatureCreate,
278
+ onSketchPluginFeatureUpdate,
279
+ onSketchPluginFeatureDelete,
259
280
  onSketchTypeChange,
260
281
  onLayerVisibility,
261
282
  onLayerLoad,
@@ -273,6 +294,8 @@ export default function useHooks(
273
294
  handleCameraForceHorizontalRollChange,
274
295
  onLayerEdit,
275
296
  onSketchPluginFeatureCreate,
297
+ onSketchPluginFeatureUpdate,
298
+ onSketchPluginFeatureDelete,
276
299
  onSketchTypeChange,
277
300
  onLayerVisibility,
278
301
  onLayerLoad,
@@ -313,6 +336,8 @@ export default function useHooks(
313
336
  handleCameraChange: changeCamera,
314
337
  handleInteractionModeChange: changeInteractionMode,
315
338
  handleSketchPluginFeatureCreate,
339
+ handleSketchPluginFeatureUpdate,
340
+ handleSketchPluginFeatureDelete,
316
341
  handleSketchTypeChange,
317
342
  handleLayerVisibility,
318
343
  handleLayerLoad,
@@ -58,7 +58,10 @@ export type CoreVisualizerProps = {
58
58
  onMount?: () => void;
59
59
  onSketchTypeChangeProp?: (type: SketchType | undefined) => void;
60
60
  onSketchFeatureCreate?: (feature: SketchFeature | null) => void;
61
+ onSketchFeatureUpdate?: (feature: SketchFeature | null) => void;
62
+ onSketchFeatureDelete?: (layerId: string, featureId: string) => void;
61
63
  onInteractionModeChange?: (mode: InteractionModeType) => void;
64
+ onAPIReady?: () => void;
62
65
  };
63
66
 
64
67
  export const CoreVisualizer = memo(
@@ -90,6 +93,9 @@ export const CoreVisualizer = memo(
90
93
  onMount,
91
94
  onSketchTypeChangeProp,
92
95
  onSketchFeatureCreate,
96
+ onSketchFeatureUpdate,
97
+ onSketchFeatureDelete,
98
+ onAPIReady,
93
99
  },
94
100
  ref: Ref<MapRef | null>,
95
101
  ) => {
@@ -112,6 +118,8 @@ export const CoreVisualizer = memo(
112
118
  handleCameraChange,
113
119
  handleInteractionModeChange,
114
120
  handleSketchPluginFeatureCreate,
121
+ handleSketchPluginFeatureUpdate,
122
+ handleSketchPluginFeatureDelete,
115
123
  handleSketchTypeChange,
116
124
  handleLayerVisibility,
117
125
  handleLayerLoad,
@@ -171,6 +179,10 @@ export const CoreVisualizer = memo(
171
179
  overrideInteractionMode={handleInteractionModeChange}
172
180
  onSketchFeatureCreate={onSketchFeatureCreate}
173
181
  onSketchPluginFeatureCreate={handleSketchPluginFeatureCreate}
182
+ onSketchFeatureUpdate={onSketchFeatureUpdate}
183
+ onSketchPluginFeatureUpdate={handleSketchPluginFeatureUpdate}
184
+ onSketchFeatureDelete={onSketchFeatureDelete}
185
+ onSketchPluginFeatureDelete={handleSketchPluginFeatureDelete}
174
186
  onSketchTypeChange={handleSketchTypeChange}
175
187
  onMount={onMount}
176
188
  onLayerVisibility={handleLayerVisibility}
@@ -178,6 +190,7 @@ export const CoreVisualizer = memo(
178
190
  onLayerSelectWithRectStart={handleLayerSelectWithRectStart}
179
191
  onLayerSelectWithRectMove={handleLayerSelectWithRectMove}
180
192
  onLayerSelectWithRectEnd={handleLayerSelectWithRectEnd}
193
+ onAPIReady={onAPIReady}
181
194
  />
182
195
  <coreContext.Provider value={coreContextValue}>{children}</coreContext.Provider>
183
196
  </div>
@@ -96,6 +96,7 @@ const FEATURE_DELEGATE_THRESHOLD = 6000;
96
96
  export default function Feature({
97
97
  layer,
98
98
  isHidden,
99
+ sketchEditingFeature,
99
100
  ...props
100
101
  }: FeatureComponentProps): JSX.Element | null {
101
102
  const data = extractSimpleLayerData(layer);
@@ -131,7 +132,10 @@ export default function Feature({
131
132
  const useSceneSpecularEnvironmentMaps =
132
133
  !!props.viewerProperty?.scene?.imageBasedLighting?.specularEnvironmentMaps;
133
134
 
134
- const isVisible = layer.layer.visible !== false && !isHidden;
135
+ const isVisible =
136
+ layer.layer.visible !== false &&
137
+ !isHidden &&
138
+ !(sketchEditingFeature?.layerId === layer.id && sketchEditingFeature?.feature?.id === f?.id);
135
139
 
136
140
  const componentId =
137
141
  urlMD5 +
@@ -140,7 +144,7 @@ export default function Feature({
140
144
  f?.id ?? ""
141
145
  }_${k}_${isVisible}_${useSceneSphericalHarmonicCoefficients}_${useSceneSpecularEnvironmentMaps}_${
142
146
  JSON.stringify(f?.[k]) ?? ""
143
- }_${JSON.stringify(layer.transition) ?? ""}`,
147
+ }_${JSON.stringify(layer.transition) ?? ""}_${JSON.stringify(f?.geometry) ?? ""}`,
144
148
  );
145
149
 
146
150
  if (cacheable) {