import React from 'react';
import styled from 'styled-components';
import type { ResolvedNavLinkItem } from '@redocly/config';
import { DropdownMenu } from '@redocly/theme/components/Dropdown/DropdownMenu';
import { DropdownMenuItem } from '@redocly/theme/components/Dropdown/DropdownMenuItem';
import { useThemeHooks, useThemeConfig } from '@redocly/theme/core/hooks';
import { LoginButton } from '@redocly/theme/components/UserMenu/LoginButton';
import { UserAvatar } from '@redocly/theme/components/UserMenu/UserAvatar';
import { UserInfoMenuItem } from '@redocly/theme/components/UserMenu/UserInfoMenuItem';
import { Dropdown } from '@redocly/theme/components/Dropdown/Dropdown';
import { LogoutMenuItem } from '@redocly/theme/components/UserMenu/LogoutMenuItem';
import { breakpoints } from '@redocly/theme/core/utils';
export type UserMenuProps = {
className?: string;
};
export function UserMenu({ className }: UserMenuProps) {
const { userMenu } = useThemeConfig<{
userMenu: {
menu?: ResolvedNavLinkItem[];
};
}>();
const { useTranslate, useUserMenu } = useThemeHooks();
const { userData, loginUrl } = useUserMenu();
const { translate } = useTranslate();
if (!userData?.isAuthenticated) {
if (loginUrl && !userMenu?.hideLoginButton) {
return (
);
} else {
return null;
}
}
const menuItems = userMenu?.['menu'] || [];
const customItems = menuItems.map((item) => (
{item.labelTranslationKey ? translate(item.labelTranslationKey) : item.label}
));
const items = [
,
,
...customItems,
,
];
return (
}
>
{items}
);
}
const UserMenuWrapper = styled.div`
display: none;
@media screen and (min-width: ${breakpoints.medium}) {
display: block;
}
`;
const UserMenuTrigger = styled.div.attrs<{ 'data-testid': string }>({
'data-testid': 'user-menu-button',
})`
display: flex;
align-items: center;
cursor: pointer;
width: auto;
padding: 0;
`;
const StyledDropdown = styled(Dropdown).attrs<{ 'data-testid': string }>({
dataAttributes: {
'data-testid': 'user-menu-dropdown',
},
})`
--dropdown-menu-font-size: var(--user-menu-dropdown-font-size);
--dropdown-menu-font-weight: var(--user-menu-dropdown-font-weight);
--dropdown-menu-line-height: var(--user-menu-dropdown-line-height);
--dropdown-menu-text-color: var(--user-menu-dropdown-text-color);
--dropdown-menu-min-width: var(--user-menu-dropdown-min-width);
--dropdown-menu-max-width: var(--user-menu-dropdown-max-width);
--dropdown-menu-max-height: var(--user-menu-dropdown-max-height);
--dropdown-menu-padding: var(--user-menu-dropdown-padding);
--dropdown-menu-border-radius: var(--user-menu-dropdown-border-radius);
--dropdown-menu-box-shadow: var(--user-menu-dropdown-box-shadow);
--dropdown-menu-border-color: var(--user-menu-dropdown-border-color);
--dropdown-menu-bg-color: var(--user-menu-dropdown-bg-color);
--dropdown-menu-item-padding-horizontal: var(--user-menu-dropdown-item-padding-horizontal);
--dropdown-menu-item-padding-vertical: var(--user-menu-dropdown-item-padding-vertical);
--dropdown-menu-item-separator-padding-top: var(--user-menu-dropdown-item-separator-padding-top);
--dropdown-menu-item-separator-padding-bottom: var(
--user-menu-dropdown-item-separator-padding-bottom
);
--dropdown-menu-item-border-radius: var(--user-menu-dropdown-item-border-radius);
--dropdown-menu-item-bg-color-active: var(--user-menu-dropdown-item-bg-color-active);
--dropdown-menu-item-bg-color-hover: var(--user-menu-dropdown-item-bg-color-hover);
--dropdown-menu-item-bg-color-disabled: var(--user-menu-dropdown-item-bg-color-disabled);
--dropdown-menu-item-separator-border-color: var(--user-menu-dropdown-item-separator-border-color);
--dropdown-menu-item-color-dangerous: var(--user-menu-dropdown-item-color-dangerous);
--dropdown-menu-item-color-disabled: var(--user-menu-dropdown-item-color-disabled);
--dropdown-menu-item-color-active: var(--user-menu-dropdown-item-color-active);
--dropdown-menu-item-color-hover: var(--user-menu-dropdown-item-color-hover);
`;