| import { BellOutlined } from '@ant-design/icons'; |
| import { Badge, Spin, Tabs } from 'antd'; |
| import useMergedState from 'rc-util/es/hooks/useMergedState'; |
| import React from 'react'; |
| import classNames from 'classnames'; |
| import NoticeList from './NoticeList'; |
| import HeaderDropdown from '../HeaderDropdown'; |
| import styles from './index.less'; |
| const { TabPane } = Tabs; |
| |
| const NoticeIcon = (props) => { |
| const getNotificationBox = () => { |
| const { |
| children, |
| loading, |
| onClear, |
| onTabChange, |
| onItemClick, |
| onViewMore, |
| clearText, |
| viewMoreText, |
| } = props; |
| |
| if (!children) { |
| return null; |
| } |
| |
| const panes = []; |
| React.Children.forEach(children, (child) => { |
| if (!child) { |
| return; |
| } |
| |
| const { list, title, count, tabKey, showClear, showViewMore } = child.props; |
| const len = list && list.length ? list.length : 0; |
| const msgCount = count || count === 0 ? count : len; |
| const tabTitle = msgCount > 0 ? `${title} (${msgCount})` : title; |
| panes.push( |
| <TabPane tab={tabTitle} key={tabKey}> |
| <NoticeList |
| clearText={clearText} |
| viewMoreText={viewMoreText} |
| list={list} |
| tabKey={tabKey} |
| onClear={() => onClear && onClear(title, tabKey)} |
| onClick={(item) => onItemClick && onItemClick(item, child.props)} |
| onViewMore={(event) => onViewMore && onViewMore(child.props, event)} |
| showClear={showClear} |
| showViewMore={showViewMore} |
| title={title} |
| /> |
| </TabPane>, |
| ); |
| }); |
| return ( |
| <> |
| <Spin spinning={loading} delay={300}> |
| <Tabs className={styles.tabs} onChange={onTabChange}> |
| {panes} |
| </Tabs> |
| </Spin> |
| </> |
| ); |
| }; |
| |
| const { className, count, bell } = props; |
| const [visible, setVisible] = useMergedState(false, { |
| value: props.popupVisible, |
| onChange: props.onPopupVisibleChange, |
| }); |
| const noticeButtonClass = classNames(className, styles.noticeButton); |
| const notificationBox = getNotificationBox(); |
| const NoticeBellIcon = bell || <BellOutlined 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; |
| } |
| |
| return ( |
| <HeaderDropdown |
| placement="bottomRight" |
| overlay={notificationBox} |
| overlayClassName={styles.popover} |
| trigger={['click']} |
| visible={visible} |
| onVisibleChange={setVisible} |
| > |
| {trigger} |
| </HeaderDropdown> |
| ); |
| }; |
| |
| NoticeIcon.defaultProps = { |
| emptyImage: 'https://gw.alipayobjects.com/zos/rmsportal/wAhyIChODzsoKIOBHcBk.svg', |
| }; |
| NoticeIcon.Tab = NoticeList; |
| export default NoticeIcon; |