@reearth/core 0.0.4 → 0.0.5-beta.1

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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@reearth/core",
3
- "version": "0.0.4",
3
+ "version": "0.0.5-beta.1",
4
4
  "author": "Re:Earth contributors <community@reearth.io>",
5
5
  "license": "Apache-2.0",
6
6
  "description": "A library that abstracts a map engine as one common API.",
@@ -13,20 +13,23 @@
13
13
  "dist"
14
14
  ],
15
15
  "scripts": {
16
- "dev": "vite",
16
+ "dev": "vite -c vite.config.example.ts",
17
17
  "build": "tsc && vite build",
18
18
  "lint": "eslint . --ext ts,tsx --report-unused-disable-directives",
19
19
  "preview": "vite preview",
20
20
  "test": "vitest",
21
21
  "storybook": "storybook dev -p 6007",
22
- "build-storybook": "storybook build"
22
+ "build-storybook": "storybook build",
23
+ "preversion": "yarn test run",
24
+ "version": "yarn build"
23
25
  },
24
26
  "engines": {
25
27
  "node": ">=20"
26
28
  },
27
29
  "peerDependencies": {
28
30
  "react": "^18.2.0",
29
- "react-dom": "^18.2.0"
31
+ "react-dom": "^18.2.0",
32
+ "cesium": "1.x"
30
33
  },
31
34
  "dependencies": {
32
35
  "@reearth/cesium-mvt-imagery-provider": "1.5.4",
@@ -108,6 +111,7 @@
108
111
  "vite-plugin-cesium": "1.2.22",
109
112
  "vite-plugin-dts": "3.8.1",
110
113
  "vite-plugin-svgr": "4.2.0",
114
+ "vite-tsconfig-paths": "^4.3.2",
111
115
  "vitest": "1.0.4",
112
116
  "web-streams-polyfill": "3.2.1"
113
117
  },
@@ -50,12 +50,6 @@ test("attachProperties()", () => {
50
50
  outlineWidth: 100,
51
51
  outlineColor: "blue",
52
52
  });
53
- expect(mockEntity.properties.reearth_originalProperties).toEqual({
54
- polygon: {
55
- material: toColor("blue"),
56
- outlineWidth: 100,
57
- },
58
- });
59
53
 
60
54
  // Computed feature should not be changed.
61
55
  expect(mockComputedFeature).toEqual({
@@ -64,29 +64,26 @@ export function attachProperties<
64
64
  }
65
65
 
66
66
  const tag = getTag(entity);
67
+ const originalProperties = tag?.originalProperties || {};
68
+ const isUpdatedInLastUpdate = originalProperties[appearanceName];
67
69
 
68
- // Backup original properties
69
- overrideOriginalProperties(
70
- entity,
71
- tag,
72
- propertyName,
73
- Object.keys(propertyMap).reduce(
74
- (r, k) => {
75
- r[k] = (property as any)[k];
76
- return r;
77
- },
78
- {} as Record<string, any>,
79
- ),
80
- );
81
-
70
+ let isUpdated = false;
82
71
  Object.entries(propertyMap).forEach(([entityPropertyKey, appearancePropertyKey]) => {
83
72
  const appearanceKeyName = appearancePropertyKey.name;
84
73
  const appearanceKeyType = appearancePropertyKey.type as AppearancePropertyKeyType;
85
74
 
86
75
  let value =
87
76
  appearancePropertyKey.override ??
88
- (computedFeature?.[appearanceName] as any)?.[appearanceKeyName] ??
89
- appearancePropertyKey.default;
77
+ (computedFeature?.[appearanceName] as any)?.[appearanceKeyName];
78
+ const isDefaultUsed = value == null && !!appearancePropertyKey.default;
79
+ value = value == null ? appearancePropertyKey.default : value;
80
+
81
+ if ((value == null || isDefaultUsed) && !isUpdatedInLastUpdate) {
82
+ return;
83
+ }
84
+
85
+ isUpdated = true;
86
+
90
87
  switch (appearanceKeyType) {
91
88
  case "color":
92
89
  value = toColor(value);
@@ -98,9 +95,14 @@ export function attachProperties<
98
95
  value = heightReference(value);
99
96
  }
100
97
 
98
+ if (value === (entity[propertyName] as any)[entityPropertyKey]) {
99
+ return;
100
+ }
101
+
101
102
  (entity[propertyName] as any)[entityPropertyKey] =
102
103
  value ?? (property as any)[entityPropertyKey];
103
104
  });
105
+ overrideOriginalProperties(entity, tag, appearanceName, isUpdated);
104
106
  }
105
107
 
106
108
  const hasAppearance = <
@@ -111,7 +113,7 @@ const hasAppearance = <
111
113
  entity: Entity,
112
114
  namePair: [appearanceName: AName, propertyName: PName],
113
115
  ): boolean => {
114
- return !!(extractSimpleLayer(layer)?.[namePair[0]] || entity[namePair[1]]);
116
+ return !!(extractSimpleLayer(layer)?.[namePair[0]] && entity[namePair[1]]);
115
117
  };
116
118
 
117
119
  export const makeFeatureId = (e: Entity) => String(e.id);
