diff --git a/resources/js/lib/media-query.test.ts b/resources/js/lib/media-query.test.ts index 9d3f5762..770b14b0 100644 --- a/resources/js/lib/media-query.test.ts +++ b/resources/js/lib/media-query.test.ts @@ -28,6 +28,18 @@ describe('addMediaQueryListener', () => { expect(addListener).toHaveBeenCalledWith(handler); }); + + it('does not throw when neither API is present', () => { + expect(() => + addMediaQueryListener( + fakeMql({ + addEventListener: undefined, + addListener: undefined, + }), + () => {}, + ), + ).not.toThrow(); + }); }); describe('removeMediaQueryListener', () => { diff --git a/resources/js/lib/media-query.ts b/resources/js/lib/media-query.ts index 9a383532..93557b16 100644 --- a/resources/js/lib/media-query.ts +++ b/resources/js/lib/media-query.ts @@ -18,7 +18,12 @@ export function addMediaQueryListener( return; } - mql.addListener(handler); + // Deprecated fallback for Safari <14 / legacy browsers. Guarded so a + // hypothetical MediaQueryList exposing neither API no-ops instead of + // re-introducing the crash this helper exists to prevent. + if (typeof mql.addListener === 'function') { + mql.addListener(handler); + } } export function removeMediaQueryListener( @@ -31,5 +36,7 @@ export function removeMediaQueryListener( return; } - mql.removeListener(handler); + if (typeof mql.removeListener === 'function') { + mql.removeListener(handler); + } }