native-layout-stack
Version:
SwiftUI like layout management
81 lines (80 loc) • 3.97 kB
JavaScript
var __assign = (this && this.__assign) || function () {
__assign = Object.assign || function(t) {
for (var s, i = 1, n = arguments.length; i < n; i++) {
s = arguments[i];
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
t[p] = s[p];
}
return t;
};
return __assign.apply(this, arguments);
};
var __rest = (this && this.__rest) || function (s, e) {
var t = {};
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
t[p] = s[p];
if (s != null && typeof Object.getOwnPropertySymbols === "function")
for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
t[p[i]] = s[p[i]];
}
return t;
};
var __spreadArray = (this && this.__spreadArray) || function (to, from) {
for (var i = 0, il = from.length, j = to.length; i < il; i++, j++)
to[j] = from[i];
return to;
};
import React, { useCallback, useMemo } from 'react';
import { StyleSheet, View } from 'react-native';
import randomColor from 'randomcolor';
import { useStack } from '../hooks';
import { preparePaddings } from '../helpers/preparePaddings';
export var Stack = function (_a) {
var children = _a.children, spaces = _a.spaces, padding = _a.padding, omitNull = _a.omitNull, style = _a.style, props = __rest(_a, ["children", "spaces", "padding", "omitNull", "style"]);
var globalConfig = useStack();
// TODO refactor
var stackSpaces = useMemo(function () { return spaces !== null && spaces !== void 0 ? spaces : globalConfig.spaces; }, [globalConfig.spaces, spaces]);
var stackPadding = useMemo(function () { return padding !== null && padding !== void 0 ? padding : globalConfig.padding; }, [globalConfig.padding, padding]);
var stackOmitNull = useMemo(function () { return omitNull !== null && omitNull !== void 0 ? omitNull : globalConfig.omitNull; }, [globalConfig.omitNull, omitNull]);
var isSpacer = useMemo(function () { return typeof stackSpaces === 'number' || typeof stackSpaces === 'string'; }, [stackSpaces]);
var renderDivider = useCallback(function () { return (React.createElement(View, { style: StyleSheet.flatten([
{
minWidth: stackSpaces,
minHeight: stackSpaces,
},
// TODO refactor
globalConfig.debug && {
backgroundColor: globalConfig.debugColor || randomColor(),
},
]) })); }, [globalConfig.debug, globalConfig.debugColor, stackSpaces]);
var addSpaces = useCallback(function (index) {
if (!isSpacer)
return [];
return React.cloneElement(renderDivider(), {
key: "stack-divider-" + index,
});
}, [isSpacer, renderDivider]);
var renderStack = useCallback(function () {
var elements = Array.isArray(children) ? children : [children];
elements = elements.filter(function (child) {
return Array.isArray(child) || React.isValidElement(child);
});
return elements.reduce(function (children, child, index) {
var _a;
if (children.length === 0) {
return [child];
}
// TODO refactor
if ((stackOmitNull && child === null) ||
((_a = child) === null || _a === void 0 ? void 0 : _a.type) === React.Fragment) {
return __spreadArray(__spreadArray([], children), [child]);
}
return __spreadArray(__spreadArray([], children), [addSpaces(index), child]);
}, []);
}, [addSpaces, children, stackOmitNull]);
return (React.createElement(View, __assign({}, props, { style: StyleSheet.flatten([
style,
preparePaddings(stackPadding || 0, globalConfig.debug),
]) }), renderStack()));
};