Skip to content

Commit 81f490d

Browse files
authored
fix: trigger a redraw from icon layer once the icons are loaded. (#3269)
* fix: trigger redraw from layer Signed-off-by: Ihor Dykhta <dikhta.igor@gmail.com> * rename Signed-off-by: Ihor Dykhta <dikhta.igor@gmail.com> * optimize Signed-off-by: Ihor Dykhta <dikhta.igor@gmail.com> * ts Signed-off-by: Ihor Dykhta <dikhta.igor@gmail.com> * ts Signed-off-by: Ihor Dykhta <dikhta.igor@gmail.com> * ts Signed-off-by: Ihor Dykhta <dikhta.igor@gmail.com> --------- Signed-off-by: Ihor Dykhta <dikhta.igor@gmail.com>
1 parent 26e4a17 commit 81f490d

3 files changed

Lines changed: 21 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+
_onRedrawNeeded = (_idx: number) => {
529+
// updateMapUpdater always returns a new state object reference, which triggers re-render
530+
const {mapStateActions, index} = this.props;
531+
mapStateActions.updateMap({}, 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+
onRedrawNeeded: this._onRedrawNeeded
845852
},
846853
deckGlProps
847854
);

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

Lines changed: 11 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 = {
@@ -113,6 +114,8 @@ export default class IconLayer extends Layer {
113114
iconGeometry: IconGeometry;
114115
iconGeometryVersion: number;
115116

117+
onRedrawNeeded: BindedLayerCallbacks['onRedrawNeeded'];
118+
116119
declare visConfigSettings: IconLayerVisConfigSettings;
117120
declare config: IconLayerConfig;
118121

@@ -246,6 +249,9 @@ export default class IconLayer extends Layer {
246249
this.iconGeometryVersion += 1;
247250

248251
this._layerInfoModal = IconInfoModalFactory(svgIcons);
252+
253+
// Trigger a map redraw so deck.gl picks up the new geometry
254+
this.onRedrawNeeded?.();
249255
}
250256

251257
static findDefaultLayerProps({
@@ -361,7 +367,10 @@ export default class IconLayer extends Layer {
361367
}
362368

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

366375
const radiusScale = this.getRadiusScaleByZoom(mapState);
367376

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+
onRedrawNeeded?: (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+
onRedrawNeeded?: () => void;
439441
};
440442

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

0 commit comments

Comments
 (0)