UNPKG

7.01 kBJavaScriptView Raw
1import _extends from "@babel/runtime/helpers/esm/extends";
2import _defineProperty from "@babel/runtime/helpers/esm/defineProperty";
3import _typeof from "@babel/runtime/helpers/esm/typeof";
4import _slicedToArray from "@babel/runtime/helpers/esm/slicedToArray";
5var __rest = this && this.__rest || function (s, e) {
6 var t = {};
7 for (var p in s) {
8 if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0) t[p] = s[p];
9 }
10 if (s != null && typeof Object.getOwnPropertySymbols === "function") for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
11 if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i])) t[p[i]] = s[p[i]];
12 }
13 return t;
14};
15import classNames from 'classnames';
16import * as React from 'react';
17import { ConfigContext } from '../config-provider';
18import useFlexGapSupport from '../_util/hooks/useFlexGapSupport';
19import ResponsiveObserve, { responsiveArray } from '../_util/responsiveObserve';
20import { tuple } from '../_util/type';
21import RowContext from './RowContext';
22import { useRowStyle } from './style';
23var RowAligns = tuple('top', 'middle', 'bottom', 'stretch');
24var RowJustify = tuple('start', 'end', 'center', 'space-around', 'space-between', 'space-evenly');
25function useMergePropByScreen(oriProp, screen) {
26 var _React$useState = React.useState(typeof oriProp === 'string' ? oriProp : ''),
27 _React$useState2 = _slicedToArray(_React$useState, 2),
28 prop = _React$useState2[0],
29 setProp = _React$useState2[1];
30 var clacMergeAlignOrJustify = function clacMergeAlignOrJustify() {
31 if (_typeof(oriProp) !== 'object') {
32 return;
33 }
34 for (var i = 0; i < responsiveArray.length; i++) {
35 var breakpoint = responsiveArray[i];
36 // if do not match, do nothing
37 if (!screen[breakpoint]) continue;
38 var curVal = oriProp[breakpoint];
39 if (curVal !== undefined) {
40 setProp(curVal);
41 return;
42 }
43 }
44 };
45 React.useEffect(function () {
46 clacMergeAlignOrJustify();
47 }, [JSON.stringify(oriProp), screen]);
48 return prop;
49}
50var Row = /*#__PURE__*/React.forwardRef(function (props, ref) {
51 var _classNames;
52 var customizePrefixCls = props.prefixCls,
53 justify = props.justify,
54 align = props.align,
55 className = props.className,
56 style = props.style,
57 children = props.children,
58 _props$gutter = props.gutter,
59 gutter = _props$gutter === void 0 ? 0 : _props$gutter,
60 wrap = props.wrap,
61 others = __rest(props, ["prefixCls", "justify", "align", "className", "style", "children", "gutter", "wrap"]);
62 var _React$useContext = React.useContext(ConfigContext),
63 getPrefixCls = _React$useContext.getPrefixCls,
64 direction = _React$useContext.direction;
65 var _React$useState3 = React.useState({
66 xs: true,
67 sm: true,
68 md: true,
69 lg: true,
70 xl: true,
71 xxl: true
72 }),
73 _React$useState4 = _slicedToArray(_React$useState3, 2),
74 screens = _React$useState4[0],
75 setScreens = _React$useState4[1];
76 // to save screens info when responsiveObserve callback had been call
77 var _React$useState5 = React.useState({
78 xs: false,
79 sm: false,
80 md: false,
81 lg: false,
82 xl: false,
83 xxl: false
84 }),
85 _React$useState6 = _slicedToArray(_React$useState5, 2),
86 curScreens = _React$useState6[0],
87 setCurScreens = _React$useState6[1];
88 // ================================== calc reponsive data ==================================
89 var mergeAlign = useMergePropByScreen(align, curScreens);
90 var mergeJustify = useMergePropByScreen(justify, curScreens);
91 var supportFlexGap = useFlexGapSupport();
92 var gutterRef = React.useRef(gutter);
93 // ================================== Effect ==================================
94 React.useEffect(function () {
95 var token = ResponsiveObserve.subscribe(function (screen) {
96 setCurScreens(screen);
97 var currentGutter = gutterRef.current || 0;
98 if (!Array.isArray(currentGutter) && _typeof(currentGutter) === 'object' || Array.isArray(currentGutter) && (_typeof(currentGutter[0]) === 'object' || _typeof(currentGutter[1]) === 'object')) {
99 setScreens(screen);
100 }
101 });
102 return function () {
103 return ResponsiveObserve.unsubscribe(token);
104 };
105 }, []);
106 // ================================== Render ==================================
107 var getGutter = function getGutter() {
108 var results = [undefined, undefined];
109 var normalizedGutter = Array.isArray(gutter) ? gutter : [gutter, undefined];
110 normalizedGutter.forEach(function (g, index) {
111 if (_typeof(g) === 'object') {
112 for (var i = 0; i < responsiveArray.length; i++) {
113 var breakpoint = responsiveArray[i];
114 if (screens[breakpoint] && g[breakpoint] !== undefined) {
115 results[index] = g[breakpoint];
116 break;
117 }
118 }
119 } else {
120 results[index] = g;
121 }
122 });
123 return results;
124 };
125 var prefixCls = getPrefixCls('row', customizePrefixCls);
126 var _useRowStyle = useRowStyle(prefixCls),
127 _useRowStyle2 = _slicedToArray(_useRowStyle, 2),
128 wrapSSR = _useRowStyle2[0],
129 hashId = _useRowStyle2[1];
130 var gutters = getGutter();
131 var classes = classNames(prefixCls, (_classNames = {}, _defineProperty(_classNames, prefixCls + "-no-wrap", wrap === false), _defineProperty(_classNames, prefixCls + "-" + mergeJustify, mergeJustify), _defineProperty(_classNames, prefixCls + "-" + mergeAlign, mergeAlign), _defineProperty(_classNames, prefixCls + "-rtl", direction === 'rtl'), _classNames), className, hashId);
132 // Add gutter related style
133 var rowStyle = {};
134 var horizontalGutter = gutters[0] != null && gutters[0] > 0 ? gutters[0] / -2 : undefined;
135 var verticalGutter = gutters[1] != null && gutters[1] > 0 ? gutters[1] / -2 : undefined;
136 if (horizontalGutter) {
137 rowStyle.marginLeft = horizontalGutter;
138 rowStyle.marginRight = horizontalGutter;
139 }
140 if (supportFlexGap) {
141 // Set gap direct if flex gap support
142 var _gutters = _slicedToArray(gutters, 2);
143 rowStyle.rowGap = _gutters[1];
144 } else if (verticalGutter) {
145 rowStyle.marginTop = verticalGutter;
146 rowStyle.marginBottom = verticalGutter;
147 }
148 // "gutters" is a new array in each rendering phase, it'll make 'React.useMemo' effectless.
149 // So we deconstruct "gutters" variable here.
150 var _gutters2 = _slicedToArray(gutters, 2),
151 gutterH = _gutters2[0],
152 gutterV = _gutters2[1];
153 var rowContext = React.useMemo(function () {
154 return {
155 gutter: [gutterH, gutterV],
156 wrap: wrap,
157 supportFlexGap: supportFlexGap
158 };
159 }, [gutterH, gutterV, wrap, supportFlexGap]);
160 return wrapSSR( /*#__PURE__*/React.createElement(RowContext.Provider, {
161 value: rowContext
162 }, /*#__PURE__*/React.createElement("div", _extends({}, others, {
163 className: classes,
164 style: _extends(_extends({}, rowStyle), style),
165 ref: ref
166 }), children)));
167});
168if (process.env.NODE_ENV !== 'production') {
169 Row.displayName = 'Row';
170}
171export default Row;
\No newline at end of file