UNPKG

@helpscout/hsds-react

Version:

React component library for Help Scout's Design System

227 lines (174 loc) 7.65 kB
"use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); exports.__esModule = true; exports.default = exports.Message = void 0; var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends")); var _objectWithoutPropertiesLoose2 = _interopRequireDefault(require("@babel/runtime/helpers/objectWithoutPropertiesLoose")); var _inheritsLoose2 = _interopRequireDefault(require("@babel/runtime/helpers/inheritsLoose")); var _react = _interopRequireDefault(require("react")); var _propTypes = _interopRequireDefault(require("prop-types")); var _getValidProps = _interopRequireDefault(require("@helpscout/react-utils/dist/getValidProps")); var _Flexy = _interopRequireDefault(require("../Flexy")); var _Text = _interopRequireDefault(require("../Text")); var _Message = _interopRequireDefault(require("./Message.Action")); var _Message2 = _interopRequireDefault(require("./Message.Attachment")); var _Message3 = _interopRequireDefault(require("./Message.Bubble")); var _Message4 = _interopRequireDefault(require("./Message.Caption")); var _Message5 = _interopRequireDefault(require("./Message.Chat")); var _Message6 = _interopRequireDefault(require("./Message.Content")); var _Message7 = _interopRequireDefault(require("./Message.Embed")); var _Message8 = _interopRequireDefault(require("./Message.Media")); var _Message9 = _interopRequireDefault(require("./Message.Provider")); var _classnames = _interopRequireDefault(require("classnames")); var _component = require("../../utilities/component"); var _lodash = _interopRequireDefault(require("lodash.isstring")); var _Message10 = require("./Message.css"); var _jsxRuntime = require("react/jsx-runtime"); function noop() {} var Message = /*#__PURE__*/function (_React$PureComponent) { (0, _inheritsLoose2.default)(Message, _React$PureComponent); function Message() { var _this; for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) { args[_key] = arguments[_key]; } _this = _React$PureComponent.call.apply(_React$PureComponent, [this].concat(args)) || this; _this.shouldShowAvatar = function () { var _this$props = _this.props, from = _this$props.from, showAvatar = _this$props.showAvatar; // This prevents spacing issues when children include // `Message.Action` which requires the full width of the screen. if (_this.childrenIncludeActionTypeComponent()) return false; return _this.isThemeEmbed() ? from && showAvatar || false : !!showAvatar; }; _this.childrenIncludeActionTypeComponent = function () { var children = _this.props.children; var childArray = _react.default.Children.toArray(children); return childArray.some(function (child) { var componentName = (0, _component.getComponentName)(child); return componentName === 'MessageAction'; }); }; _this.isThemeEmbed = function () { var theme = _this.context.theme; return theme === 'embed'; }; _this.getAvatarMarkup = function () { var avatar = _this.props.avatar; var isThemeEmbed = _this.isThemeEmbed(); if (!_this.shouldShowAvatar()) return null; var avatarMarkup = avatar ? /*#__PURE__*/_react.default.cloneElement(avatar, { shape: 'circle', size: isThemeEmbed ? 'xxs' : 'xs' }) : null; return /*#__PURE__*/(0, _jsxRuntime.jsx)(_Flexy.default.Item, { className: "c-Message__avatar-block", children: avatarMarkup }); }; _this.getChildrenMarkup = function () { var _this$props2 = _this.props, children = _this$props2.children, from = _this$props2.from, ltr = _this$props2.ltr, rtl = _this$props2.rtl, to = _this$props2.to; return _react.default.Children.map(children, function (child) { if (!child) return child; return /*#__PURE__*/_react.default.cloneElement(child, { from: from, ltr: ltr, rtl: rtl, to: to }); }); }; _this.getFromMarkup = function () { var from = _this.props.from; var fromName = (0, _lodash.default)(from) ? from : null; if (!(_this.isThemeEmbed() && fromName)) return null; return /*#__PURE__*/(0, _jsxRuntime.jsx)("div", { className: "c-Message__from", children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_Text.default, { className: "c-Message__fromText", block: true, lineHeightReset: true, shade: "faint", size: "11", children: fromName }) }); }; return _this; } var _proto = Message.prototype; _proto.render = function render() { var _this$props3 = this.props, avatar = _this$props3.avatar, children = _this$props3.children, className = _this$props3.className, isNote = _this$props3.isNote, ltr = _this$props3.ltr, rtl = _this$props3.rtl, from = _this$props3.from, showAvatar = _this$props3.showAvatar, to = _this$props3.to, rest = (0, _objectWithoutPropertiesLoose2.default)(_this$props3, ["avatar", "children", "className", "isNote", "ltr", "rtl", "from", "showAvatar", "to"]); var theme = this.context.theme; var componentClassName = (0, _classnames.default)('c-Message', avatar && 'has-avatar', from && 'is-from', theme && "is-theme-" + theme, to && 'is-to', className); var avatarMarkup = this.getAvatarMarkup(); var childrenMarkup = this.getChildrenMarkup(); var fromMarkup = this.getFromMarkup(); return /*#__PURE__*/(0, _jsxRuntime.jsxs)(_Message10.MessageUI, (0, _extends2.default)({}, (0, _getValidProps.default)(rest), { className: componentClassName, children: [fromMarkup, /*#__PURE__*/(0, _jsxRuntime.jsxs)(_Flexy.default, { align: "top", gap: "xs", children: [from && avatarMarkup, /*#__PURE__*/(0, _jsxRuntime.jsx)(_Flexy.default.Block, { className: "c-Message__block", children: childrenMarkup }), to && avatarMarkup] })] })); }; return Message; }(_react.default.PureComponent); exports.Message = Message; Message.contextTypes = { theme: noop }; Message.Action = _Message.default; Message.Attachment = _Message2.default; Message.Bubble = _Message3.default; Message.Caption = _Message4.default; Message.Chat = _Message5.default; Message.Content = _Message6.default; Message.Embed = _Message7.default; Message.Media = _Message8.default; Message.Provider = _Message9.default; Message.defaultProps = { 'data-cy': 'Message', showAvatar: true }; Message.propTypes = { /** An `Avatar` component containing author details. */ avatar: _propTypes.default.any, /** Custom class names to be added to the component. */ className: _propTypes.default.string, /** Provides author information and applies "From" styles. */ from: _propTypes.default.oneOfType([_propTypes.default.string, _propTypes.default.bool]), /** Applies the "Note" theme styles. */ isNote: _propTypes.default.bool, /** Applies left-to-right text styles. */ ltr: _propTypes.default.bool, /** Applies right-to-left text styles. */ rtl: _propTypes.default.bool, /** Renders a space for the Avatar to appear. Default is `true`. */ showAvatar: _propTypes.default.bool, /** Provides author information and applies "To" styles. */ to: _propTypes.default.bool, /** Data attr for Cypress tests. */ 'data-cy': _propTypes.default.string }; var _default = Message; exports.default = _default;