fleet/frontend/components/top_nav/UserMenu/UserMenu.tsx

85 lines
2.2 KiB
TypeScript
Raw Normal View History

2022-02-02 17:27:14 +00:00
import React from "react";
import { IUser } from "interfaces/user";
import { ITeam } from "interfaces/team";
import { getSortedTeamOptions } from "utilities/helpers";
2022-02-02 17:27:14 +00:00
import PATHS from "router/paths";
// @ts-ignore
import DropdownButton from "components/buttons/DropdownButton";
2023-01-30 19:37:51 +00:00
import AvatarTopNav from "../../AvatarTopNav";
2022-02-02 17:27:14 +00:00
const baseClass = "user-menu";
interface IUserMenuProps {
onLogout: () => void;
onUserMenuItemClick: (path: string) => void;
2022-02-02 17:27:14 +00:00
isAnyTeamAdmin: boolean | undefined;
isGlobalAdmin: boolean | undefined;
currentUser: IUser;
}
const UserMenu = ({
onLogout,
onUserMenuItemClick,
2022-02-02 17:27:14 +00:00
isAnyTeamAdmin,
isGlobalAdmin,
currentUser,
}: IUserMenuProps): JSX.Element => {
const accountNavigate = onUserMenuItemClick(PATHS.ACCOUNT);
2022-02-02 17:27:14 +00:00
const dropdownItems = [
{
label: "My account",
onClick: accountNavigate,
},
{
label: "Documentation",
2022-02-11 20:35:23 +00:00
onClick: () => window.open("https://fleetdm.com/docs", "_blank"),
2022-02-02 17:27:14 +00:00
},
{
label: "Sign out",
onClick: onLogout,
},
];
if (isGlobalAdmin) {
const manageUsersNavigate = onUserMenuItemClick(PATHS.ADMIN_USERS);
2022-02-02 17:27:14 +00:00
const manageUserNavItem = {
label: "Manage users",
onClick: manageUsersNavigate,
};
dropdownItems.unshift(manageUserNavItem);
}
if (currentUser && (isAnyTeamAdmin || isGlobalAdmin)) {
const userAdminTeams = currentUser.teams.filter(
(thisTeam: ITeam) => thisTeam.role === "admin"
);
const sortedTeams = getSortedTeamOptions(userAdminTeams);
const settingsPath =
currentUser.global_role === "admin"
? PATHS.ADMIN_ORGANIZATION
: `${PATHS.TEAM_DETAILS_USERS(sortedTeams[0].value)}`;
const settingsNavigate = onUserMenuItemClick(settingsPath);
2022-02-02 17:27:14 +00:00
const adminNavItem = {
label: "Settings",
onClick: settingsNavigate,
};
dropdownItems.unshift(adminNavItem);
}
return (
<div className={baseClass} data-testid="user-menu">
<DropdownButton options={dropdownItems} variant="unstyled">
2023-01-30 19:37:51 +00:00
<AvatarTopNav
2022-02-02 17:27:14 +00:00
className={`${baseClass}__avatar-image`}
user={{ gravatar_url_dark: currentUser.gravatar_url_dark }}
2022-02-02 17:27:14 +00:00
size="small"
/>
</DropdownButton>
</div>
);
};
export default UserMenu;