@megafon/ui-core 3.10.1 → 3.12.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -33,6 +33,20 @@ export interface INotificationProps {
33
33
  hasCloseButton?: boolean;
34
34
  /** Заголовок */
35
35
  title?: string;
36
+ /** Короткий текст, отображаемый при закрытом расхлопе */
37
+ shortText?: string;
38
+ /** заголовок закрытого расхлопа */
39
+ closeCollapseTitle?: string;
40
+ /** заголовок открытого расхлопа */
41
+ openCollapseTitle?: string;
42
+ /** Управление состоянием открыт/закрыт расхлопа "Подробнее" */
43
+ isCollapseOpened?: boolean;
44
+ /** Текст кнопки */
45
+ buttonText?: string;
46
+ /** Лоадер кнопки */
47
+ buttonLoader?: boolean;
48
+ /** Заблокировать кнопку */
49
+ buttonDisable?: boolean;
36
50
  /** Текст ссылки внизу уведомления */
37
51
  link?: string;
38
52
  /** rel - аргумент тега <a> для ссылки */
@@ -50,11 +64,17 @@ export interface INotificationProps {
50
64
  text?: Record<string, string>;
51
65
  link?: Record<string, string>;
52
66
  close?: Record<string, string>;
67
+ button?: Record<string, string>;
68
+ collapseButton?: Record<string, string>;
53
69
  };
54
70
  /** Обработчик на закрытие */
55
71
  onClose?: () => void;
56
72
  /** Обработчик клика по ссылке */
57
73
  onLinkClick?: () => void;
74
+ /** Обработчик клика по кнопке */
75
+ onButtonClick?: () => void;
76
+ /** Обработчик клика по кнопке расхлопа */
77
+ onCollapseButtonClick?: (value: boolean) => void;
58
78
  }
59
79
  declare const Notification: React.FC<INotificationProps>;
60
80
  export default Notification;
@@ -11,14 +11,20 @@ require("core-js/modules/es.object.values");
11
11
 
12
12
  require("core-js/modules/es.string.link");
13
13
 
14
+ require("core-js/modules/web.timers");
15
+
16
+ var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
17
+
14
18
  var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends"));
15
19
 
16
- var _react = _interopRequireDefault(require("react"));
20
+ var _react = _interopRequireWildcard(require("react"));
17
21
 
18
22
  var _uiHelpers = require("@megafon/ui-helpers");
19
23
 
20
24
  var PropTypes = _interopRequireWildcard(require("prop-types"));
21
25
 
26
+ var _Button = _interopRequireDefault(require("../Button/Button"));
27
+
22
28
  var _Header = _interopRequireDefault(require("../Header/Header"));
23
29
 
24
30
  var _TextLink = _interopRequireDefault(require("../TextLink/TextLink"));
@@ -41,6 +47,26 @@ var ErrorIcon = function ErrorIcon(props) {
41
47
  }));
42
48
  };
43
49
 
