Skip to content

Commit 56c3298

Browse files
committed
fix: trigger redraw from layer
Signed-off-by: Ihor Dykhta <dikhta.igor@gmail.com>
1 parent f468e3a commit 56c3298

3 files changed

Lines changed: 20 additions & 3 deletions

File tree

src/components/src/map-container.tsx

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -525,6 +525,12 @@ export default function MapContainerFactory(
525525
} as Partial<LayerBaseConfig>);
526526
};
527527

528+
_onForceUpdate = () => {
529+
// Force a map re-render by triggering a minimal map state update
530+
const {mapStateActions, mapState, index} = this.props;
531+
mapStateActions.updateMap({width: mapState.width, height: mapState.height}, index);
532+
};
533+
528534
_onLayerFilteredItemsChange = (idx, event) => {
529535
this.props.visStateActions.layerFilteredItemsChange(this.props.visState.layers[idx], event);
530536
};
@@ -841,7 +847,8 @@ export default function MapContainerFactory(
841847
onLayerHover: this._onLayerHover,
842848
onSetLayerDomain: this._onLayerSetDomain,
843849
onFilteredItemsChange: this._onLayerFilteredItemsChange,
844-
onWMSFeatureInfo: this._onWMSFeatureInfo
850+
onWMSFeatureInfo: this._onWMSFeatureInfo,
851+
onForceUpdate: this._onForceUpdate
845852
},
846853
deckGlProps
847854
);

src/layers/src/icon-layer/icon-layer.ts

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,8 @@ import {
2222
VisConfigNumber,
2323
VisConfigRange,
2424
Merge,
25-
LayerColumn
25+
LayerColumn,
26+
BindedLayerCallbacks
2627
} from '@kepler.gl/types';
2728

2829
export type IconLayerColumnsConfig = {
@@ -112,6 +113,7 @@ export default class IconLayer extends Layer {
112113
_layerInfoModal: () => JSX.Element;
113114
iconGeometry: IconGeometry;
114115
iconGeometryVersion: number;
116+
protected forceUpdate: BindedLayerCallbacks['onForceUpdate'] = undefined;
115117

116118
declare visConfigSettings: IconLayerVisConfigSettings;
117119
declare config: IconLayerConfig;
@@ -246,6 +248,9 @@ export default class IconLayer extends Layer {
246248
this.iconGeometryVersion += 1;
247249

248250
this._layerInfoModal = IconInfoModalFactory(svgIcons);
251+
252+
// Trigger a map redraw so deck.gl picks up the new geometry
253+
this.forceUpdate?.();
249254
}
250255

251256
static findDefaultLayerProps({
@@ -361,7 +366,10 @@ export default class IconLayer extends Layer {
361366
}
362367

363368
renderLayer(opts) {
364-
const {data, gpuFilter, objectHovered, mapState, interactionConfig} = opts;
369+
const {data, gpuFilter, objectHovered, mapState, interactionConfig, layerCallbacks} = opts;
370+
371+
// Store callback to trigger map redraw when icon geometry loads asynchronously
372+
this.forceUpdate = layerCallbacks?.onForceUpdate;
365373

366374
const radiusScale = this.getRadiusScaleByZoom(mapState);
367375

src/types/layers.d.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -426,6 +426,7 @@ export type LayerCallbacks = {
426426
coordinate?: [number, number] | null;
427427
}
428428
) => void;
429+
onForceUpdate?: (idx: number) => void;
429430
};
430431

431432
export type BindedLayerCallbacks = {
@@ -436,6 +437,7 @@ export type BindedLayerCallbacks = {
436437
featureInfo: Array<{name: string; value: string}> | string | null,
437438
coordinate?: [number, number]
438439
) => void;
440+
onForceUpdate?: () => void;
439441
};
440442

441443
export type VisualChannelAggregation = 'colorAggregation' | 'sizeAggregation';

0 commit comments

Comments
 (0)