Skip to content

Commit d5a27b4

Browse files
ZTongciclaude
andcommitted
refactor: move Cesium Ion asset detection into Map layer of core
Detection logic was previously passed in from the visualizer as a prop (`hasCesiumIonAsset`). Core already owns both `property` (ViewerProperty) and `layers` (Layer[]) in `Map/index.tsx`, so computing the boolean there keeps Ion-awareness entirely within core — consistent with how credits are already surfaced via `getCredits`. `CoreVisualizerProps` no longer exposes `hasCesiumIonAsset`; callers are unaffected. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
1 parent 8c528a1 commit d5a27b4

3 files changed

Lines changed: 69 additions & 5 deletions

File tree

src/Map/cesiumIonDetection.ts

Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
import type { Layer, LayerSimple } from "../mantle";
2+
3+
import type { TileProperty, ViewerProperty } from "./types/viewerProperty";
4+
5+
const CESIUM_ION_URL_PATTERN = "ion.cesium.com";
6+
const CESIUM_ION_LEGACY_TILE_TYPES = new Set([
7+
"default",
8+
"default_road",
9+
"default_label",
10+
"black_marble",
11+
]);
12+
13+
function isIonUrl(url?: string | null): boolean {
14+
return !!url && url.includes(CESIUM_ION_URL_PATTERN);
15+
}
16+
17+
function tileUsesIon(tile: TileProperty): boolean {
18+
if (!tile.type) return false;
19+
if (tile.type.startsWith("cesium_ion")) return true;
20+
if (CESIUM_ION_LEGACY_TILE_TYPES.has(tile.type)) return true;
21+
return false;
22+
}
23+
24+
function terrainUsesIon(property?: ViewerProperty): boolean {
25+
const terrain = property?.terrain;
26+
if (!terrain?.enabled) return false;
27+
if (terrain.type === "cesium" || terrain.type === "cesiumion") return true;
28+
if (isIonUrl(property?.assets?.cesium?.terrain?.ionUrl)) return true;
29+
return false;
30+
}
31+
32+
function layerUsesIon(layer: LayerSimple): boolean {
33+
const data = layer.data;
34+
if (!data) return false;
35+
if (data.type === "osm-buildings") return true;
36+
if (data.type === "google-photorealistic") {
37+
if (data.provider === "reearth") return false;
38+
if (data.serviceTokens?.googleMapApiKey && data.provider !== "cesium-ion") return false;
39+
return true;
40+
}
41+
if (data.type === "3dtiles" && isIonUrl(data.url)) return true;
42+
return false;
43+
}
44+
45+
function anyLayerUsesIon(layer: Layer): boolean {
46+
if (layer.type === "group") {
47+
return layer.children.some(anyLayerUsesIon);
48+
}
49+
return layerUsesIon(layer);
50+
}
51+
52+
export function computeHasCesiumIonAsset(property?: ViewerProperty, layers?: Layer[]): boolean {
53+
if (property?.tiles?.some(tileUsesIon)) return true;
54+
if (terrainUsesIon(property)) return true;
55+
if (layers?.some(anyLayerUsesIon)) return true;
56+
return false;
57+
}

src/Map/index.tsx

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ import { forwardRef, useMemo, type Ref, type JSX } from "react";
22

33
import { INTERACTION_MODES } from "../shared/interactionMode";
44

5+
import { computeHasCesiumIonAsset } from "./cesiumIonDetection";
56
import Geoid from "./Geoid";
67
import useHooks, { MapRef } from "./hooks";
78
import Layers, { type Props as LayersProps } from "./Layers";
@@ -44,7 +45,10 @@ export type Props = {
4445
| "selectedLayerId"
4546
| "viewerProperty"
4647
> &
47-
Omit<EngineProps, "onLayerSelect" | "layerSelectionReason" | "selectedLayerId"> &
48+
Omit<
49+
EngineProps,
50+
"onLayerSelect" | "layerSelectionReason" | "selectedLayerId" | "hasCesiumIonAsset"
51+
> &
4852
Omit<SketchProps, "layersRef" | "engineRef" | "SketchComponent">;
4953

5054
function MapFn(
@@ -102,6 +106,11 @@ function MapFn(
102106
onAPIReady,
103107
});
104108

109+
const hasCesiumIonAsset = useMemo(
110+
() => computeHasCesiumIonAsset(props.property, layers),
111+
[props.property, layers],
112+
);
113+
105114
const selectedLayerIds = useMemo(
106115
() => ({
107116
layerId: selectedLayer.layerId,
@@ -125,7 +134,8 @@ function MapFn(
125134
onLayerSelect={handleEngineLayerSelect}
126135
featureFlags={featureFlags}
127136
onMount={handleEngineMount}
128-
{...props}>
137+
{...props}
138+
hasCesiumIonAsset={hasCesiumIonAsset}>
129139
<Layers
130140
ref={layersRef}
131141
engineRef={engineRef}

src/Visualizer/index.tsx

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,6 @@ export type CoreVisualizerProps = {
5050
hiddenLayers?: string[];
5151
zoomedLayerId?: string;
5252
displayCredits?: boolean;
53-
hasCesiumIonAsset?: boolean;
5453
onCameraChange?: (camera: Camera) => void;
5554
onLayerDrop?: (layerId: string, propertyKey: string, position: LatLng | undefined) => void;
5655
onLayerSelect?: (
@@ -90,7 +89,6 @@ export const CoreVisualizer = memo(
9089
meta,
9190
customProvider,
9291
displayCredits = true,
93-
hasCesiumIonAsset,
9492
style,
9593
zoomedLayerId,
9694
children,
@@ -172,7 +170,6 @@ export const CoreVisualizer = memo(
172170
meta={meta}
173171
customProvider={customProvider}
174172
displayCredits={displayCredits}
175-
hasCesiumIonAsset={hasCesiumIonAsset}
176173
style={style}
177174
featureFlags={featureFlags}
178175
shouldRender={shouldRender}

0 commit comments

Comments
 (0)