UNPKG

@appbuckets/react-ui

Version:
139 lines (136 loc) 3.58 kB
import { __rest, __read, __assign } from 'tslib'; import * as React from 'react'; import clsx from 'clsx'; import { useElementType, childrenUtils } from '@appbuckets/react-ui-core'; import { useSharedClassName, useSplitStateClassName, } from '../utils/customHook.js'; import '../BucketTheme/BucketTheme.js'; import { useWithDefaultProps } from '../BucketTheme/BucketContext.js'; import Header from '../Header/Header.js'; import Icon from '../Icon/Icon.js'; /* -------- * Component Render * -------- */ var Toast = function (receivedProps) { var props = useWithDefaultProps('toast', receivedProps); var _a = useSharedClassName(props), className = _a.className, _b = _a.rest, children = _b.children, content = _b.content, dismiss = _b.dismiss, dismissible = _b.dismissible, header = _b.header, icon = _b.icon, onClick = _b.onClick, rawRest = __rest(_b, [ 'children', 'content', 'dismiss', 'dismissible', 'header', 'icon', 'onClick', ]); /** get the Element Type */ var ElementType = useElementType(Toast, receivedProps, props); /** Split state className from rest props */ var _c = __read(useSplitStateClassName(rawRest), 2), stateClassName = _c[0], rest = _c[1]; /** Build classname */ var classes = clsx( 'toast', typeof onClick === 'function' && 'clickable', stateClassName, className ); /** Build Handlers */ var handleClick = function (e) { if (typeof onClick === 'function') { onClick(e, props); } }; var handleDismiss = React.useCallback( function (e) { /** Stop the Main Propagation of event */ e.stopPropagation(); if (typeof dismiss === 'function') { dismiss(); } }, [dismiss] ); /* -------- * Build the Toast Content using Shorthand * -------- */ var toastContent = React.useMemo( function () { return Header.create( { content: header, subheader: content, icon: icon, }, { autoGenerateKey: false } ); }, [header, content, icon] ); var dismissIcon = React.useMemo( function () { return ( dismissible && (typeof dismissible === 'boolean' ? Icon.create( { name: 'times', onClick: handleDismiss }, { autoGenerateKey: false, defaultProps: { className: 'dismiss', }, overrideProps: { onClick: handleDismiss, }, } ) : Icon.create(dismissible, { autoGenerateKey: false, defaultProps: { className: 'dismiss', }, overrideProps: { onClick: handleDismiss, }, })) ); }, // @ts-ignore [dismissible, handleDismiss] ); /* -------- * If element has children, render them * -------- */ if (!childrenUtils.isNil(children)) { return React.createElement( ElementType, __assign({}, rest, { className: classes, onClick: handleClick }), typeof children === 'function' ? children({ dismiss: handleDismiss }) : children ); } /* -------- * Render the Component * -------- */ return React.createElement( ElementType, __assign({}, rest, { className: classes, onClick: handleClick }), toastContent, dismissIcon ); }; Toast.displayName = 'Toast'; export { Toast as default };