Skip to content

Commit 1d26d3f

Browse files
committed
fix: onMouseEnter & onMouseLeave trigger between joined layers (visgl#1671)
1 parent 109c334 commit 1d26d3f

File tree

1 file changed

+13
-4
lines changed

1 file changed

+13
-4
lines changed

src/mapbox/mapbox.ts

+13-4
Original file line numberDiff line numberDiff line change
@@ -786,14 +786,23 @@ export default class Mapbox {
786786
}
787787
};
788788

789+
_uniqueLayersCount(features: MapboxGeoJSONFeature[] | null) {
790+
if (!features) {
791+
return 0;
792+
}
793+
return features.filter(
794+
(feature, index) => features.findIndex(f => f.layer.id === feature.layer.id) === index
795+
).length;
796+
}
797+
789798
_updateHover(e: MapMouseEvent) {
790799
const {props} = this;
791800
const shouldTrackHoveredFeatures =
792801
props.interactiveLayerIds && (props.onMouseMove || props.onMouseEnter || props.onMouseLeave);
793802

794803
if (shouldTrackHoveredFeatures) {
795804
const eventType = e.type;
796-
const wasHovering = this._hoveredFeatures?.length > 0;
805+
const hoveredLayersCount = this._uniqueLayersCount(this._hoveredFeatures);
797806
let features;
798807
if (eventType === 'mousemove') {
799808
try {
@@ -806,14 +815,14 @@ export default class Mapbox {
806815
} else {
807816
features = [];
808817
}
809-
const isHovering = features.length > 0;
818+
const hoveringLayersCount = this._uniqueLayersCount(features);
810819

811-
if (!isHovering && wasHovering) {
820+
if (hoveringLayersCount < hoveredLayersCount) {
812821
e.type = 'mouseleave';
813822
this._onPointerEvent(e);
814823
}
815824
this._hoveredFeatures = features;
816-
if (isHovering && !wasHovering) {
825+
if (hoveringLayersCount > hoveredLayersCount) {
817826
e.type = 'mouseenter';
818827
this._onPointerEvent(e);
819828
}

0 commit comments

Comments
 (0)