{"version":3,"sources":["../../src/use-media-query/index.ts"],"sourcesContent":["import { useRef } from 'react'\nimport { useDeepCompareEffect } from '../use-deep-compare-effect'\nimport { useLatest } from '../use-latest'\nimport { useSafeState } from '../use-safe-state'\nimport { unwrapArrayable, unwrapGettable } from '../utils/unwrap'\n\nimport type { Arrayable, Gettable } from '../utils/basic'\n\nexport type UseMediaQueryType = Gettable<string>\nexport type MediaQueryChangeListener = (this: MediaQueryList, ev: MediaQueryListEvent) => void\nexport type UseMediaQueryReturns<T, R> = R extends T[] ? boolean[] : boolean\n\nexport interface UseMediaQueryOptions extends AddEventListenerOptions {}\n\n/**\n * A React Hook that tracks the state of CSS media query/queries.\n */\nexport function useMediaQuery<T extends UseMediaQueryType, R extends Arrayable<T> = Arrayable<T>>(\n  query: R,\n  options: UseMediaQueryOptions = {},\n): UseMediaQueryReturns<T, R> {\n  const { ...addEventListenerOptions } = options\n  const queryStrings = unwrapArrayable(query).filter(Boolean).map(unwrapGettable)\n  const mediaQueries = useRef<(MediaQueryList & { handler?: MediaQueryChangeListener })[]>([])\n  const [matches, setMatches] = useSafeState([false], { deep: true })\n\n  const latest = useLatest(matches)\n\n  useDeepCompareEffect(() => {\n    if (!queryStrings.length) return\n\n    // https://developer.mozilla.org/en-US/docs/Web/API/Window/matchMedia#browser_compatibility\n    mediaQueries.current = queryStrings.map((query) => window.matchMedia(query))\n    setMatches(getMatches(queryStrings))\n\n    mediaQueries.current.map((mq, idx) => {\n      mq.handler = (event: MediaQueryListEvent) => {\n        const newMatches = [...latest.current]\n        newMatches[idx] = event.matches\n        setMatches(newMatches)\n      }\n      if (mq.handler) {\n        if ('addEventListener' in mq) {\n          mq.addEventListener('change', mq.handler, addEventListenerOptions)\n        } else if ('addListener' in mq) {\n          // @ts-expect-error for legacy browsers\n          mq?.addListener(mq.handler)\n        }\n      }\n    })\n\n    return () => {\n      mediaQueries.current.map((mq) => {\n        if (mq.handler) {\n          if ('removeEventListener' in mq) {\n            mq.removeEventListener('change', mq.handler)\n          } else if ('removeListener' in mq) {\n            // @ts-expect-error for legacy browsers\n            mq?.removeListener(mq.handler)\n          }\n        }\n      })\n\n      mediaQueries.current = []\n    }\n    // biome-ignore lint/correctness/useExhaustiveDependencies: deep compare\n  }, [queryStrings, addEventListenerOptions])\n\n  return (Array.isArray(query) ? matches : matches[0]) as R extends T[] ? boolean[] : boolean\n}\n\nfunction getMatches(queryStrings: string[]): boolean[] {\n  return queryStrings.map((query) => Boolean(window.matchMedia(query).matches))\n}\n"],"names":["useMediaQuery","query","options","addEventListenerOptions","queryStrings","unwrapArrayable","filter","Boolean","map","unwrapGettable","mediaQueries","useRef","useSafeState","deep","matches","setMatches","latest","useLatest","useDeepCompareEffect","length","current","window","matchMedia","getMatches","mq","idx","handler","event","newMatches","addEventListener","addListener","removeEventListener","removeListener","Array","isArray"],"mappings":";;;;+BAiBgBA;;;eAAAA;;;qBAjBO;oCACc;yBACX;4BACG;sBACmB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAazC,SAASA,cACdC,KAAQ;QACRC,UAAAA,iEAAgC,CAAC;IAEjC,IAAM,kCAAiCA,UAA5BC,uCAA4BD;IACvC,IAAME,eAAeC,IAAAA,uBAAe,EAACJ,OAAOK,MAAM,CAACC,SAASC,GAAG,CAACC,sBAAc;IAC9E,IAAMC,eAAeC,IAAAA,aAAM,EAA8D,EAAE;IAC3F,IAA8BC,iCAAAA,IAAAA,0BAAY,EAAC;QAAC;KAAM,EAAE;QAAEC,MAAM;IAAK,QAA1DC,UAAuBF,kBAAdG,aAAcH;IAE9B,IAAMI,SAASC,IAAAA,oBAAS,EAACH;IAEzBI,IAAAA,0CAAoB,EAAC;QACnB,IAAI,CAACd,aAAae,MAAM,EAAE;QAE1B,2FAA2F;QAC3FT,aAAaU,OAAO,GAAGhB,aAAaI,GAAG,CAAC,SAACP;mBAAUoB,OAAOC,UAAU,CAACrB;;QACrEc,WAAWQ,WAAWnB;QAEtBM,aAAaU,OAAO,CAACZ,GAAG,CAAC,SAACgB,IAAIC;YAC5BD,GAAGE,OAAO,GAAG,SAACC;gBACZ,IAAMC,aAAc,qBAAGZ,OAAOI,OAAO;gBACrCQ,UAAU,CAACH,IAAI,GAAGE,MAAMb,OAAO;gBAC/BC,WAAWa;YACb;YACA,IAAIJ,GAAGE,OAAO,EAAE;gBACd,IAAI,sBAAsBF,IAAI;oBAC5BA,GAAGK,gBAAgB,CAAC,UAAUL,GAAGE,OAAO,EAAEvB;gBAC5C,OAAO,IAAI,iBAAiBqB,IAAI;oBAC9B,uCAAuC;oBACvCA,eAAAA,yBAAAA,GAAIM,WAAW,CAACN,GAAGE,OAAO;gBAC5B;YACF;QACF;QAEA,OAAO;YACLhB,aAAaU,OAAO,CAACZ,GAAG,CAAC,SAACgB;gBACxB,IAAIA,GAAGE,OAAO,EAAE;oBACd,IAAI,yBAAyBF,IAAI;wBAC/BA,GAAGO,mBAAmB,CAAC,UAAUP,GAAGE,OAAO;oBAC7C,OAAO,IAAI,oBAAoBF,IAAI;wBACjC,uCAAuC;wBACvCA,eAAAA,yBAAAA,GAAIQ,cAAc,CAACR,GAAGE,OAAO;oBAC/B;gBACF;YACF;YAEAhB,aAAaU,OAAO,GAAG,EAAE;QAC3B;IACA,wEAAwE;IAC1E,GAAG;QAAChB;QAAcD;KAAwB;IAE1C,OAAQ8B,MAAMC,OAAO,CAACjC,SAASa,UAAUA,OAAO,CAAC,EAAE;AACrD;AAEA,SAASS,WAAWnB,YAAsB;IACxC,OAAOA,aAAaI,GAAG,CAAC,SAACP;eAAUM,QAAQc,OAAOC,UAAU,CAACrB,OAAOa,OAAO;;AAC7E"}