main
js 93 lines 2.28 KB
Raw
1 /**
2 * Copyright (c) Meta Platforms, Inc. and affiliates.
3 *
4 * This source code is licensed under the MIT license found in the
5 * LICENSE file in the root directory of this source tree.
6 *
7 * @flow
8 */
9
10 import type {BoxStyle} from './types';
11
12 /**
13 * This mirrors react-native/Libraries/Inspector/resolveBoxStyle.js (but without RTL support).
14 *
15 * Resolve a style property into it's component parts, e.g.
16 *
17 * resolveBoxStyle('margin', {margin: 5, marginBottom: 10})
18 * -> {top: 5, left: 5, right: 5, bottom: 10}
19 */
20 export default function resolveBoxStyle(
21 prefix: string,
22 style: Object,
23 ): BoxStyle | null {
24 let hasParts = false;
25 const result = {
26 bottom: 0,
27 left: 0,
28 right: 0,
29 top: 0,
30 };
31
32 const styleForAll = style[prefix];
33 if (styleForAll != null) {
34 // eslint-disable-next-line no-for-of-loops/no-for-of-loops
35 for (const key of Object.keys(result)) {
36 result[key] = styleForAll;
37 }
38 hasParts = true;
39 }
40
41 const styleForHorizontal = style[prefix + 'Horizontal'];
42 if (styleForHorizontal != null) {
43 result.left = styleForHorizontal;
44 result.right = styleForHorizontal;
45 hasParts = true;
46 } else {
47 const styleForLeft = style[prefix + 'Left'];
48 if (styleForLeft != null) {
49 result.left = styleForLeft;
50 hasParts = true;
51 }
52
53 const styleForRight = style[prefix + 'Right'];
54 if (styleForRight != null) {
55 result.right = styleForRight;
56 hasParts = true;
57 }
58
59 const styleForEnd = style[prefix + 'End'];
60 if (styleForEnd != null) {
61 // TODO RTL support
62 result.right = styleForEnd;
63 hasParts = true;
64 }
65 const styleForStart = style[prefix + 'Start'];
66 if (styleForStart != null) {
67 // TODO RTL support
68 result.left = styleForStart;
69 hasParts = true;
70 }
71 }
72
73 const styleForVertical = style[prefix + 'Vertical'];
74 if (styleForVertical != null) {
75 result.bottom = styleForVertical;
76 result.top = styleForVertical;
77 hasParts = true;
78 } else {
79 const styleForBottom = style[prefix + 'Bottom'];
80 if (styleForBottom != null) {
81 result.bottom = styleForBottom;
82 hasParts = true;
83 }
84
85 const styleForTop = style[prefix + 'Top'];
86 if (styleForTop != null) {
87 result.top = styleForTop;
88 hasParts = true;
89 }
90 }
91
92 return hasParts ? result : null;
93 }