UNPKG

@appbuckets/react-ui

Version:
145 lines (142 loc) 3.59 kB
import { __rest, __read, __assign } from 'tslib'; import * as React from 'react'; import clsx from 'clsx'; import { createShorthandFactory, useElementType, childrenUtils, createHTMLImage, } from '@appbuckets/react-ui-core'; import { useSharedClassName, useSplitStateClassName, } from '../utils/customHook.js'; import '../BucketTheme/BucketTheme.js'; import { useWithDefaultProps } from '../BucketTheme/BucketContext.js'; import Badge from '../Badge/Badge.js'; import Icon from '../Icon/Icon.js'; import Popup from '../Popup/Popup.js'; /* -------- * Component Render * -------- */ var Avatar = function (receivedProps) { /** Get component props */ var props = useWithDefaultProps('avatar', receivedProps); var _a = useSharedClassName(props), className = _a.className, _b = _a.rest, badge = _b.badge, content = _b.content, children = _b.children, disabled = _b.disabled, flat = _b.flat, image = _b.image, icon = _b.icon, onClick = _b.onClick, tooltip = _b.tooltip, type = _b.type, rawRest = __rest(_b, [ 'badge', 'content', 'children', 'disabled', 'flat', 'image', 'icon', 'onClick', 'tooltip', 'type', ]); /** Get the component element type */ var ElementType = useElementType(Avatar, receivedProps, props); /** Split state className from rest props */ var _c = __read(useSplitStateClassName(rawRest), 2), stateClasses = _c[0], rest = _c[1]; /** Build the element class list */ var classes = clsx( { badged: badge, disabled: disabled, clickable: onClick, flat: flat, image: image, }, type, 'avatar', stateClasses, className ); /** Check if Component has Children */ var hasChildren = !childrenUtils.isNil(children); var handleClick = function (e) { /** Call user defined handler */ if (onClick && !disabled) { /** Disable event propagation */ e.stopPropagation(); onClick(e, props); } }; // ---- // Build Memoized Element // ---- var avatarContentElement = React.useMemo( function () { if (hasChildren || image) { return null; } if (icon) { return Icon.create(icon, { autoGenerateKey: false }); } return content; }, [image, icon, content, hasChildren] ); var imageContentElement = React.useMemo( function () { return ( image && createHTMLImage(image, { autoGenerateKey: false, defaultProps: { alt: 'avatar-image', }, }) ); }, [image] ); var badgeElement = React.useMemo( function () { return badge === true ? React.createElement(Badge, null) : Badge.create(badge, { autoGenerateKey: false, }); }, [badge] ); // ---- // Build the Element that could be wrapped inside a tooltip // ---- var avatarElement = React.createElement( ElementType, __assign({}, rest, { onClick: handleClick, className: classes }), !image && React.createElement( 'div', { className: 'content' }, hasChildren ? children : avatarContentElement ), imageContentElement, badgeElement ); return tooltip && !disabled ? React.createElement(Popup, { trigger: avatarElement, content: tooltip }) : avatarElement; }; Avatar.displayName = 'Avatar'; Avatar.create = createShorthandFactory(Avatar, function (content) { return { content: content }; }); export { Avatar as default };