UNPKG

@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.

94 lines (74 loc) 3.58 kB
"use strict"; var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard").default; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault").default; Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; var _objectSpread2 = _interopRequireDefault(require("@babel/runtime/helpers/objectSpread2")); var React = _interopRequireWildcard(require("react")); var _useTheme = _interopRequireDefault(require("../useTheme")); var _mediaQuery = require("../../utils/mediaQuery"); var _QueryContext = _interopRequireWildcard(require("../../ThemeProvider/QueryContext")); const QUERIES = ["isMediumMobile", "isLargeMobile", "isTablet", "isDesktop", "isLargeDesktop", "prefersReducedMotion"]; const useMediaQuery = () => { const theme = (0, _useTheme.default)(); const contextValue = React.useContext(_QueryContext.default); const [result, setResult] = React.useState(contextValue); // if context value is anything other than initial, it's available const hasContext = React.useMemo(() => QUERIES.some(query => contextValue[query] !== _QueryContext.initialValue[query]), [contextValue]); React.useEffect(() => { let mqListMap; const listenerMap = {}; // if context is available, skip computing if (!hasContext && typeof window !== "undefined" && typeof window.matchMedia === "function") { const createMqList = (query, mediaQuery) => { const mqList = window.matchMedia(mediaQuery); listenerMap[query] = ({ matches }) => { setResult(prev => { const next = (0, _objectSpread2.default)({}, prev); next[query] = matches; return next; }); }; if (typeof mqList.addEventListener === "function") { mqList.addEventListener("change", listenerMap[query]); } else { // for browsers like Safari 13 mqList.addListener(listenerMap[query]); } return mqList; }; mqListMap = { isMediumMobile: createMqList("isMediumMobile", (0, _mediaQuery.getBreakpointWidth)("mediumMobile", theme)), isLargeMobile: createMqList("isLargeMobile", (0, _mediaQuery.getBreakpointWidth)("largeMobile", theme)), isTablet: createMqList("isTablet", (0, _mediaQuery.getBreakpointWidth)("tablet", theme)), isDesktop: createMqList("isDesktop", (0, _mediaQuery.getBreakpointWidth)("desktop", theme)), isLargeDesktop: createMqList("isLargeDesktop", (0, _mediaQuery.getBreakpointWidth)("largeDesktop", theme)), prefersReducedMotion: createMqList("prefersReducedMotion", "(prefers-reduced-motion: reduce)") }; // initialize setResult(prev => { const next = (0, _objectSpread2.default)({}, prev); QUERIES.forEach(query => { next[query] = mqListMap[query].matches; }); return QUERIES.every(query => next[query] === prev[query]) ? prev : next; }); } return () => { if (mqListMap) { QUERIES.forEach(query => { if (typeof mqListMap[query].removeEventListener === "function") { mqListMap[query].removeEventListener("change", listenerMap[query]); } else { // for browsers like Safari 13 mqListMap[query].removeListener(listenerMap[query]); } }); } }; }, [theme, hasContext]); // forward context if it's available return hasContext ? contextValue : result; }; var _default = useMediaQuery; exports.default = _default;