Skip to content

Commit 538e918

Browse files
authored
fix: use correct pointer events behaviour (#997)
1 parent 31a5261 commit 538e918

2 files changed

Lines changed: 43 additions & 10 deletions

File tree

src/components/__tests__/advanced-marker.test.tsx

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -161,6 +161,40 @@ describe('map and marker-library loaded', () => {
161161
).toBeTruthy();
162162
});
163163

164+
test('disables custom content pointer targeting when clickable toggles off', async () => {
165+
const handleClick = jest.fn();
166+
167+
const {rerender} = render(
168+
<AdvancedMarker
169+
position={{lat: 1, lng: 2}}
170+
clickable={true}
171+
onClick={handleClick}>
172+
<div data-testid={'marker-content'}>Marker Content!</div>
173+
</AdvancedMarker>
174+
);
175+
176+
const marker = await waitForMockInstance(
177+
google.maps.marker.AdvancedMarkerElement
178+
);
179+
180+
expect(marker.gmpClickable).toBe(true);
181+
expect((marker.content as HTMLElement).style.pointerEvents).toBe('all');
182+
expect((marker.content as HTMLElement).style.cursor).toBe('pointer');
183+
184+
rerender(
185+
<AdvancedMarker
186+
position={{lat: 1, lng: 2}}
187+
clickable={false}
188+
onClick={handleClick}>
189+
<div data-testid={'marker-content'}>Marker Content!</div>
190+
</AdvancedMarker>
191+
);
192+
193+
expect(marker.gmpClickable).toBe(false);
194+
expect((marker.content as HTMLElement).style.pointerEvents).toBe('none');
195+
expect((marker.content as HTMLElement).style.cursor).toBe('');
196+
});
197+
164198
test.todo('marker should work with options');
165199
test.todo('marker should have a click listener');
166200

src/components/advanced-marker.tsx

Lines changed: 9 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -312,23 +312,22 @@ function useAdvancedMarker(props: AdvancedMarkerProps) {
312312
// maps api (as of 2024-10-10)
313313
marker.gmpClickable = gmpClickable;
314314

315-
// enable pointer events for the markers with custom content
316-
if (gmpClickable && marker?.content && isElementNode(marker.content)) {
317-
marker.content.style.pointerEvents = 'all';
318-
319-
if (onClick) {
320-
marker.content.style.cursor = 'pointer';
321-
}
315+
// keep pointer/cursor styles in sync for markers with custom content.
316+
// Non-clickable custom HTML must disable pointer targeting explicitly so
317+
// interactions fall through to the map underneath.
318+
if (marker?.content && isElementNode(marker.content)) {
319+
marker.content.style.pointerEvents = gmpClickable ? 'all' : 'none';
320+
marker.content.style.cursor = gmpClickable && onClick ? 'pointer' : '';
322321
}
323322
}, [marker, clickable, onClick, onMouseEnter, onMouseLeave]);
324323

325-
useMapsEventListener(marker, 'click', onClick);
326324
useMapsEventListener(marker, 'drag', onDrag);
327325
useMapsEventListener(marker, 'dragstart', onDragStart);
328326
useMapsEventListener(marker, 'dragend', onDragEnd);
329327

330-
useDomEventListener(marker?.element, 'mouseenter', onMouseEnter);
331-
useDomEventListener(marker?.element, 'mouseleave', onMouseLeave);
328+
useDomEventListener(marker, 'gmp-click', onClick);
329+
useDomEventListener(marker, 'mouseenter', onMouseEnter);
330+
useDomEventListener(marker, 'mouseleave', onMouseLeave);
332331

333332
return [marker, contentContainer] as const;
334333
}

0 commit comments

Comments
 (0)