Skip to content

Commit

Permalink
fix(useMediaQuery): only add/remove event listeners on query change
Browse files Browse the repository at this point in the history
  • Loading branch information
Ingramz committed Jul 16, 2023
1 parent 658444b commit 3279cf1
Showing 1 changed file with 17 additions and 12 deletions.
29 changes: 17 additions & 12 deletions packages/core/useMediaQuery/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

import { ref, watchEffect } from 'vue-demi'
import type { MaybeRefOrGetter } from '@vueuse/shared'
import { toRef, tryOnScopeDispose } from '@vueuse/shared'
import { toValue, tryOnScopeDispose } from '@vueuse/shared'
import type { ConfigurableWindow } from '../_configurable'
import { defaultWindow } from '../_configurable'
import { useSupported } from '../useSupported'
Expand All @@ -21,39 +21,44 @@ export function useMediaQuery(query: MaybeRefOrGetter<string>, options: Configur
let mediaQuery: MediaQueryList | undefined
const matches = ref(false)

const handler = (event: MediaQueryListEvent) => {
matches.value = event.matches
}

const cleanup = () => {
if (!mediaQuery)
return
if ('removeEventListener' in mediaQuery)
// eslint-disable-next-line @typescript-eslint/no-use-before-define
mediaQuery.removeEventListener('change', update)
mediaQuery.removeEventListener('change', handler)
else
// @ts-expect-error deprecated API
// eslint-disable-next-line @typescript-eslint/no-use-before-define
mediaQuery.removeListener(update)
mediaQuery.removeListener(handler)
}

const update = () => {
const stopWatch = watchEffect(() => {
if (!isSupported.value)
return

cleanup()

mediaQuery = window!.matchMedia(toRef(query).value)
mediaQuery = window!.matchMedia(toValue(query))
matches.value = !!mediaQuery?.matches

if (!mediaQuery)
return

if ('addEventListener' in mediaQuery)
mediaQuery.addEventListener('change', update)
mediaQuery.addEventListener('change', handler)
else
// @ts-expect-error deprecated API
mediaQuery.addListener(update)
}
watchEffect(update)
mediaQuery.addListener(handler)
})

tryOnScopeDispose(() => cleanup())
tryOnScopeDispose(() => {
stopWatch()
cleanup()
mediaQuery = undefined
})

return matches
}

0 comments on commit 3279cf1

Please sign in to comment.