Skip to content

Commit 64d5261

Browse files
authored
refactor(web): support fallbacks on layers plugin api (#155)
1 parent 0cb5d1a commit 64d5261

1 file changed

Lines changed: 74 additions & 2 deletions

File tree

  • web/src/classic/components/molecules/Visualizer

web/src/classic/components/molecules/Visualizer/hooks.ts

Lines changed: 74 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -180,14 +180,86 @@ export default ({
180180
hideLayers,
181181
isLayerHidden,
182182
showLayers,
183-
addLayer,
184-
overrideLayerProperty,
183+
addLayer: addLayerRaw,
184+
overrideLayerProperty: overrideLayerPropertyRaw,
185185
} = useLayers({
186186
rootLayer: transformedRootLayer,
187187
selected: outerSelectedLayerId,
188188
onSelect: onLayerSelect,
189189
});
190190

191+
// Middleware for addLayer: Apply fallbacks when adding layers via plugin API
192+
const addLayer = useCallback(
193+
(layer: Layer, parentId?: string, creator?: string) => {
194+
const hasCesiumIonToken = !!overriddenSceneProperty?.default?.ion;
195+
196+
// Apply fallback transformation if needed
197+
let transformedLayer = layer;
198+
199+
// Check if this is a tileset layer with osm sourceType and no Cesium Ion token
200+
if (
201+
!hasCesiumIonToken &&
202+
(layer.extensionId === "tileset" || layer.type === "tileset") &&
203+
layer.property?.default?.sourceType === "osm"
204+
) {
205+
transformedLayer = {
206+
...layer,
207+
property: {
208+
...layer.property,
209+
default: {
210+
...layer.property.default,
211+
sourceType: "reearth-buildings",
212+
},
213+
},
214+
};
215+
216+
console.warn(
217+
`[Re:Earth] Layer sourceType fallback: "osm" (OSM Buildings) → "reearth-buildings" (Re:Earth Buildings) - No Cesium Ion token available (layer added via plugin API)`,
218+
);
219+
}
220+
221+
return addLayerRaw(transformedLayer, parentId, creator);
222+
},
223+
[addLayerRaw, overriddenSceneProperty?.default?.ion],
224+
);
225+
226+
// Middleware for overrideLayerProperty: Apply fallbacks when overriding layer properties via plugin API
227+
const overrideLayerProperty = useCallback(
228+
(id: string, property: any) => {
229+
const hasCesiumIonToken = !!overriddenSceneProperty?.default?.ion;
230+
231+
// Apply fallback transformation if needed
232+
let transformedProperty = property;
233+
234+
// Check if this is a tileset layer property override with osm sourceType and no Cesium Ion token
235+
if (
236+
!hasCesiumIonToken &&
237+
property &&
238+
typeof property === "object" &&
239+
property.default?.sourceType === "osm"
240+
) {
241+
// Check if the target layer is a tileset layer
242+
const targetLayer = layers.findById(id);
243+
if (targetLayer && targetLayer.extensionId === "tileset") {
244+
transformedProperty = {
245+
...property,
246+
default: {
247+
...property.default,
248+
sourceType: "reearth-buildings",
249+
},
250+
};
251+
252+
console.warn(
253+
`[Re:Earth] Layer sourceType fallback: "osm" (OSM Buildings) → "reearth-buildings" (Re:Earth Buildings) - No Cesium Ion token available (layer property override via plugin API, layer ID: ${id})`,
254+
);
255+
}
256+
}
257+
258+
return overrideLayerPropertyRaw(id, transformedProperty);
259+
},
260+
[overrideLayerPropertyRaw, overriddenSceneProperty?.default?.ion, layers],
261+
);
262+
191263
// selected block
192264
const [selectedBlockId, selectBlock] = useInnerState<string>(outerSelectedBlockId, onBlockSelect);
193265

0 commit comments

Comments
 (0)