antd
Version:
An enterprise-class UI design language and React components implementation
103 lines (102 loc) • 3.44 kB
JavaScript
"use client";
import * as React from 'react';
import { clsx } from 'clsx';
import { pickClosable, useClosable, useMergeSemantic } from '../_util/hooks';
import { useComponentConfig } from '../config-provider/context';
import Skeleton from '../skeleton';
const DrawerPanel = props => {
const {
prefixCls,
ariaId,
title,
footer,
extra,
closable,
loading,
onClose,
headerStyle,
bodyStyle,
footerStyle,
children,
classNames: drawerClassNames,
styles: drawerStyles
} = props;
const drawerContext = useComponentConfig('drawer');
const {
classNames: contextClassNames,
styles: contextStyles
} = drawerContext;
const [mergedClassNames, mergedStyles] = useMergeSemantic([contextClassNames, drawerClassNames], [contextStyles, drawerStyles], {
props
});
let closablePlacement;
if (closable === false) {
closablePlacement = undefined;
} else if (closable === undefined || closable === true) {
closablePlacement = 'start';
} else {
closablePlacement = closable?.placement === 'end' ? 'end' : 'start';
}
const customCloseIconRender = React.useCallback(icon => (/*#__PURE__*/React.createElement("button", {
type: "button",
onClick: onClose,
className: clsx(`${prefixCls}-close`, {
[`${prefixCls}-close-${closablePlacement}`]: closablePlacement === 'end'
}, mergedClassNames.close),
style: mergedStyles.close
}, icon)), [onClose, prefixCls, closablePlacement, mergedClassNames.close, mergedStyles.close]);
const [mergedClosable, mergedCloseIcon] = useClosable(pickClosable(props), pickClosable(drawerContext), {
closable: true,
closeIconRender: customCloseIconRender
});
const renderHeader = () => {
if (!title && !mergedClosable) {
return null;
}
return /*#__PURE__*/React.createElement("div", {
style: {
...mergedStyles.header,
...headerStyle
},
className: clsx(`${prefixCls}-header`, mergedClassNames.header, {
[`${prefixCls}-header-close-only`]: mergedClosable && !title && !extra
})
}, /*#__PURE__*/React.createElement("div", {
className: `${prefixCls}-header-title`
}, closablePlacement === 'start' && mergedCloseIcon, title && (/*#__PURE__*/React.createElement("div", {
className: clsx(`${prefixCls}-title`, mergedClassNames.title),
style: mergedStyles.title,
id: ariaId
}, title))), extra && (/*#__PURE__*/React.createElement("div", {
className: clsx(`${prefixCls}-extra`, mergedClassNames.extra),
style: mergedStyles.extra
}, extra)), closablePlacement === 'end' && mergedCloseIcon);
};
const renderFooter = () => {
if (!footer) {
return null;
}
return /*#__PURE__*/React.createElement("div", {
className: clsx(`${prefixCls}-footer`, mergedClassNames.footer),
style: {
...mergedStyles.footer,
...footerStyle
}
}, footer);
};
return /*#__PURE__*/React.createElement(React.Fragment, null, renderHeader(), /*#__PURE__*/React.createElement("div", {
className: clsx(`${prefixCls}-body`, mergedClassNames.body),
style: {
...mergedStyles.body,
...bodyStyle
}
}, loading ? (/*#__PURE__*/React.createElement(Skeleton, {
active: true,
title: false,
paragraph: {
rows: 5
},
className: `${prefixCls}-body-skeleton`
})) : children), renderFooter());
};
export default DrawerPanel;