UNPKG

1.97 kBJavaScriptView Raw
1"use strict";
2
3exports.__esModule = true;
4exports.default = useMediaQuery;
5
6var _useIsomorphicEffect = _interopRequireDefault(require("./useIsomorphicEffect"));
7
8var _react = require("react");
9
10function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
11
12var isBool = function isBool(a) {
13 return typeof a === 'boolean';
14};
15
16var matchers = new Map();
17
18var getMatcher = function getMatcher(query) {
19 if (!query || typeof window == 'undefined') return undefined;
20 var mql = matchers.get(query);
21
22 if (!mql) {
23 mql = window.matchMedia(query);
24 mql.refCount = 0;
25 matchers.set(mql.media, mql);
26 }
27
28 return mql;
29};
30/**
31 * Match a media query and get updates as the match changes. The media string is
32 * passed directly to `window.matchMedia` and run as a Layout Effect, so initial
33 * matches are returned before the browser has a chance to paint.
34 *
35 * ```tsx
36 * function Page() {
37 * const isWide = useMediaQuery('min-width: 1000px')
38 *
39 * return isWide ? "very wide" : 'not so wide'
40 * }
41 * ```
42 *
43 * Media query lists are also reused globally, hook calls for the same query
44 * will only create a matcher once under the hood.
45 *
46 * @param query A media query
47 */
48
49
50function useMediaQuery(query) {
51 var mql = getMatcher(query);
52
53 var _useState = (0, _react.useState)(function () {
54 return mql ? mql.matches : false;
55 }),
56 matches = _useState[0],
57 setMatches = _useState[1];
58
59 (0, _useIsomorphicEffect.default)(function () {
60 var mql = getMatcher(query);
61
62 if (!mql) {
63 return setMatches(false);
64 }
65
66 var handleChange = function handleChange() {
67 setMatches(mql.matches);
68 };
69
70 mql.refCount++;
71 mql.addListener(handleChange);
72 handleChange();
73 return function () {
74 mql.removeListener(handleChange);
75 mql.refCount--;
76
77 if (mql.refCount <= 0) {
78 matchers.delete(mql.media);
79 }
80
81 mql = undefined;
82 };
83 }, [query]);
84 return matches;
85}
\No newline at end of file