@reearth/core 0.0.7-alpha.14 → 0.0.7-alpha.16

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 (40) hide show
  1. package/dist/core.js +7164 -5873
  2. package/dist/core.umd.cjs +71 -71
  3. package/dist/index.d.ts +62 -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 +27 -1
  22. package/src/Visualizer/coreContext.tsx +2 -0
  23. package/src/Visualizer/hooks.ts +25 -0
  24. package/src/Visualizer/index.tsx +20 -0
  25. package/src/engines/Cesium/Feature/index.tsx +6 -2
  26. package/src/engines/Cesium/Sketch/ControlPoint.tsx +128 -24
  27. package/src/engines/Cesium/Sketch/ExtrudedControlPoints.tsx +70 -25
  28. package/src/engines/Cesium/Sketch/ExtrudedMeasurement.tsx +3 -1
  29. package/src/engines/Cesium/Sketch/ExtrudedPolygonEntity.tsx +14 -14
  30. package/src/engines/Cesium/Sketch/PolylineEntity.tsx +7 -4
  31. package/src/engines/Cesium/Sketch/SurfaceAddingPoints.tsx +60 -0
  32. package/src/engines/Cesium/Sketch/SurfaceControlPoints.tsx +125 -35
  33. package/src/engines/Cesium/Sketch/constants.ts +5 -0
  34. package/src/engines/Cesium/Sketch/index.tsx +68 -29
  35. package/src/engines/Cesium/core/Globe.tsx +11 -2
  36. package/src/engines/Cesium/core/Imagery.tsx +7 -2
  37. package/src/engines/Cesium/core/presets.ts +0 -11
  38. package/src/engines/Cesium/hooks/useEngineRef.ts +36 -0
  39. package/src/engines/Cesium/hooks.ts +50 -0
  40. package/src/engines/Cesium/index.tsx +16 -3
