Avatar.tsx 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108
  1. import { useIntl } from "react-intl";
  2. import { useEffect, useState } from "react";
  3. import { Link, useNavigate } from "react-router";
  4. import { Tooltip, Typography } from "antd";
  5. import { Avatar } from "antd";
  6. import { Popover } from "antd";
  7. import { ProCard } from "@ant-design/pro-components";
  8. import {
  9. UserOutlined,
  10. HomeOutlined,
  11. LogoutOutlined,
  12. SettingOutlined,
  13. } from "@ant-design/icons";
  14. import { useAppSelector } from "../../hooks";
  15. import { currentUser as _currentUser } from "../../reducers/current-user";
  16. import type { TooltipPlacement } from "antd/lib/tooltip"
  17. import SettingModal from "./setting/SettingModal";
  18. import LoginButton from "./LoginButton";
  19. const { Title } = Typography;
  20. interface IWidget {
  21. placement?: TooltipPlacement;
  22. style?: React.CSSProperties;
  23. }
  24. const AvatarWidget = ({ style, placement = "bottomRight" }: IWidget) => {
  25. const intl = useIntl();
  26. const navigate = useNavigate();
  27. const [userName, setUserName] = useState<string>();
  28. const [nickName, setNickName] = useState<string>();
  29. const user = useAppSelector(_currentUser);
  30. useEffect(() => {
  31. setUserName(user?.realName);
  32. setNickName(user?.nickName);
  33. }, [user]);
  34. const UserCard = () => {
  35. return (
  36. <ProCard
  37. style={{ maxWidth: 500, minWidth: 300 }}
  38. actions={[
  39. <Tooltip
  40. title={intl.formatMessage({
  41. id: "buttons.setting",
  42. })}
  43. >
  44. <SettingModal trigger={<SettingOutlined key="setting" />} />
  45. </Tooltip>,
  46. <Tooltip
  47. title={intl.formatMessage({
  48. id: "columns.library.blog.label",
  49. })}
  50. >
  51. <Link to={`/blog/${userName}/overview`}>
  52. <HomeOutlined key="home" />
  53. </Link>
  54. </Tooltip>,
  55. <Tooltip
  56. title={intl.formatMessage({
  57. id: "buttons.sign-out",
  58. })}
  59. >
  60. <LogoutOutlined
  61. key="logout"
  62. onClick={() => {
  63. sessionStorage.removeItem("token");
  64. localStorage.removeItem("token");
  65. navigate("/anonymous/users/sign-in");
  66. }}
  67. />
  68. </Tooltip>,
  69. ]}
  70. >
  71. <div>
  72. <Title level={4}>{nickName}</Title>
  73. <div style={{ textAlign: "right" }}>
  74. {intl.formatMessage({
  75. id: "buttons.welcome",
  76. })}
  77. </div>
  78. </div>
  79. </ProCard>
  80. );
  81. };
  82. return (
  83. <>
  84. <Popover
  85. content={user ? <UserCard /> : <LoginButton />}
  86. placement={placement}
  87. >
  88. <span style={style}>
  89. <Avatar
  90. style={{ backgroundColor: user ? "#87d068" : "gray" }}
  91. icon={user?.avatar ? undefined : <UserOutlined />}
  92. src={user?.avatar}
  93. size="small"
  94. >
  95. {user ? nickName?.slice(0, 1) : undefined}
  96. </Avatar>
  97. </span>
  98. </Popover>
  99. </>
  100. );
  101. };
  102. export default AvatarWidget;