RN: Fix Element Inspector w/ Start + End Styles

Summary:
Fixes how the element inspector displays start and end styles (e.g. `marginStart` or `paddingEnd`).

@public

Reviewed By: TheSavior

Differential Revision: D8607581

fbshipit-source-id: e949927fd86e9b21a8ecf26fbf3e4863ad1486bd
This commit is contained in:
Tim Yung 2018-06-26 13:31:07 -07:00 committed by Facebook Github Bot
parent 537a99539b
commit bfea0e5524
1 changed files with 96 additions and 41 deletions

View File

@ -10,48 +10,103 @@
'use strict';
/**
* Resolve a style property into it's component parts, e.g.
*
* resolveProperties('margin', {margin: 5, marginBottom: 10})
* ->
* {top: 5, left: 5, right: 5, bottom: 10}
*
* If none are set, returns false.
*/
function resolveBoxStyle(prefix: string, style: Object): ?Object {
const res = {};
const subs = ['top', 'left', 'bottom', 'right'];
let set = false;
subs.forEach(sub => {
res[sub] = style[prefix] || 0;
});
if (style[prefix]) {
set = true;
}
if (style[prefix + 'Vertical']) {
res.top = res.bottom = style[prefix + 'Vertical'];
set = true;
}
if (style[prefix + 'Horizontal']) {
res.left = res.right = style[prefix + 'Horizontal'];
set = true;
}
subs.forEach(sub => {
const val = style[prefix + capFirst(sub)];
if (val) {
res[sub] = val;
set = true;
}
});
if (!set) {
return;
}
return res;
}
const I18nManager = require('I18nManager');
function capFirst(text) {
return text[0].toUpperCase() + text.slice(1);
/**
* 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) {
if (I18nManager.isRTL && I18nManager.doLeftAndRightSwapInRTL) {
result.left = styleForEnd;
} else {
result.right = styleForEnd;
}
hasParts = true;
}
const styleForStart = style[prefix + 'Start'];
if (styleForStart != null) {
if (I18nManager.isRTL && I18nManager.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;