one
Version:
One is a React framework for web, iOS, and Android apps.
127 lines (125 loc) • 4.07 kB
JavaScript
function resolveSafeAreaEdgeModes(edges) {
var all = [
"top",
"right",
"bottom",
"left"
];
if (edges == null) {
return {
top: "additive",
right: "additive",
bottom: "additive",
left: "additive"
};
}
if (Array.isArray(edges)) {
return Object.fromEntries(all.map(function(edge) {
return [edge, edges.includes(edge) ? "additive" : "off"];
}));
}
return Object.fromEntries(all.map(function(edge) {
var mode = edges[edge];
return [edge, mode === "maximum" || mode === "additive" || mode === "off" ? mode : "off"];
}));
}
function flattenStyle(style, resolveStyle) {
if (!style) return {};
if (resolveStyle) {
var resolved = resolveStyle(style);
if (!resolved || typeof resolved !== "object" || Array.isArray(resolved)) {
return flattenStyle(resolved);
}
return resolved;
}
if (Array.isArray(style)) {
return Object.assign({}, ...style.map(function(entry) {
return flattenStyle(entry);
}));
}
if (typeof style === "number") {
throw new Error("buildSafeAreaInsetStyle cannot read a registered StyleSheet ID without resolveStyle; pass StyleSheet.flatten");
}
return typeof style === "object" ? style : {};
}
function readBaseInset(style, mode, edge) {
var capitalized = edge.charAt(0).toUpperCase() + edge.slice(1);
var exact = style[`${mode}${capitalized}`];
if (typeof exact === "number") return exact;
var axis = edge === "top" || edge === "bottom" ? style[`${mode}Vertical`] : style[`${mode}Horizontal`];
if (typeof axis === "number") return axis;
var base = style[mode];
return typeof base === "number" ? base : 0;
}
function buildSafeAreaInsetStyle(options) {
var mode = options.mode === "margin" ? "margin" : "padding";
var flattened = flattenStyle(options.style, options.resolveStyle);
var edgeModes = resolveSafeAreaEdgeModes(options.edges);
var output = {};
for (var _i = 0, _iter = [
"top",
"right",
"bottom",
"left"
]; _i < _iter.length; _i++) {
var edge = _iter[_i];
var base = readBaseInset(flattened, mode, edge);
var inset = options.insets[edge];
var edgeMode = edgeModes[edge];
var value = edgeMode === "off" ? base : edgeMode === "maximum" ? Math.max(base, inset) : base + inset;
output[`${mode}${edge.charAt(0).toUpperCase() + edge.slice(1)}`] = value;
}
return output;
}
function keyboardSafeBottom(systemBottom, stableBottom) {
return Math.min(systemBottom, stableBottom);
}
function resolveOverlappingInsets(options) {
var { windowInsets, windowWidth, windowHeight, visibleLeft, visibleTop, viewWidth, viewHeight } = options;
return {
top: Math.max(windowInsets.top - visibleTop, 0),
right: Math.max(Math.min(visibleLeft + viewWidth - windowWidth, 0) + windowInsets.right, 0),
bottom: Math.max(Math.min(visibleTop + viewHeight - windowHeight, 0) + windowInsets.bottom, 0),
left: Math.max(windowInsets.left - visibleLeft, 0)
};
}
function providerEventToMetrics(payload) {
var _iteratorNormalCompletion = true, _didIteratorError = false, _iteratorError = void 0;
try {
for (var _iterator = Object.entries(payload)[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {
var [key, value] = _step.value;
if (typeof value !== "number" || !Number.isFinite(value)) {
throw new Error(`OneNativeSafeAreaProvider emitted non-finite ${key}`);
}
}
} catch (err) {
_didIteratorError = true;
_iteratorError = err;
} finally {
try {
if (!_iteratorNormalCompletion && _iterator.return != null) {
_iterator.return();
}
} finally {
if (_didIteratorError) {
throw _iteratorError;
}
}
}
return {
insets: {
top: payload.insetTop,
right: payload.insetRight,
bottom: payload.insetBottom,
left: payload.insetLeft
},
frame: {
x: payload.frameX,
y: payload.frameY,
width: payload.frameWidth,
height: payload.frameHeight
}
};
}
export { buildSafeAreaInsetStyle, keyboardSafeBottom, providerEventToMetrics, resolveOverlappingInsets, resolveSafeAreaEdgeModes };
//# sourceMappingURL=insets.native.js.map