@kiwicom/orbit-components
Version:
Orbit-components is a React component library which provides developers with the easiest possible way of building Kiwi.com’s products.
83 lines (74 loc) • 2.99 kB
JavaScript
import _slicedToArray from "@babel/runtime/helpers/esm/slicedToArray";
import _toConsumableArray from "@babel/runtime/helpers/esm/toConsumableArray";
import _defineProperty from "@babel/runtime/helpers/esm/defineProperty";
import * as React from "react";
import { getBreakpointWidth } from "../../utils/mediaQuery/index";
import useTheme from "../../hooks/useTheme/index";
var createBreakpoints = function createBreakpoints(theme) {
return {
isDesktop: getBreakpointWidth("desktop", theme),
isLargeDesktop: getBreakpointWidth("largeDesktop", theme),
isTablet: getBreakpointWidth("tablet", theme),
isLargeMobile: getBreakpointWidth("largeMobile", theme),
isMediumMobile: getBreakpointWidth("mediumMobile", theme),
prefersReducedMotion: "(prefers-reduced-motion: reduce)"
};
};
var createMediaQueryList = function createMediaQueryList(breakpoints) {
if (typeof window !== "undefined") {
/* $FlowFixMe(>=0.115.0) This comment suppresses an error found when upgrading Flow to
* v0.115.0. To view the error, delete this comment and run Flow. */
return Object.keys(breakpoints).map(function (q) {
return _defineProperty({}, q, window.matchMedia(breakpoints[q]));
});
}
return [];
};
var useMediaQueryContext = function useMediaQueryContext() {
var theme = useTheme();
var breakpoints = React.useMemo(function () {
return createBreakpoints(theme);
}, [theme]);
var mediaQueryLists = React.useMemo(function () {
return Object.assign.apply(Object, [{
isDesktop: {},
isLargeDesktop: {},
isTablet: {},
isLargeMobile: {},
isMediumMobile: {},
prefersReducedMotion: {}
}].concat(_toConsumableArray(createMediaQueryList(breakpoints))));
}, [breakpoints]);
var getValue = React.useCallback(function () {
return Object.assign.apply(Object, [{
isDesktop: false,
isLargeDesktop: false,
isTablet: false,
isLargeMobile: false,
isMediumMobile: false,
prefersReducedMotion: false
}].concat(_toConsumableArray(Object.keys(mediaQueryLists).map(function (q) {
var _mediaQueryLists$q;
return _defineProperty({}, q, (_mediaQueryLists$q = mediaQueryLists[q]) === null || _mediaQueryLists$q === void 0 ? void 0 : _mediaQueryLists$q.matches);
}))));
}, [mediaQueryLists]);
var _React$useState = React.useState(getValue),
_React$useState2 = _slicedToArray(_React$useState, 2),
value = _React$useState2[0],
setValue = _React$useState2[1];
React.useEffect(function () {
var handler = function handler() {
return setValue(getValue);
};
Object.keys(mediaQueryLists).forEach(function (mql) {
mediaQueryLists[mql].addListener(handler);
});
return function () {
Object.keys(mediaQueryLists).forEach(function (mql) {
return mediaQueryLists[mql].addListener(handler);
});
};
}, [getValue, mediaQueryLists]);
return value;
};
export default useMediaQueryContext;