Skip to content

Commit 82630de

Browse files
authored
fix: ensure icon layer render with the latest geometry (#3259)
* fix: ensure icon layer render with the latest geometry Signed-off-by: Ihor Dykhta <dikhta.igor@gmail.com> * fix tests Signed-off-by: Ihor Dykhta <dikhta.igor@gmail.com> --------- Signed-off-by: Ihor Dykhta <dikhta.igor@gmail.com>
1 parent 422c1b3 commit 82630de

2 files changed

Lines changed: 26 additions & 5 deletions

File tree

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

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -111,6 +111,7 @@ export default class IconLayer extends Layer {
111111
getIconAccessor: (dataContainer: DataContainerInterface) => (d: any) => any;
112112
_layerInfoModal: () => JSX.Element;
113113
iconGeometry: IconGeometry;
114+
iconGeometryVersion: number;
114115

115116
declare visConfigSettings: IconLayerVisConfigSettings;
116117
declare config: IconLayerConfig;
@@ -131,6 +132,7 @@ export default class IconLayer extends Layer {
131132

132133
this._layerInfoModal = IconInfoModalFactory(props.svgIcons);
133134
this.iconGeometry = props.iconGeometry || null;
135+
this.iconGeometryVersion = 0;
134136

135137
if (isTest()) {
136138
return;
@@ -222,10 +224,12 @@ export default class IconLayer extends Layer {
222224
console.error('Error fetching or parsing svg-icons.json:', err);
223225
// Fallback to empty geometry to allow default icon rendering
224226
this.iconGeometry = {};
227+
this.iconGeometryVersion += 1;
225228
});
226229
} else {
227230
// No fetch available; set empty geometry so layer can render default icons
228231
this.iconGeometry = {};
232+
this.iconGeometryVersion += 1;
229233
}
230234
}
231235

@@ -238,6 +242,9 @@ export default class IconLayer extends Layer {
238242
{}
239243
);
240244

245+
// Increment version when SVG icons are loaded to trigger layer re-render
246+
this.iconGeometryVersion += 1;
247+
241248
this._layerInfoModal = IconInfoModalFactory(svgIcons);
242249
}
243250

@@ -402,9 +409,14 @@ export default class IconLayer extends Layer {
402409
cullFace: GL.FRONT
403410
};
404411

412+
// Append geometry version to layer id so deck.gl treats it as new layer when geometry changes
413+
const baseLayerId = defaultLayerProps.id || this.id;
414+
const layerIdWithVersion = `${baseLayerId}_${this.iconGeometryVersion}`;
415+
405416
return [
406417
new SvgIconLayer({
407418
...defaultLayerProps,
419+
id: layerIdWithVersion,
408420
...brushingProps,
409421
...layerProps,
410422
...data,
@@ -422,6 +434,7 @@ export default class IconLayer extends Layer {
422434
// @ts-expect-error SvgIconLayerProps needs getIcon Field
423435
new SvgIconLayer({
424436
...this.getDefaultHoverLayerProps(),
437+
id: `${layerIdWithVersion}-hover`,
425438
...layerProps,
426439
visible: defaultLayerProps.visible,
427440
data: [hoveredObject],

test/browser/layer-tests/icon-layer-specs.js

Lines changed: 13 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -300,7 +300,11 @@ test('#IconLayer -> renderLayer', t => {
300300
3,
301301
'Should create 3 deck.gl layer when icon geometry is provided'
302302
);
303-
const expectedLayerIds = ['test_layer_1', 'test_layer_1-accel', 'test_layer_1-attach'];
303+
const expectedLayerIds = [
304+
'test_layer_1_0',
305+
'test_layer_1_0-accel',
306+
'test_layer_1_0-attach'
307+
];
304308

305309
t.deepEqual(
306310
deckLayers.map(l => l.id),
@@ -357,7 +361,11 @@ test('#IconLayer -> renderLayer', t => {
357361
3,
358362
'Should create 3 deck.gl layer when icon geometry is provided'
359363
);
360-
const expectedLayerIds = ['test_layer_1', 'test_layer_1-accel', 'test_layer_1-attach'];
364+
const expectedLayerIds = [
365+
'test_layer_1_0',
366+
'test_layer_1_0-accel',
367+
'test_layer_1_0-attach'
368+
];
361369

362370
t.deepEqual(
363371
deckLayers.map(l => l.id),
@@ -417,9 +425,9 @@ test('#IconLayer -> renderLayer', t => {
417425
t.deepEqual(
418426
deckLayers.map(l => l.id),
419427
[
420-
'test_layer_1',
421-
'test_layer_1-accel',
422-
'test_layer_1-attach',
428+
'test_layer_1_0',
429+
'test_layer_1_0-accel',
430+
'test_layer_1_0-attach',
423431
'test_layer_1-label-types',
424432
'test_layer_1-label-types-characters',
425433
'test_layer_1-label-has_result',

0 commit comments

Comments
 (0)