@spaced-out/ui-design-system
Version:
Sense UI components library
128 lines (127 loc) • 4.85 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.AvatarGroup = void 0;
var React = _interopRequireWildcard(require("react"));
var _color = require("../../styles/variables/_color");
var _space = require("../../styles/variables/_space");
var _classify = _interopRequireDefault(require("../../utils/classify"));
var _Avatar = require("../Avatar");
var _Tooltip = require("../Tooltip");
var _AvatarGroupModule = _interopRequireDefault(require("./AvatarGroup.module.css"));
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
function _interopRequireWildcard(e, t) { if ("function" == typeof WeakMap) var r = new WeakMap(), n = new WeakMap(); return (_interopRequireWildcard = function (e, t) { if (!t && e && e.__esModule) return e; var o, i, f = { __proto__: null, default: e }; if (null === e || "object" != typeof e && "function" != typeof e) return f; if (o = t ? n : r) { if (o.has(e)) return o.get(e); o.set(e, f); } for (const t in e) "default" !== t && {}.hasOwnProperty.call(e, t) && ((i = (o = Object.defineProperty) && Object.getOwnPropertyDescriptor(e, t)) && (i.get || i.set) ? o(f, t, i) : f[t] = e[t]); return f; })(e, t); }
const COLOR_SEQUENCE = ['blue', 'green', 'orange', 'red', 'gray'];
const AvatarGroup = exports.AvatarGroup = /*#__PURE__*/React.forwardRef((_ref, ref) => {
let {
children,
size = 'medium',
borderColor = _color.colorBackgroundTertiary,
maxTooltipLines = 7,
placement = 'top',
maxAvatars = 5,
tooltipElevation
} = _ref;
const childAvatarCount = React.Children.count(children);
const leftOverlap = {
small: _space.spaceXXSmall,
medium: `${parseInt(_space.spaceSmall) / 2}px`,
large: _space.spaceXSmall,
extraLarge: _space.spaceSmall
};
let colorIndex = -1;
const avatarInGroup = (child, index, color) => {
const {
classNames,
text
} = child.props;
const {
wrapper,
...restClassNames
} = classNames || {};
const avatar = /*#__PURE__*/React.cloneElement(child, {
size,
classNames: {
wrapper: (0, _classify.default)(_AvatarGroupModule.default.avatarInGroup, wrapper),
...restClassNames
},
style: {
borderColor,
marginLeft: `-${index !== 0 ? leftOverlap[size] : 0}`
},
color
});
return text ? /*#__PURE__*/React.createElement(_Tooltip.Tooltip, {
body: text,
placement: placement,
elevation: tooltipElevation
}, avatar) : avatar;
};
const childrenArray = React.Children.toArray(children);
const totalAvatarCount = childrenArray.length;
const plusAvatar = () => {
const nameList = [];
for (let i = maxAvatars - 1; i < totalAvatarCount; i++) {
const child = childrenArray[i];
const {
text
} = child.props;
if (text) {
nameList.push(text);
}
}
const NameListNode = () => /*#__PURE__*/React.createElement("span", null, nameList.map(name => /*#__PURE__*/React.createElement(React.Fragment, {
key: name
}, name, /*#__PURE__*/React.createElement("br", null))));
return /*#__PURE__*/React.createElement(_Tooltip.Tooltip, {
body: /*#__PURE__*/React.createElement(NameListNode, null),
bodyMaxLines: maxTooltipLines,
placement: placement,
elevation: tooltipElevation
}, /*#__PURE__*/React.createElement("div", {
className: _AvatarGroupModule.default.plusAvatar
}, /*#__PURE__*/React.createElement(_Avatar.BaseAvatar, {
size: size,
color: "gray",
text: `+${childAvatarCount - maxAvatars + 1}`,
classNames: {
wrapper: _AvatarGroupModule.default.avatarInGroup
},
style: {
borderColor,
marginLeft: `-${leftOverlap[size]}`
}
})));
};
const childrenWithProps = React.Children.map(children, (child, index) => {
const {
imageSrc
} = child.props;
if (!imageSrc) {
colorIndex++;
if (colorIndex === COLOR_SEQUENCE.length) {
colorIndex = 0;
}
}
const color = COLOR_SEQUENCE[colorIndex];
if (childAvatarCount <= maxAvatars) {
return avatarInGroup(child, index, color);
} else {
if (index < maxAvatars - 1) {
return avatarInGroup(child, index, color);
} else if (index === maxAvatars) {
return plusAvatar();
}
}
});
return /*#__PURE__*/React.createElement("div", {
className: (0, _classify.default)(_AvatarGroupModule.default.avatarGroupContainer, {
[_AvatarGroupModule.default.extraLargeSize]: size === 'extraLarge',
[_AvatarGroupModule.default.largeSize]: size === 'large',
[_AvatarGroupModule.default.mediumSize]: size === 'medium',
[_AvatarGroupModule.default.smallSize]: size === 'small'
}),
ref: ref
}, childrenWithProps);
});