UNPKG

@appbuckets/react-ui

Version:
122 lines (119 loc) 3.15 kB
import { __rest, __read, __assign } from 'tslib'; import * as React from 'react'; import clsx from 'clsx'; import { useElementType, childrenUtils, createShorthandFactory, } from '@appbuckets/react-ui-core'; import { useSharedClassName, useSplitStateClassName, } from '../utils/customHook.js'; import '../BucketTheme/BucketTheme.js'; import { useWithDefaultProps } from '../BucketTheme/BucketContext.js'; import Icon from '../Icon/Icon.js'; import LabelGroup from './LabelGroup.js'; /* -------- * Component Render * -------- */ var Label = function (receivedProps) { var props = useWithDefaultProps('label', receivedProps); var _a = useSharedClassName(props), className = _a.className, _b = _a.rest, children = _b.children, content = _b.content, disabled = _b.disabled, icon = _b.icon, onClick = _b.onClick, onRemove = _b.onRemove, removable = _b.removable, rawRest = __rest(_b, [ 'children', 'content', 'disabled', 'icon', 'onClick', 'onRemove', 'removable', ]); /** Get the component element type */ var ElementType = useElementType(Label, 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( onClick && 'clickable', { removable: removable, disabled: disabled }, 'label', stateClasses, className ); /** Use an Hook to define the click handler */ var handleClick = function (e) { if (onClick) { /** Force the Stop Propagation of event */ e.stopPropagation(); onClick(e, props); } }; /** Compute the Icon Element */ var iconElement = React.useMemo( function () { return Icon.create(icon, { autoGenerateKey: false, }); }, [icon] ); /** Compute the Remove Button */ var removeButton = React.useMemo( function () { if (!removable) { return null; } var handleLabelRemove = function (e) { if (!disabled && onRemove) { onRemove(e, props); } }; return Icon.create( typeof removable === 'boolean' ? { name: 'times' } : removable, { autoGenerateKey: false, defaultProps: { className: 'remove', name: 'times' }, overrideProps: { disabled: disabled, onClick: handleLabelRemove, }, } ); }, [removable, disabled, onRemove, props] ); /** Render the Component */ return React.createElement( ElementType, __assign({}, rest, { className: classes, onClick: handleClick }), React.createElement( 'span', { className: 'content' }, iconElement, React.createElement( 'span', null, childrenUtils.isNil(children) ? content : children ), removeButton ) ); }; Label.displayName = 'Label'; Label.Group = LabelGroup; Label.create = createShorthandFactory(Label, function (content) { return { content: content }; }); export { Label as default };