You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 

76 regels
2.6 KiB

  1. "use client";
  2. import IconButton from "@mui/material/IconButton";
  3. import Menu from "@mui/material/Menu";
  4. import MenuItem from "@mui/material/MenuItem";
  5. import Avatar from "@mui/material/Avatar";
  6. import React from "react";
  7. import { AppBarProps } from "./AppBar";
  8. import Divider from "@mui/material/Divider";
  9. import Typography from "@mui/material/Typography";
  10. import { useTranslation } from "react-i18next";
  11. import { signOut } from "next-auth/react";
  12. import { usePathname, useRouter, useSearchParams } from "next/navigation";
  13. type Props = Pick<AppBarProps, "avatarImageSrc" | "profileName">;
  14. const Profile: React.FC<Props> = ({ avatarImageSrc, profileName }) => {
  15. const [profileMenuAnchorEl, setProfileMenuAnchorEl] =
  16. React.useState<HTMLButtonElement>();
  17. const openProfileMenu: React.MouseEventHandler<HTMLButtonElement> = (
  18. event,
  19. ) => {
  20. setProfileMenuAnchorEl(event.currentTarget);
  21. };
  22. const closeProfileMenu = () => {
  23. setProfileMenuAnchorEl(undefined);
  24. };
  25. const { t, i18n: { language } } = useTranslation("login");
  26. const router = useRouter();
  27. const pathname = usePathname();
  28. const searchParams = useSearchParams()
  29. const onLangClick = React.useCallback((lang: string) => {
  30. const params = new URLSearchParams(searchParams.toString())
  31. params.set("lang", lang)
  32. router.replace(`${pathname}?${params.toString()}`);
  33. window.location.reload();
  34. }, [router, pathname, searchParams]);
  35. return (
  36. <>
  37. <IconButton aria-label="profile" onClick={openProfileMenu}>
  38. <Avatar src={avatarImageSrc} />
  39. </IconButton>
  40. <Menu
  41. id="profile-menu"
  42. anchorEl={profileMenuAnchorEl}
  43. anchorOrigin={{
  44. vertical: "bottom",
  45. horizontal: "right",
  46. }}
  47. keepMounted
  48. transformOrigin={{
  49. vertical: "top",
  50. horizontal: "right",
  51. }}
  52. open={Boolean(profileMenuAnchorEl)}
  53. onClose={closeProfileMenu}
  54. MenuListProps={{ dense: true, disablePadding: true }}
  55. >
  56. <Typography sx={{ mx: "1.5rem", my: "0.5rem" }} fontWeight="bold">
  57. {profileName}
  58. </Typography>
  59. <Divider />
  60. <MenuItem onClick={() => { router.replace("/settings/changepassword") }}>{t("Change Password")}</MenuItem>
  61. {language === "zh" && <MenuItem onClick={() => { onLangClick("en") }}>{t("Change To English Version")}</MenuItem>}
  62. {language === "en" && <MenuItem onClick={() => { onLangClick("zh") }}>{t("Change To Chinese Version")}</MenuItem>}
  63. <MenuItem onClick={() => signOut()}>{t("Sign out")}</MenuItem>
  64. </Menu>
  65. </>
  66. );
  67. };
  68. export default Profile;