@@ -372,11 +372,15 @@ export default ({
372
372
  | GroundPrimitive
373
373
  | ImageryLayer
374
374
  >();
375
+ const prevSelectedImageryFeatureId = useRef<string | undefined>();
376
+
375
377
  // manage layer selection
376
378
  useEffect(() => {
377
379
  const viewer = cesium.current?.cesiumElement;
378
380
  if (!viewer || viewer.isDestroyed()) return;
379
381
 
382
+ if (prevSelectedImageryFeatureId.current === selectedLayerId?.featureId) return;
383
+
380
384
  const prevTag = getTag(prevSelectedEntity.current);
381
385
  if (
382
386
  (!prevTag?.featureId &&
@@ -571,11 +575,7 @@ export default ({
571
575
  const viewer = cesium.current?.cesiumElement;
572
576
  if (!viewer || viewer.isDestroyed()) return;
573
577
 
574
- if (!target || typeof target === "undefined" || !("id" in target && target.id)) {
575
- viewer.selectedEntity = undefined;
576
- onLayerSelect?.();
577
- return;
578
- }
578
+ prevSelectedImageryFeatureId.current = undefined;
579
579
 
580
580
  const entity =
581
581
  findEntity(viewer, undefined, selectedLayerId?.featureId) ||
@@ -685,63 +685,60 @@ export default ({
685
685
  const l = await scene.imageryLayers.pickImageryLayerFeatures(pickRay, scene);
686
686
 
687
687
  // NOTE: For now we only send the first selected feature to onLayerSelect instead of sending all of them: @pyshx
688
- if (!l) return;
689
- const f = l[0];
688
+ const f = l?.[0];
689
+
690
+ const appearanceType = f?.data?.appearanceType;
691
+
692
+ if (appearanceType && f?.data?.feature?.[appearanceType]?.show !== false) {
693
+ const tag = getTag(f.imageryLayer);
694
+
695
+ const pos = f.position;
696
+ if (pos) {
697
+ // NOTE: Instantiate temporal Cesium.Entity to display indicator.
698
+ // Although we want to use `viewer.selectionIndicator.viewModel.position` and `animateAppear`, Cesium reset selection position if `viewer.selectedEntity` is not set.
699
+ // ref: https://github.com/CesiumGS/cesium/blob/9295450e64c3077d96ad579012068ea05f97842c/packages/widgets/Source/Viewer/Viewer.js#L1843-L1876
700
+ // issue: https://github.com/CesiumGS/cesium/issues/7965
701
+ requestAnimationFrame(() => {
702
+ if (!tag?.hideIndicator) {
703
+ viewer.selectedEntity = new Entity({
704
+ position: Cartographic.toCartesian(pos),
705
+ });
706
+ }
707
+ });
708
+ }
690
709
 
691
- const appearanceType = f.data?.appearanceType;
692
- if (appearanceType && f.data?.feature?.[appearanceType]?.show === false) {
693
- return;
694
- }
710
+ const layer = tag?.layerId
711
+ ? layersRef?.current?.overriddenLayers().find(l => l.id === tag.layerId) ??
712
+ layersRef?.current?.findById(tag.layerId)
713
+ : undefined;
714
+ const content = getEntityContent(
715
+ f.data.feature ?? f,
716
+ viewer.clock.currentTime ?? new JulianDate(),
717
+ tag?.layerId ? layer?.infobox?.property?.defaultContent : undefined,
718
+ );
719
+ prevSelectedImageryFeatureId.current = f.data.featureId;
720
+ onLayerSelect?.(
721
+ f.data.layerId,
722
+ f.data.featureId,
723
+ content.value.length
724
+ ? {
725
+ defaultInfobox: {
726
+ title: layer?.title ?? f.name,
727
+ content,
728
+ },
729
+ }
730
+ : undefined,
731
+ {
732
+ feature: f.data.feature,
733
+ },
734
+ );
695
735
 
696
- const tag = getTag(f.imageryLayer);
697
-
698
- const pos = f.position;
699
- if (pos) {
700
- // NOTE: Instantiate temporal Cesium.Entity to display indicator.
701
- // Although we want to use `viewer.selectionIndicator.viewModel.position` and `animateAppear`, Cesium reset selection position if `viewer.selectedEntity` is not set.
702
- // ref: https://github.com/CesiumGS/cesium/blob/9295450e64c3077d96ad579012068ea05f97842c/packages/widgets/Source/Viewer/Viewer.js#L1843-L1876
703
- // issue: https://github.com/CesiumGS/cesium/issues/7965
704
- requestAnimationFrame(() => {
705
- if (!tag?.hideIndicator) {
706
- viewer.selectedEntity = new Entity({
707
- position: Cartographic.toCartesian(pos),
708
- });
709
- }
710
- });
736
+ return;
711
737
  }
712
-
713
- const layer = tag?.layerId
714
- ? layersRef?.current?.overriddenLayers().find(l => l.id === tag.layerId) ??
715
- layersRef?.current?.findById(tag.layerId)
716
- : undefined;
717
- const content = getEntityContent(
718
- f.data.feature ?? f,
719
- viewer.clock.currentTime ?? new JulianDate(),
720
- tag?.layerId ? layer?.infobox?.property?.defaultContent : undefined,
721
- );
722
- onLayerSelect?.(
723
- f.data.layerId,
724
- f.data.featureId,
725
- content.value.length
726
- ? {
727
- defaultInfobox: {
728
- title: layer?.title ?? f.name,
729
- content,
730
- },
731
- }
732
- : undefined,
733
- {
734
- feature: f.data.feature,
735
- },
736
- );
737
-
738
- return;
739
738
  }
740
739
  }
741
740
 
742
- if (!entity || (entity instanceof Entity && tag?.hideIndicator)) {
743
- viewer.selectedEntity = undefined;
744
- }
741
+ viewer.selectedEntity = undefined;
745
742
  onLayerSelect?.();
746
743
  },
747
744
  [
package/src/.DS_Store DELETED
Binary file
Binary file
Binary file
Binary file