160 lines
4.3 KiB
JavaScript
160 lines
4.3 KiB
JavaScript
import React, { PureComponent, Fragment } from 'react';
|
|
import ReactDOM from 'react-dom';
|
|
import { Icon, Tabs, Badge, Spin } from 'antd';
|
|
import classNames from 'classnames';
|
|
import HeaderDropdown from '../HeaderDropdown';
|
|
import List from './NoticeList';
|
|
import styles from './index.less';
|
|
|
|
const { TabPane } = Tabs;
|
|
|
|
export default class NoticeIcon extends PureComponent {
|
|
static Tab = TabPane;
|
|
|
|
static defaultProps = {
|
|
onItemClick: () => {},
|
|
onPopupVisibleChange: () => {},
|
|
onTabChange: () => {},
|
|
onClear: () => {},
|
|
loading: false,
|
|
clearClose: false,
|
|
locale: {
|
|
emptyText: 'No notifications',
|
|
clear: 'Clear',
|
|
loadedAll: 'Loaded',
|
|
loadMore: 'Loading more',
|
|
},
|
|
emptyImage: 'https://gw.alipayobjects.com/zos/rmsportal/wAhyIChODzsoKIOBHcBk.svg',
|
|
};
|
|
|
|
state = {
|
|
visible: false,
|
|
};
|
|
|
|
onItemClick = (item, tabProps) => {
|
|
const { onItemClick } = this.props;
|
|
const { clickClose } = item;
|
|
onItemClick(item, tabProps);
|
|
if (clickClose) {
|
|
this.popover.click();
|
|
}
|
|
};
|
|
|
|
onClear = name => {
|
|
const { onClear, clearClose } = this.props;
|
|
onClear(name);
|
|
if (clearClose) {
|
|
this.popover.click();
|
|
}
|
|
};
|
|
|
|
onTabChange = tabType => {
|
|
const { onTabChange } = this.props;
|
|
onTabChange(tabType);
|
|
};
|
|
|
|
onLoadMore = (tabProps, event) => {
|
|
const { onLoadMore } = this.props;
|
|
onLoadMore(tabProps, event);
|
|
};
|
|
|
|
getNotificationBox() {
|
|
const { visible } = this.state;
|
|
const { children, loading, locale } = this.props;
|
|
if (!children) {
|
|
return null;
|
|
}
|
|
const panes = React.Children.map(children, child => {
|
|
const {
|
|
list,
|
|
title,
|
|
name,
|
|
count,
|
|
emptyText,
|
|
emptyImage,
|
|
showClear,
|
|
loadedAll,
|
|
scrollToLoad,
|
|
skeletonCount,
|
|
skeletonProps,
|
|
loading: tabLoading,
|
|
} = child.props;
|
|
const len = list && list.length ? list.length : 0;
|
|
const msgCount = count || count === 0 ? count : len;
|
|
const tabTitle = msgCount > 0 ? `${title} (${msgCount})` : title;
|
|
return (
|
|
<TabPane tab={tabTitle} key={name}>
|
|
<List
|
|
data={list}
|
|
emptyImage={emptyImage}
|
|
emptyText={emptyText}
|
|
loadedAll={loadedAll}
|
|
loading={tabLoading}
|
|
locale={locale}
|
|
onClear={() => this.onClear(name)}
|
|
onClick={item => this.onItemClick(item, child.props)}
|
|
onLoadMore={event => this.onLoadMore(child.props, event)}
|
|
scrollToLoad={scrollToLoad}
|
|
showClear={showClear}
|
|
skeletonCount={skeletonCount}
|
|
skeletonProps={skeletonProps}
|
|
title={title}
|
|
visible={visible}
|
|
/>
|
|
</TabPane>
|
|
);
|
|
});
|
|
return (
|
|
<Fragment>
|
|
<Spin spinning={loading} delay={0}>
|
|
<Tabs className={styles.tabs} onChange={this.onTabChange}>
|
|
{panes}
|
|
</Tabs>
|
|
</Spin>
|
|
</Fragment>
|
|
);
|
|
}
|
|
|
|
handleVisibleChange = visible => {
|
|
const { onPopupVisibleChange } = this.props;
|
|
this.setState({ visible });
|
|
onPopupVisibleChange(visible);
|
|
};
|
|
|
|
render() {
|
|
const { className, count, popupVisible, bell } = this.props;
|
|
const { visible } = this.state;
|
|
const noticeButtonClass = classNames(className, styles.noticeButton);
|
|
const notificationBox = this.getNotificationBox();
|
|
const NoticeBellIcon = bell || <Icon type="bell" className={styles.icon} />;
|
|
const trigger = (
|
|
<span className={classNames(noticeButtonClass, { opened: visible })}>
|
|
<Badge count={count} style={{ boxShadow: 'none' }} className={styles.badge}>
|
|
{NoticeBellIcon}
|
|
</Badge>
|
|
</span>
|
|
);
|
|
if (!notificationBox) {
|
|
return trigger;
|
|
}
|
|
const popoverProps = {};
|
|
if ('popupVisible' in this.props) {
|
|
popoverProps.visible = popupVisible;
|
|
}
|
|
return (
|
|
<HeaderDropdown
|
|
placement="bottomRight"
|
|
overlay={notificationBox}
|
|
overlayClassName={styles.popover}
|
|
trigger={['click']}
|
|
visible={visible}
|
|
onVisibleChange={this.handleVisibleChange}
|
|
{...popoverProps}
|
|
ref={node => (this.popover = ReactDOM.findDOMNode(node))} // eslint-disable-line
|
|
>
|
|
{trigger}
|
|
</HeaderDropdown>
|
|
);
|
|
}
|
|
}
|