index.js 2.16 KB
Newer Older
涂茜's avatar
涂茜 committed
1
import React, { useContext } from 'react';
涂茜's avatar
涂茜 committed
2
import PropTypes from 'prop-types';
涂茜's avatar
涂茜 committed
3 4
import classNames from 'classnames';
import { ConfigProvider } from 'antd';
涂茜's avatar
涂茜 committed
5 6 7 8
import noDataLight from './assets/noDataLight.svg';
import noDataDark from './assets/noDataDark.svg';
import errorLight from './assets/errorLight.png';
import errorDark from './assets/errorDark.png';
涂茜's avatar
涂茜 committed
9 10 11 12 13 14 15 16

import './index.less';

const Empty = ({ description, image, theme, size, statusCode, imageStyle, children }) => {
  const alt = description ? description : 'empty';
  const des = description ? description : DESC_DATA[`${statusCode}`];
  const imageSrc = image ? image : IMAGE_DATA[theme][statusCode == '0' ? 0 : 1];

涂茜's avatar
涂茜 committed
17 18 19
  const { getPrefixCls } = useContext(ConfigProvider.ConfigContext);
  const prefixCls = getPrefixCls('panda-empty');

涂茜's avatar
涂茜 committed
20 21 22 23 24 25 26 27 28
  let imageNode = null;

  if (typeof image === 'string') {
    imageNode = <img alt={alt} src={imageSrc} />;
  } else {
    imageNode = image;
  }

  return (
涂茜's avatar
涂茜 committed
29 30 31 32 33 34 35 36
    <div
      className={classNames(prefixCls, {
        small: size === 'small',
        middle: size === 'middle',
        large: size === 'large',
      })}
    >
      <div className={`${prefixCls}-image`} style={imageStyle}>
涂茜's avatar
涂茜 committed
37 38
        {imageNode}
      </div>
涂茜's avatar
涂茜 committed
39 40
      {des && <div className={`${prefixCls}-des`}>{des}</div>}
      {children && <div className={`${prefixCls}-footer`}>{children}</div>}
涂茜's avatar
涂茜 committed
41 42 43 44 45 46 47 48
    </div>
  );
};

Empty.defaultProps = {
  description: '',
  image: '',
  theme: 'light',
涂茜's avatar
涂茜 committed
49
  size: 'middle',
涂茜's avatar
涂茜 committed
50 51 52 53 54 55 56 57
  statusCode: '0',
  imageStyle: {},
};

Empty.propTypes = {
  description: PropTypes.node, // 自定义描述内容
  image: PropTypes.node, // 设置显示图片,为 string 时表示自定义图片地址
  theme: PropTypes.string, // 设置主题 light dark
涂茜's avatar
涂茜 committed
58
  size: PropTypes.string, // 设置图片尺寸 small middle large
涂茜's avatar
涂茜 committed
59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74
  statusCode: PropTypes.string, // 状态码
  imageStyle: PropTypes.object, // 图片样式
};

export default Empty;

const DESC_DATA = {
  0: '咦~暂时没有查询到相关数据呢~',
  '-1': '参数错误~请刷新试试或等服务恢复~',
  '-2': '服务器处理异常~请刷新试试或等服务恢复~',
};

const IMAGE_DATA = {
  light: [noDataLight, errorLight],
  dark: [noDataDark, errorDark],
};