115 lines
2.7 KiB
JavaScript
115 lines
2.7 KiB
JavaScript
|
/**
|
||
|
* Copyright (c) Facebook, Inc. and its affiliates.
|
||
|
*
|
||
|
* This source code is licensed under the MIT license found in the
|
||
|
* LICENSE file in the root directory of this source tree.
|
||
|
*
|
||
|
* @format
|
||
|
* @flow
|
||
|
*/
|
||
|
|
||
|
'use strict';
|
||
|
|
||
|
const I18nManager = require('../ReactNative/I18nManager');
|
||
|
|
||
|
/**
|
||
|
* Resolve a style property into its component parts.
|
||
|
*
|
||
|
* For example:
|
||
|
*
|
||
|
* > resolveProperties('margin', {margin: 5, marginBottom: 10})
|
||
|
* {top: 5, left: 5, right: 5, bottom: 10}
|
||
|
*
|
||
|
* If no parts exist, this returns null.
|
||
|
*/
|
||
|
function resolveBoxStyle(
|
||
|
prefix: string,
|
||
|
style: Object,
|
||
|
): ?$ReadOnly<{|
|
||
|
bottom: number,
|
||
|
left: number,
|
||
|
right: number,
|
||
|
top: number,
|
||
|
|}> {
|
||
|
let hasParts = false;
|
||
|
const result = {
|
||
|
bottom: 0,
|
||
|
left: 0,
|
||
|
right: 0,
|
||
|
top: 0,
|
||
|
};
|
||
|
|
||
|
// TODO: Fix issues with multiple properties affecting the same side.
|
||
|
|
||
|
const styleForAll = style[prefix];
|
||
|
if (styleForAll != null) {
|
||
|
for (const key of Object.keys(result)) {
|
||
|
result[key] = styleForAll;
|
||
|
}
|
||
|
hasParts = true;
|
||
|
}
|
||
|
|
||
|
const styleForHorizontal = style[prefix + 'Horizontal'];
|
||
|
if (styleForHorizontal != null) {
|
||
|
result.left = styleForHorizontal;
|
||
|
result.right = styleForHorizontal;
|
||
|
hasParts = true;
|
||
|
} else {
|
||
|
const styleForLeft = style[prefix + 'Left'];
|
||
|
if (styleForLeft != null) {
|
||
|
result.left = styleForLeft;
|
||
|
hasParts = true;
|
||
|
}
|
||
|
|
||
|
const styleForRight = style[prefix + 'Right'];
|
||
|
if (styleForRight != null) {
|
||
|
result.right = styleForRight;
|
||
|
hasParts = true;
|
||
|
}
|
||
|
|
||
|
const styleForEnd = style[prefix + 'End'];
|
||
|
if (styleForEnd != null) {
|
||
|
const constants = I18nManager.getConstants();
|
||
|
if (constants.isRTL && constants.doLeftAndRightSwapInRTL) {
|
||
|
result.left = styleForEnd;
|
||
|
} else {
|
||
|
result.right = styleForEnd;
|
||
|
}
|
||
|
hasParts = true;
|
||
|
}
|
||
|
const styleForStart = style[prefix + 'Start'];
|
||
|
if (styleForStart != null) {
|
||
|
const constants = I18nManager.getConstants();
|
||
|
if (constants.isRTL && constants.doLeftAndRightSwapInRTL) {
|
||
|
result.right = styleForStart;
|
||
|
} else {
|
||
|
result.left = styleForStart;
|
||
|
}
|
||
|
hasParts = true;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
const styleForVertical = style[prefix + 'Vertical'];
|
||
|
if (styleForVertical != null) {
|
||
|
result.bottom = styleForVertical;
|
||
|
result.top = styleForVertical;
|
||
|
hasParts = true;
|
||
|
} else {
|
||
|
const styleForBottom = style[prefix + 'Bottom'];
|
||
|
if (styleForBottom != null) {
|
||
|
result.bottom = styleForBottom;
|
||
|
hasParts = true;
|
||
|
}
|
||
|
|
||
|
const styleForTop = style[prefix + 'Top'];
|
||
|
if (styleForTop != null) {
|
||
|
result.top = styleForTop;
|
||
|
hasParts = true;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
return hasParts ? result : null;
|
||
|
}
|
||
|
|
||
|
module.exports = resolveBoxStyle;
|