123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118 |
- "use strict";
- var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault").default;
- Object.defineProperty(exports, "__esModule", {
- value: true
- });
- exports.responsiveArray = exports.matchScreen = exports.default = void 0;
- var _react = _interopRequireDefault(require("react"));
- var _internal = require("../theme/internal");
- var _mediaQueryUtil = require("./mediaQueryUtil");
- const responsiveArray = exports.responsiveArray = ['xxl', 'xl', 'lg', 'md', 'sm', 'xs'];
- const getResponsiveMap = token => ({
- xs: `(max-width: ${token.screenXSMax}px)`,
- sm: `(min-width: ${token.screenSM}px)`,
- md: `(min-width: ${token.screenMD}px)`,
- lg: `(min-width: ${token.screenLG}px)`,
- xl: `(min-width: ${token.screenXL}px)`,
- xxl: `(min-width: ${token.screenXXL}px)`
- });
- /**
- * Ensures that the breakpoints token are valid, in good order
- * For each breakpoint : screenMin <= screen <= screenMax and screenMax <= nextScreenMin
- */
- const validateBreakpoints = token => {
- const indexableToken = token;
- const revBreakpoints = [].concat(responsiveArray).reverse();
- revBreakpoints.forEach((breakpoint, i) => {
- const breakpointUpper = breakpoint.toUpperCase();
- const screenMin = `screen${breakpointUpper}Min`;
- const screen = `screen${breakpointUpper}`;
- if (!(indexableToken[screenMin] <= indexableToken[screen])) {
- throw new Error(`${screenMin}<=${screen} fails : !(${indexableToken[screenMin]}<=${indexableToken[screen]})`);
- }
- if (i < revBreakpoints.length - 1) {
- const screenMax = `screen${breakpointUpper}Max`;
- if (!(indexableToken[screen] <= indexableToken[screenMax])) {
- throw new Error(`${screen}<=${screenMax} fails : !(${indexableToken[screen]}<=${indexableToken[screenMax]})`);
- }
- const nextBreakpointUpperMin = revBreakpoints[i + 1].toUpperCase();
- const nextScreenMin = `screen${nextBreakpointUpperMin}Min`;
- if (!(indexableToken[screenMax] <= indexableToken[nextScreenMin])) {
- throw new Error(`${screenMax}<=${nextScreenMin} fails : !(${indexableToken[screenMax]}<=${indexableToken[nextScreenMin]})`);
- }
- }
- });
- return token;
- };
- const matchScreen = (screens, screenSizes) => {
- if (!screenSizes) {
- return;
- }
- for (const breakpoint of responsiveArray) {
- if (screens[breakpoint] && (screenSizes === null || screenSizes === void 0 ? void 0 : screenSizes[breakpoint]) !== undefined) {
- return screenSizes[breakpoint];
- }
- }
- };
- exports.matchScreen = matchScreen;
- const useResponsiveObserver = () => {
- const [, token] = (0, _internal.useToken)();
- const responsiveMap = getResponsiveMap(validateBreakpoints(token));
- // To avoid repeat create instance, we add `useMemo` here.
- return _react.default.useMemo(() => {
- const subscribers = new Map();
- let subUid = -1;
- let screens = {};
- return {
- responsiveMap,
- matchHandlers: {},
- dispatch(pointMap) {
- screens = pointMap;
- subscribers.forEach(func => func(screens));
- return subscribers.size >= 1;
- },
- subscribe(func) {
- if (!subscribers.size) {
- this.register();
- }
- subUid += 1;
- subscribers.set(subUid, func);
- func(screens);
- return subUid;
- },
- unsubscribe(paramToken) {
- subscribers.delete(paramToken);
- if (!subscribers.size) {
- this.unregister();
- }
- },
- register() {
- Object.entries(responsiveMap).forEach(([screen, mediaQuery]) => {
- const listener = ({
- matches
- }) => {
- this.dispatch(Object.assign(Object.assign({}, screens), {
- [screen]: matches
- }));
- };
- const mql = window.matchMedia(mediaQuery);
- (0, _mediaQueryUtil.addMediaQueryListener)(mql, listener);
- this.matchHandlers[mediaQuery] = {
- mql,
- listener
- };
- listener(mql);
- });
- },
- unregister() {
- Object.values(responsiveMap).forEach(mediaQuery => {
- const handler = this.matchHandlers[mediaQuery];
- (0, _mediaQueryUtil.removeMediaQueryListener)(handler === null || handler === void 0 ? void 0 : handler.mql, handler === null || handler === void 0 ? void 0 : handler.listener);
- });
- subscribers.clear();
- }
- };
- }, [token]);
- };
- var _default = exports.default = useResponsiveObserver;
|