UNPKG

@kiwicom/orbit-components

Version:

Orbit-components is a React component library which provides developers with the easiest possible way of building Kiwi.com’s products.

132 lines (112 loc) 5 kB
"use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault").default; var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard").default; Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; var React = _interopRequireWildcard(require("react")); var _styledComponents = _interopRequireWildcard(require("styled-components")); var _mediaQuery = _interopRequireDefault(require("../utils/mediaQuery")); var _Stack = _interopRequireDefault(require("../Stack")); var _defaultTheme = _interopRequireDefault(require("../defaultTheme")); var _Text = _interopRequireDefault(require("../Text")); var _helpers = require("./helpers"); var _useTheme = _interopRequireDefault(require("../hooks/useTheme")); var _useSwipe = _interopRequireDefault(require("./hooks/useSwipe")); var _mergeRefs = _interopRequireDefault(require("../utils/mergeRefs")); const StyledWrapper = (0, _styledComponents.default)(({ className, children, dataTest, ariaLive }) => /*#__PURE__*/React.createElement("div", { className: className, "data-test": dataTest, "aria-live": ariaLive, role: "status" }, children)).withConfig({ displayName: "ToastMessage__StyledWrapper", componentId: "sc-16dx2jq-0" })(["", ""], ({ theme, placement, offsetY, offsetX, opacity }) => (0, _styledComponents.css)(["z-index:", ";will-change:transform;cursor:grab;opacity:", ";transition:all ", " ease-in-out;transform:translate(", "px,", "px);", ";"], theme.orbit.zIndexOnTheTop, opacity, theme.orbit.durationNormal, offsetX, offsetY, (0, _helpers.getPositionStyle)(placement))); // $FlowFixMe: https://github.com/flow-typed/flow-typed/issues/3653#issuecomment-568539198 StyledWrapper.defaultProps = { theme: _defaultTheme.default }; const StyledInnerWrapper = _styledComponents.default.div.withConfig({ displayName: "ToastMessage__StyledInnerWrapper", componentId: "sc-16dx2jq-1" })(["", ""], ({ theme, visible, duration, isPaused }) => (0, _styledComponents.css)(["position:relative;border-radius:", ";background:", ";padding:", ";width:100%;overflow:hidden;will-change:transform;pointer-events:", ";animation:", " ", " forwards;animation-play-state:", ";svg{min-height:20px;}", "}", ""], theme.orbit.borderRadiusLarge, theme.orbit.paletteInkNormal, theme.orbit.spaceXSmall, visible ? "auto" : "none", visible ? _helpers.fadeIn : _helpers.fadeOut, theme.orbit.durationNormal, isPaused ? "paused" : "running", _mediaQuery.default.largeMobile((0, _styledComponents.css)(["max-width:360px;width:initial;padding:", ";"], theme.orbit.spaceSmall)), (0, _styledComponents.css)(["&:before{content:\"\";will-change:transform;position:absolute;border-radius:", ";top:0;z-index:1;left:0;width:100%;height:100%;background:", ";opacity:0.1;animation:", " ", "ms linear;animation-play-state:", ";}"], theme.orbit.borderRadiusLarge, theme.orbit.paletteWhite, _helpers.lightAnimation, duration, isPaused ? "paused" : "running"))); // $FlowFixMe: https://github.com/flow-typed/flow-typed/issues/3653#issuecomment-568539198 StyledInnerWrapper.defaultProps = { theme: _defaultTheme.default }; const ToastMessage = ({ id, onUpdateHeight, onMouseEnter, onMouseLeave, visible, onDismiss, dismissTimeout, placement, icon, children, offset, ariaLive }) => { const theme = (0, _useTheme.default)(); const measurerRef = React.useMemo(() => (0, _helpers.createRectRef)(({ height }) => onUpdateHeight(id, height)), // it's safer to include children as well because if they change then we need to remeasure // eslint-disable-next-line react-hooks/exhaustive-deps [onUpdateHeight, id, children]); const innerRef = React.useRef(null); const mergedRef = React.useMemo(() => (0, _mergeRefs.default)([measurerRef, innerRef]), [measurerRef]); const [isPaused, setPaused] = React.useState(false); const { swipeOffset, swipeOpacity } = (0, _useSwipe.default)(innerRef, onDismiss, 50, placement.match(/right|center/) ? "right" : "left"); return /*#__PURE__*/React.createElement(StyledWrapper, { ariaLive: ariaLive, opacity: swipeOpacity, visible: visible, offsetY: offset, offsetX: swipeOffset, placement: placement }, /*#__PURE__*/React.createElement(StyledInnerWrapper, { visible: visible, ref: mergedRef, isPaused: isPaused, duration: dismissTimeout, onMouseEnter: () => { onMouseEnter(); setPaused(true); }, onMouseLeave: () => { onMouseLeave(); setPaused(false); } }, /*#__PURE__*/React.createElement(_Stack.default, { flex: true, shrink: true, spacing: "XSmall" }, icon && /*#__PURE__*/React.isValidElement(icon) && /*#__PURE__*/React.cloneElement(icon, { size: "small", customColor: theme.orbit.paletteWhite }), /*#__PURE__*/React.createElement(_Text.default, { type: "white" }, children)))); }; var _default = ToastMessage; exports.default = _default;