MessageListDrawer.tsx 3.14 KB
import { RESPONSE_CODE } from '@/constants/enum';
import { postOrderErpMessageQueryMyMessage } from '@/services';
import { formatDateTime, getUserInfo } from '@/utils';
import { UserOutlined } from '@ant-design/icons';
import { Avatar, Badge, Divider, Drawer, Flex, List, Skeleton } from 'antd';
import { useEffect, useState } from 'react';
import InfiniteScroll from 'react-infinite-scroll-component';

export default ({ setVisible }) => {
  const userInfo = getUserInfo();
  const current = useState<number>(1); //当前页码
  const [total, setTotal] = useState(0);
  const [messageListData, setMessageListData] = useState<any[]>([]); //列表数据

  /**
   * 获取消息列表
   */
  async function getMessageListData() {
    let res = await postOrderErpMessageQueryMyMessage({
      data: { username: userInfo.username, current: current[0] },
    });
    if (res && res.result === RESPONSE_CODE.SUCCESS) {
      setMessageListData([...messageListData, ...res?.data?.data]);
      setTotal(res?.data?.total);
    }
  }

  /**
   * 跳转到订单列表
   */
  function toOrderList(mainOrderId: any) {
    window.open('/order?id=' + mainOrderId, '_blank');
  }

  function renderTarget() {
    document.getElementsByClassName('ant-drawer-body')[0].id = 'scrollableDiv';
    return document.getElementsByClassName('ant-drawer-body')[0];
  }

  useEffect(() => {
    getMessageListData();
  }, []);

  return (
    <>
      <Drawer
        title="消息列表"
        onClose={() => {
          setVisible(false);
        }}
        open={true}
        width={450}
        styles={{ body: { paddingTop: 0 } }}
      >
        <InfiniteScroll
          dataLength={messageListData.length}
          next={getMessageListData}
          hasMore={messageListData.length < total}
          loader={<Skeleton avatar paragraph={{ rows: 1 }} active />}
          endMessage={<Divider plain>没有更多消息了 🤐</Divider>}
          scrollableTarget={renderTarget}
        >
          <List
            dataSource={messageListData}
            renderItem={(item) => (
              <List.Item key={item.id}>
                <List.Item.Meta
                  avatar={
                    <Badge dot={item.unreadNum > 0}>
                      <Avatar shape="square" icon={<UserOutlined />} />
                    </Badge>
                  }
                />
                <Flex
                  vertical
                  className="hover:cursor-pointer"
                  onClick={() => {
                    toOrderList(item.mainOrderId);
                  }}
                >
                  <Flex>
                    <div>
                      {item.content}
                      <span className="text-[#8C8C8C]">
                        (点击跳转到对应主订单)
                      </span>
                    </div>
                  </Flex>
                  <Flex>
                    <span className="text-xs text-[#8C8C8C] pt-1">
                      {formatDateTime(item.createTime)}
                    </span>
                  </Flex>
                </Flex>
              </List.Item>
            )}
          />
        </InfiniteScroll>
      </Drawer>
    </>
  );
};