@@ -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 = {
@@ -220,6 +235,7 @@ export type EngineProps = {
220
235
  isLayerDragging?: boolean;
221
236
  shouldRender?: boolean;
222
237
  meta?: Record<string, unknown>;
238
+ displayCredits?: boolean;
223
239
  layersRef?: RefObject<LayersRef>;
224
240
  requestingRenderMode?: MutableRefObject<RequestingRenderMode>;
225
241
  timelineManagerRef?: TimelineManagerRef;
@@ -243,6 +259,7 @@ export type EngineProps = {
243
259
  onLayerSelectWithRectStart?: (e: LayerSelectWithRectStart) => void;
244
260
  onLayerSelectWithRectMove?: (e: LayerSelectWithRectMove) => void;
245
261
  onLayerSelectWithRectEnd?: (e: LayerSelectWithRectEnd) => void;
262
+ onCreditsUpdate?: (credits: Credit[]) => void;
246
263
  };
247
264
 
248
265
  export type LayerEditEvent = {
@@ -360,4 +377,13 @@ export type SketchRef = {
360
377
  setType: (type: SketchType | undefined, from?: "editor" | "plugin") => void;
361
378
  getOptions: () => SketchOptions;
362
379
  overrideOptions: (options: SketchOptions) => void;
380
+ editFeature: (feature: SketchEditingFeature | undefined) => void;
381
+ cancelEdit: (ignoreAutoReSelect?: boolean) => void;
382
+ applyEdit: () => void;
383
+ deleteFeature: (layerId: string, featureId: string) => void;
384
+ onEditFeatureChange: (cb: SketchEditFeatureChangeCb) => void;
385
+ };
386
+
387
+ export type Credit = {
388
+ html?: string;
363
389
  };
@@ -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,
@@ -12,6 +12,7 @@ import {
12
12
  type LatLng,
13
13
  type Cluster,
14
14
  type ComputedLayer,
15
+ type Credit,
15
16
  } from "../Map";
16
17
  import { SketchFeature, SketchType } from "../Map/Sketch/types";
17
18
 
@@ -46,6 +47,7 @@ export type CoreVisualizerProps = {
46
47
  ready?: boolean;
47
48
  hiddenLayers?: string[];
48
49
  zoomedLayerId?: string;
50
+ displayCredits?: boolean;
49
51
  onCameraChange?: (camera: Camera) => void;
50
52
  onLayerDrop?: (layerId: string, propertyKey: string, position: LatLng | undefined) => void;
51
53
  onLayerSelect?: (
@@ -58,7 +60,11 @@ export type CoreVisualizerProps = {
58
60
  onMount?: () => void;
59
61
  onSketchTypeChangeProp?: (type: SketchType | undefined) => void;
60
62
  onSketchFeatureCreate?: (feature: SketchFeature | null) => void;
63
+ onSketchFeatureUpdate?: (feature: SketchFeature | null) => void;
64
+ onSketchFeatureDelete?: (layerId: string, featureId: string) => void;
61
65
  onInteractionModeChange?: (mode: InteractionModeType) => void;
66
+ onAPIReady?: () => void;
67
+ onCreditsUpdate?: (credits: Credit[]) => void;
62
68
  };
63
69
 
64
70
  export const CoreVisualizer = memo(
@@ -79,6 +85,7 @@ export const CoreVisualizer = memo(
79
85
  interactionMode,
80
86
  shouldRender,
81
87
  meta,
88
+ displayCredits = true,
82
89
  style,
83
90
  zoomedLayerId,
84
91
  children,
@@ -90,6 +97,10 @@ export const CoreVisualizer = memo(
90
97
  onMount,
91
98
  onSketchTypeChangeProp,
92
99
  onSketchFeatureCreate,
100
+ onSketchFeatureUpdate,
101
+ onSketchFeatureDelete,
102
+ onAPIReady,
103
+ onCreditsUpdate,
93
104
  },
94
105
  ref: Ref<MapRef | null>,
95
106
  ) => {
@@ -112,6 +123,8 @@ export const CoreVisualizer = memo(
112
123
  handleCameraChange,
113
124
  handleInteractionModeChange,
114
125
  handleSketchPluginFeatureCreate,
126
+ handleSketchPluginFeatureUpdate,
127
+ handleSketchPluginFeatureDelete,
115
128
  handleSketchTypeChange,
116
129
  handleLayerVisibility,
117
130
  handleLayerLoad,
@@ -152,6 +165,7 @@ export const CoreVisualizer = memo(
152
165
  isLayerDragging={isLayerDragging}
153
166
  isLayerDraggable={isEditable}
154
167
  meta={meta}
168
+ displayCredits={displayCredits}
155
169
  style={style}
156
170
  featureFlags={featureFlags}
157
171
  shouldRender={shouldRender}
@@ -171,6 +185,10 @@ export const CoreVisualizer = memo(
171
185
  overrideInteractionMode={handleInteractionModeChange}
172
186
  onSketchFeatureCreate={onSketchFeatureCreate}
173
187
  onSketchPluginFeatureCreate={handleSketchPluginFeatureCreate}
188
+ onSketchFeatureUpdate={onSketchFeatureUpdate}
189
+ onSketchPluginFeatureUpdate={handleSketchPluginFeatureUpdate}
190
+ onSketchFeatureDelete={onSketchFeatureDelete}
191
+ onSketchPluginFeatureDelete={handleSketchPluginFeatureDelete}
174
192
  onSketchTypeChange={handleSketchTypeChange}
175
193
  onMount={onMount}
176
194
  onLayerVisibility={handleLayerVisibility}
@@ -178,6 +196,8 @@ export const CoreVisualizer = memo(
178
196
  onLayerSelectWithRectStart={handleLayerSelectWithRectStart}
179
197
  onLayerSelectWithRectMove={handleLayerSelectWithRectMove}
180
198
  onLayerSelectWithRectEnd={handleLayerSelectWithRectEnd}
199
+ onAPIReady={onAPIReady}
200
+ onCreditsUpdate={onCreditsUpdate}
181
201
  />
182
202
  <coreContext.Provider value={coreContextValue}>{children}</coreContext.Provider>
183
203
  </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) {