MeButton.tsx 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
  1. import React from 'react';
  2. import { Avatar, Typography, AvatarProps, Button } from 'antd';
  3. import { UserOutlined } from '@ant-design/icons';
  4. interface MeButtonProps extends AvatarProps {
  5. isLogin?: boolean;
  6. avatarUrl?: string;
  7. username?: React.ReactNode;
  8. icon?: React.ReactNode;
  9. 'data-testid'?: string;
  10. disabled?: boolean;
  11. }
  12. /**
  13. * 没有传递isLogin时,当作普通按钮使用
  14. * @param param0 - MeButtonProps
  15. * @param param0.isLogin - 是否登录
  16. * @param param0.avatarUrl - 头像URL
  17. * @param param0.onClick - 点击事件处理函数
  18. * @param param0.username - 用户名
  19. * @param param0.icon - 图标
  20. * @param param0.props - 其他AvatarProps属性
  21. * @returns
  22. */
  23. const MeButton: React.FC<MeButtonProps> = ({
  24. isLogin = false,
  25. avatarUrl,
  26. onClick,
  27. username,
  28. icon,
  29. disabled,
  30. ...props
  31. }) => {
  32. return (
  33. <Button
  34. onClick={onClick}
  35. style={{
  36. display: 'flex',
  37. alignItems: 'center',
  38. // border: 'none',
  39. background: disabled ? 'transparent' : 'gray',
  40. padding: 0,
  41. cursor: 'pointer',
  42. }}
  43. className={props.className}
  44. data-testid={props['data-testid']}
  45. disabled={disabled} // 如果传递了disabled属性,则可能禁用按钮
  46. >
  47. {isLogin ? (
  48. <Avatar
  49. src={avatarUrl}
  50. icon={!!avatarUrl === false ? icon || <UserOutlined /> : undefined} // 如果avatarUrl为false,则使用icon或默认UserOutlined图标
  51. size={props.size}
  52. style={{ marginRight: username ? 8 : 0 }}
  53. />
  54. ) : (
  55. <Avatar
  56. icon={icon || <UserOutlined />}
  57. size={props.size}
  58. style={{ marginRight: username ? 8 : 0 }}
  59. />
  60. )}
  61. {username && (
  62. <Typography.Text style={{ margin: 0 }}>{username}</Typography.Text>
  63. )}
  64. </Button>
  65. );
  66. };
  67. export default MeButton;