50
+ var ArrowDown = function ArrowDown(props) {
51
+ return /*#__PURE__*/_react["default"].createElement("svg", (0, _extends2["default"])({
52
+ viewBox: "0 0 20 20"
53
+ }, props), /*#__PURE__*/_react["default"].createElement("path", {
54
+ d: "M6 8h8l-4 5z",
55
+ fillRule: "evenodd",
56
+ clipRule: "evenodd"
57
+ }));
58
+ };
59
+
60
+ var ArrowUp = function ArrowUp(props) {
61
+ return /*#__PURE__*/_react["default"].createElement("svg", (0, _extends2["default"])({
62
+ viewBox: "0 0 20 20"
63
+ }, props), /*#__PURE__*/_react["default"].createElement("path", {
64
+ d: "M14 12H6l4-5z",
65
+ fillRule: "evenodd",
66
+ clipRule: "evenodd"
67
+ }));
68
+ };
69
+
44
70
  var RightArrow = function RightArrow(props) {
45
71
  return /*#__PURE__*/_react["default"].createElement("svg", (0, _extends2["default"])({
46
72
  viewBox: "0 0 20 20"
@@ -83,6 +109,7 @@ var CancelIcon = function CancelIcon(props) {
83
109
  }));
84
110
  };
85
111
 
112
+ var TIMEOUT_DELAY = 400;
86
113
  var NotificationTypes = {
87
114
  SUCCESS: 'success',
88
115
  WARNING: 'warning',
@@ -115,6 +142,18 @@ var Notification = function Notification(_ref) {
115
142
  isColored = _ref$isColored === void 0 ? true : _ref$isColored,
116
143
  hasCloseButton = _ref.hasCloseButton,
117
144
  title = _ref.title,
145
+ shortText = _ref.shortText,
146
+ _ref$closeCollapseTit = _ref.closeCollapseTitle,
147
+ closeCollapseTitle = _ref$closeCollapseTit === void 0 ? 'Подробнее' : _ref$closeCollapseTit,
148
+ _ref$openCollapseTitl = _ref.openCollapseTitle,
149
+ openCollapseTitle = _ref$openCollapseTitl === void 0 ? 'Свернуть' : _ref$openCollapseTitl,
150
+ _ref$isCollapseOpened = _ref.isCollapseOpened,
151
+ isCollapseOpened = _ref$isCollapseOpened === void 0 ? false : _ref$isCollapseOpened,
152
+ buttonText = _ref.buttonText,
153
+ _ref$buttonLoader = _ref.buttonLoader,
154
+ buttonLoader = _ref$buttonLoader === void 0 ? false : _ref$buttonLoader,
155
+ _ref$buttonDisable = _ref.buttonDisable,
156
+ buttonDisable = _ref$buttonDisable === void 0 ? false : _ref$buttonDisable,
118
157
  link = _ref.link,
119
158
  rel = _ref.rel,
120
159
  href = _ref.href,
@@ -122,7 +161,84 @@ var Notification = function Notification(_ref) {
122
161
  icon = _ref.icon,
123
162
  dataAttrs = _ref.dataAttrs,
124
163
  onClose = _ref.onClose,
125
- onLinkClick = _ref.onLinkClick;
164
+ onLinkClick = _ref.onLinkClick,
165
+ onButtonClick = _ref.onButtonClick,
166
+ onCollapseButtonClick = _ref.onCollapseButtonClick;
167
+ var shortTextRef = (0, _react.useRef)(null);
168
+ var fullTextRef = (0, _react.useRef)(null);
169
+ var wrapTextRef = (0, _react.useRef)(null);
170
+
171
+ var _useState = (0, _react.useState)(isCollapseOpened),
172
+ _useState2 = (0, _slicedToArray2["default"])(_useState, 2),
173
+ showFullText = _useState2[0],
174
+ setShowFullText = _useState2[1];
175
+
176
+ var _useState3 = (0, _react.useState)(false),
177
+ _useState4 = (0, _slicedToArray2["default"])(_useState3, 2),
178
+ updateTextHeight = _useState4[0],
179
+ setUpdateTextHeight = _useState4[1];
180
+
181
+ var initialTextClasses = {
182
+ "short": {
183
+ hidden: shortText && showFullText
184
+ },
185
+ full: {
186
+ visible: showFullText
187
+ }
188
+ };
189
+
190
+ var _useState5 = (0, _react.useState)(initialTextClasses),
191
+ _useState6 = (0, _slicedToArray2["default"])(_useState5, 2),
192
+ textClasses = _useState6[0],
193
+ setTextClass = _useState6[1];
194
+
195
+ var hasBottom = shortText || buttonText || link;
196
+ var isErrorType = type === NotificationTypes.ERROR;
197
+ (0, _react.useEffect)(function () {
198
+ setShowFullText(isCollapseOpened);
199
+ }, [isCollapseOpened]);
200
+ (0, _react.useEffect)(function () {
201
+ if (!fullTextRef.current || !shortTextRef.current || !wrapTextRef.current) {
202
+ return undefined;
203
+ }
204
+
205
+ var visibleElement = showFullText ? shortTextRef.current : fullTextRef.current;
206
+
207
+ var _visibleElement$getBo = visibleElement.getBoundingClientRect(),
208
+ height = _visibleElement$getBo.height;
209
+
210
+ wrapTextRef.current.style.height = "".concat(height, "px");
211
+ return setUpdateTextHeight(!updateTextHeight); // не должен запускаться при изменении флага updateTextHeight;
212
+ // eslint-disable-next-line react-hooks/exhaustive-deps
213
+ }, [showFullText]);
214
+ (0, _react.useEffect)(function () {
215
+ if (!fullTextRef.current || !shortTextRef.current || !wrapTextRef.current) {
216
+ return undefined;
217
+ }
218
+
219
+ var hiddenElement = showFullText ? fullTextRef.current : shortTextRef.current;
220
+
221
+ var _hiddenElement$getBou = hiddenElement.getBoundingClientRect(),
222
+ height = _hiddenElement$getBou.height;
223
+
224
+ wrapTextRef.current.style.height = "".concat(height, "px");
225
+ setTextClass(initialTextClasses);
226
+ var timeoutId = setTimeout(function () {
227
+ if (wrapTextRef.current) {
228
+ wrapTextRef.current.style.height = 'auto';
229
+ }
230
+ }, TIMEOUT_DELAY);
231
+ return function () {
232
+ clearTimeout(timeoutId);
233
+ }; // не должен запускаться при изменении флага showFullText;
234
+ // запускается по флагу updateTextHeight, который изменяется в предыдущем эффекте.
235
+ // eslint-disable-next-line react-hooks/exhaustive-deps
236
+ }, [updateTextHeight]);
237
+
238
+ var handleCollapseButtonClick = function handleCollapseButtonClick() {
239
+ setShowFullText(!showFullText);
240
+ onCollapseButtonClick === null || onCollapseButtonClick === void 0 ? void 0 : onCollapseButtonClick(!showFullText);
241
+ };
126
242
 
127
243
  var renderLink = function renderLink() {
128
244
  return /*#__PURE__*/_react["default"].createElement(_TextLink["default"], {
@@ -135,10 +251,38 @@ var Notification = function Notification(_ref) {
135
251
  href: href,
136
252
  target: target
137
253
  }, link, /*#__PURE__*/_react["default"].createElement(RightArrow, {
138
- className: cn('right-arrow')
254
+ className: cn('link-arrow')
139
255
  }));
140
256
  };
141
257
 
258
+ var renderButton = function renderButton() {
259
+ return /*#__PURE__*/_react["default"].createElement(_Button["default"], {
260
+ className: cn('button'),
261
+ dataAttrs: {
262
+ root: dataAttrs === null || dataAttrs === void 0 ? void 0 : dataAttrs.button
263
+ },
264
+ sizeAll: "small",
265
+ sizeMobile: "extra-small",
266
+ theme: isErrorType && isColored ? 'white' : 'green',
267
+ showLoader: buttonLoader,
268
+ disabled: buttonDisable,
269
+ ellipsis: !buttonLoader,
270
+ onClick: onButtonClick
271
+ }, buttonText);
272
+ };
273
+
274
+ var renderCollapseButton = function renderCollapseButton() {
275
+ return /*#__PURE__*/_react["default"].createElement("button", (0, _extends2["default"])({}, (0, _uiHelpers.filterDataAttrs)(dataAttrs === null || dataAttrs === void 0 ? void 0 : dataAttrs.collapseButton), {
276
+ type: "button",
277
+ className: cn('collapse-button'),
278
+ onClick: handleCollapseButtonClick
279
+ }), showFullText ? openCollapseTitle : closeCollapseTitle, /*#__PURE__*/_react["default"].createElement("div", {
280
+ className: cn('collapse-arrow', {
281
+ close: showFullText
282
+ })
283
+ }, showFullText ? /*#__PURE__*/_react["default"].createElement(ArrowUp, null) : /*#__PURE__*/_react["default"].createElement(ArrowDown, null)));
284
+ };
285
+
142
286
  var renderIcon = function renderIcon() {
143
287
  if (icon) {
144
288
  return icon;
@@ -179,19 +323,33 @@ var Notification = function Notification(_ref) {
179
323
  className: cn('icon-container')
180
324
  }, renderIcon()), /*#__PURE__*/_react["default"].createElement("div", {
181
325
  className: cn('content', [contentClass])
326
+ }, /*#__PURE__*/_react["default"].createElement("div", {
327
+ className: cn('text-container')
182
328
  }, title && /*#__PURE__*/_react["default"].createElement(_Header["default"], {
183
329
  dataAttrs: {
184
330
  root: dataAttrs === null || dataAttrs === void 0 ? void 0 : dataAttrs.title
185
331
  },
186
332
  as: "h5",
187
- className: cn('title', {
188
- 'close-padding': hasCloseButton
189
- })
190
- }, title), /*#__PURE__*/_react["default"].createElement("p", (0, _extends2["default"])({}, (0, _uiHelpers.filterDataAttrs)(dataAttrs === null || dataAttrs === void 0 ? void 0 : dataAttrs.text), {
333
+ className: cn('title')
334
+ }, title), /*#__PURE__*/_react["default"].createElement("div", (0, _extends2["default"])({
335
+ ref: wrapTextRef
336
+ }, (0, _uiHelpers.filterDataAttrs)(dataAttrs === null || dataAttrs === void 0 ? void 0 : dataAttrs.text), {
191
337
  className: cn('text', {
192
338
  'close-padding': hasCloseButton && !title
193
339
  })
194
- }), children), link && renderLink())), hasCloseButton && /*#__PURE__*/_react["default"].createElement("button", (0, _extends2["default"])({}, (0, _uiHelpers.filterDataAttrs)(dataAttrs === null || dataAttrs === void 0 ? void 0 : dataAttrs.close), {
340
+ }), /*#__PURE__*/_react["default"].createElement("div", {
341
+ ref: shortTextRef,
342
+ className: cn('short-text', textClasses["short"])
343
+ }, shortText || children), shortText && /*#__PURE__*/_react["default"].createElement("div", {
344
+ ref: fullTextRef,
345
+ className: cn('full-text', textClasses.full)
346
+ }, children))), hasBottom && /*#__PURE__*/_react["default"].createElement("div", {
347
+ className: cn('bottom', {
348
+ 'has-button': !!buttonText
349
+ })
350
+ }, (buttonText || link) && /*#__PURE__*/_react["default"].createElement("div", {
351
+ className: cn('bottom-block')
352
+ }, buttonText && renderButton(), link && !shortText && renderLink()), shortText && renderCollapseButton()))), hasCloseButton && /*#__PURE__*/_react["default"].createElement("button", (0, _extends2["default"])({}, (0, _uiHelpers.filterDataAttrs)(dataAttrs === null || dataAttrs === void 0 ? void 0 : dataAttrs.close), {
195
353
  className: cn('close'),
196
354
  type: "button",
197
355
  onClick: onClose
@@ -212,6 +370,13 @@ Notification.propTypes = {
212
370
  isColored: PropTypes.bool,
213
371
  hasCloseButton: PropTypes.bool,
214
372
  title: PropTypes.string,
373
+ shortText: PropTypes.string,
374
+ closeCollapseTitle: PropTypes.string,
375
+ openCollapseTitle: PropTypes.string,
376
+ isCollapseOpened: PropTypes.bool,
377
+ buttonText: PropTypes.string,
378
+ buttonLoader: PropTypes.bool,
379
+ buttonDisable: PropTypes.bool,
215
380
  link: PropTypes.string,
216
381
  rel: PropTypes.string,
217
382
  href: PropTypes.string,
@@ -222,10 +387,14 @@ Notification.propTypes = {
222
387
  title: PropTypes.objectOf(PropTypes.string.isRequired),
223
388
  text: PropTypes.objectOf(PropTypes.string.isRequired),
224
389
  link: PropTypes.objectOf(PropTypes.string.isRequired),
225
- close: PropTypes.objectOf(PropTypes.string.isRequired)
390
+ close: PropTypes.objectOf(PropTypes.string.isRequired),
391
+ button: PropTypes.objectOf(PropTypes.string.isRequired),
392
+ collapseButton: PropTypes.objectOf(PropTypes.string.isRequired)
226
393
  }),
227
394
  onClose: PropTypes.func,
228
- onLinkClick: PropTypes.func
395
+ onLinkClick: PropTypes.func,
396
+ onButtonClick: PropTypes.func,
397
+ onCollapseButtonClick: PropTypes.func
229
398
  };
230
399
  var _default = Notification;
231
400
  exports["default"] = _default;
@@ -9,6 +9,7 @@ export interface ITabProps {
9
9
  /** Дополнительные data атрибуты к внутренним элементам */
10
10
  dataAttrs?: {
11
11
  root?: Record<string, string>;
12
+ inner?: Record<string, string>;
12
13
  };
13
14
  /** Дочерние элементы */
14
15
  children?: React.ReactNode;
@@ -25,7 +25,8 @@ var Tab = function Tab(_ref) {
25
25
 
26
26
  Tab.propTypes = {
27
27
  dataAttrs: _propTypes["default"].shape({
28
- root: _propTypes["default"].objectOf(_propTypes["default"].string.isRequired)
28
+ root: _propTypes["default"].objectOf(_propTypes["default"].string.isRequired),
29
+ inner: _propTypes["default"].objectOf(_propTypes["default"].string.isRequired)
29
30
  }),
30
31
  title: _propTypes["default"].string,
31
32
  icon: _propTypes["default"].node,
@@ -299,15 +299,15 @@ var Tabs = function Tabs(_ref) {
299
299
  var rootRefNode = rootRef.current;
300
300
  rootRefNode && ((_a = intersectionObserverRef.current) === null || _a === void 0 ? void 0 : _a.unobserve(outerObserveContainer || rootRefNode));
301
301
  }, [outerObserveContainer]);
302
- var renderTab = React.useCallback(function (index, title, icon, href) {
302
+ var renderTab = React.useCallback(function (index, title, icon, href, attr) {
303
303
  var ElementType = href ? 'a' : 'div';
304
- return /*#__PURE__*/React.createElement(ElementType, {
304
+ return /*#__PURE__*/React.createElement(ElementType, (0, _extends2["default"])({
305
305
  href: href,
306
306
  className: cn('tab-inner', {
307
307
  current: currentIndex === index
308
308
  }),
309
309
  onClick: handleTabInnerClick(index)
310
- }, !!icon && /*#__PURE__*/React.createElement("div", {
310
+ }, (0, _uiHelpers.filterDataAttrs)(attr, index + 1)), !!icon && /*#__PURE__*/React.createElement("div", {
311
311
  className: cn('tab-icon')
312
312
  }, icon), !!title && /*#__PURE__*/React.createElement("div", {
313
313
  className: cn('tab-title')
@@ -321,7 +321,7 @@ var Tabs = function Tabs(_ref) {
321
321
  href = _child$props.href,
322
322
  renderTabWrapper = _child$props.renderTabWrapper,
323
323
  data = _child$props.dataAttrs;
324
- var tab = renderTab(i, title, icon, href);
324
+ var tab = renderTab(i, title, icon, href, data === null || data === void 0 ? void 0 : data.inner);
325
325
  var activeTabClassName = currentIndex === i ? activeTabClass : undefined;
326
326
  return /*#__PURE__*/React.createElement(_react2.SwiperSlide, {
327
327
  className: cn('slide')
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@megafon/ui-core",
3
- "version": "3.10.1",
3
+ "version": "3.12.1",
4
4
  "files": [
5
5
  "dist",
6
6
  "styles"
@@ -97,5 +97,5 @@
97
97
  "react-popper": "^2.2.3",
98
98
  "swiper": "^6.5.6"
99
99
  },
100
- "gitHead": "ab5598d6f428c21c22d939ed586a3795b3d6467a"
100
+ "gitHead": "d951676f8c48d197b6107b4e90b04ea245cf0649"
101
101
  }