UNPKG

5.2 kBJavaScriptView Raw
1'use strict';
2
3Object.defineProperty(exports, "__esModule", {
4 value: true
5});
6
7var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };
8
9exports.default = resolveMediaQueries;
10var _windowMatchMedia = void 0;
11function _getWindowMatchMedia(ExecutionEnvironment) {
12 if (_windowMatchMedia === undefined) {
13 _windowMatchMedia = !!ExecutionEnvironment.canUseDOM && !!window && !!window.matchMedia && function (mediaQueryString) {
14 return window.matchMedia(mediaQueryString);
15 } || null;
16 }
17 return _windowMatchMedia;
18}
19
20function _filterObject(obj, predicate) {
21 return Object.keys(obj).filter(function (key) {
22 return predicate(obj[key], key);
23 }).reduce(function (result, key) {
24 result[key] = obj[key];
25 return result;
26 }, {});
27}
28
29function _removeMediaQueries(style) {
30 return Object.keys(style).reduce(function (styleWithoutMedia, key) {
31 if (key.indexOf('@media') !== 0) {
32 styleWithoutMedia[key] = style[key];
33 }
34 return styleWithoutMedia;
35 }, {});
36}
37
38function _topLevelRulesToCSS(_ref) {
39 var addCSS = _ref.addCSS,
40 appendImportantToEachValue = _ref.appendImportantToEachValue,
41 cssRuleSetToString = _ref.cssRuleSetToString,
42 hash = _ref.hash,
43 isNestedStyle = _ref.isNestedStyle,
44 style = _ref.style,
45 userAgent = _ref.userAgent;
46
47 var className = '';
48 Object.keys(style).filter(function (name) {
49 return name.indexOf('@media') === 0;
50 }).map(function (query) {
51 var topLevelRules = appendImportantToEachValue(_filterObject(style[query], function (value) {
52 return !isNestedStyle(value);
53 }));
54
55 if (!Object.keys(topLevelRules).length) {
56 return;
57 }
58
59 var ruleCSS = cssRuleSetToString('', topLevelRules, userAgent);
60
61 // CSS classes cannot start with a number
62 var mediaQueryClassName = 'rmq-' + hash(query + ruleCSS);
63 var css = query + '{ .' + mediaQueryClassName + ruleCSS + '}';
64
65 addCSS(css);
66
67 className += (className ? ' ' : '') + mediaQueryClassName;
68 });
69 return className;
70}
71
72function _subscribeToMediaQuery(_ref2) {
73 var listener = _ref2.listener,
74 listenersByQuery = _ref2.listenersByQuery,
75 matchMedia = _ref2.matchMedia,
76 mediaQueryListsByQuery = _ref2.mediaQueryListsByQuery,
77 query = _ref2.query;
78
79 query = query.replace('@media ', '');
80
81 var mql = mediaQueryListsByQuery[query];
82 if (!mql && matchMedia) {
83 mediaQueryListsByQuery[query] = mql = matchMedia(query);
84 }
85
86 if (!listenersByQuery || !listenersByQuery[query]) {
87 mql.addListener(listener);
88
89 listenersByQuery[query] = {
90 remove: function remove() {
91 mql.removeListener(listener);
92 }
93 };
94 }
95 return mql;
96}
97
98function resolveMediaQueries(_ref3) {
99 var ExecutionEnvironment = _ref3.ExecutionEnvironment,
100 addCSS = _ref3.addCSS,
101 appendImportantToEachValue = _ref3.appendImportantToEachValue,
102 config = _ref3.config,
103 cssRuleSetToString = _ref3.cssRuleSetToString,
104 getComponentField = _ref3.getComponentField,
105 getGlobalState = _ref3.getGlobalState,
106 hash = _ref3.hash,
107 isNestedStyle = _ref3.isNestedStyle,
108 mergeStyles = _ref3.mergeStyles,
109 props = _ref3.props,
110 setState = _ref3.setState,
111 style = _ref3.style;
112
113 // eslint-disable-line no-shadow
114 var newStyle = _removeMediaQueries(style);
115 var mediaQueryClassNames = _topLevelRulesToCSS({
116 addCSS: addCSS,
117 appendImportantToEachValue: appendImportantToEachValue,
118 cssRuleSetToString: cssRuleSetToString,
119 hash: hash,
120 isNestedStyle: isNestedStyle,
121 style: style,
122 userAgent: config.userAgent
123 });
124
125 var newProps = mediaQueryClassNames ? {
126 className: mediaQueryClassNames + (props.className ? ' ' + props.className : '')
127 } : null;
128
129 var matchMedia = config.matchMedia || _getWindowMatchMedia(ExecutionEnvironment);
130
131 if (!matchMedia) {
132 return {
133 props: newProps,
134 style: newStyle
135 };
136 }
137
138 var listenersByQuery = _extends({}, getComponentField('_radiumMediaQueryListenersByQuery'));
139 var mediaQueryListsByQuery = getGlobalState('mediaQueryListsByQuery') || {};
140
141 Object.keys(style).filter(function (name) {
142 return name.indexOf('@media') === 0;
143 }).map(function (query) {
144 var nestedRules = _filterObject(style[query], isNestedStyle);
145
146 if (!Object.keys(nestedRules).length) {
147 return;
148 }
149
150 var mql = _subscribeToMediaQuery({
151 listener: function listener() {
152 return setState(query, mql.matches, '_all');
153 },
154 listenersByQuery: listenersByQuery,
155 matchMedia: matchMedia,
156 mediaQueryListsByQuery: mediaQueryListsByQuery,
157 query: query
158 });
159
160 // Apply media query states
161 if (mql.matches) {
162 newStyle = mergeStyles([newStyle, nestedRules]);
163 }
164 });
165
166 return {
167 componentFields: {
168 _radiumMediaQueryListenersByQuery: listenersByQuery
169 },
170 globalState: { mediaQueryListsByQuery: mediaQueryListsByQuery },
171 props: newProps,
172 style: newStyle
173 };
174}
175module.exports = exports['default'];
\No newline at end of file