/
index.js
46 lines (37 loc) · 1.08 KB
/
index.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
import merge from "deepmerge";
import memoize from "micro-memoize";
import { Platform } from "react-native";
import mediaQuery from "./mediaquery.js";
const PREFIX = "@media";
function isMediaQuery(str) {
return typeof str === "string" && str.indexOf(PREFIX) === 0;
}
function filterMq(obj) {
return Object.keys(obj).filter(key => isMediaQuery(key));
}
function filterNonMq(obj) {
return Object.keys(obj).reduce((out, key) => {
if (!isMediaQuery(key) && key !== "__mediaQueries") {
out[key] = obj[key];
}
return out;
}, {});
}
const mFilterMq = memoize(filterMq);
const mFilterNonMq = memoize(filterNonMq);
export function process(obj, matchObject) {
const mqKeys = mFilterMq(obj);
let res = mFilterNonMq(obj);
mqKeys.forEach(key => {
if (/^@media\s+(not\s+)?(ios|android|dom|macos|web|windows)/i.test(key)) {
matchObject.type = Platform.OS;
} else {
matchObject.type = "screen";
}
const isMatch = mediaQuery.match(obj.__mediaQueries[key], matchObject);
if (isMatch) {
res = merge(res, obj[key]);
}
});
return res;
}