@parkassist/pa-ui-library
Version:
INX Platform elements
317 lines (310 loc) • 10.3 kB
JavaScript
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
import React from "react";
import styled from "styled-components";
import Palette from "../../constants/Palette";
import Measures from "../../constants/Measures";
import Popper from '@mui/material/Popper';
import MenuItem from '@mui/material/MenuItem';
import MenuList from '@mui/material/MenuList';
import ClickAwayListener from '@mui/material/ClickAwayListener';
import Grow from '@mui/material/Grow';
import Paper from '@mui/material/Paper';
import Button from "../Button";
import Separator from "../Separator";
import { Avatar } from "@mui/material";
import LabelWithIcon from "../LabelWithIcon";
import { ProfileSettingsIcon, DocumentationIcon, FullscreenIcon, LogoutIcon, InfoIcon } from "../Icons";
import Helmet from "react-helmet";
import { Column, Row } from "../Layout/Flex";
import FontStyles from "../../constants/FontStyles";
import { CustomTooltip, Icons } from "../..";
import { LanguageSelector } from "./LanguageSelector";
export const MenuListStyled = styled(MenuList)`
background:${Palette.BLACK};
`;
export const PaperStyled = styled(Paper)`
background:${Palette.BLACK};
min-width: 300px;
top: 16px !important;
right: -8px;
padding: 0;
`;
export const StyledMenuItem = styled(MenuItem)(props => ` list-style: none;
padding: 8px 16px;
border-radius: 0;
cursor: default;
user-select: none;
font: ${FontStyles.BODY2_FONT};
display: block !important;
color: ${Palette.DARK_GREY} !important;
${props.selected && `
background-color: ${Palette.NIGHT_RIDER} !important;
color: ${Palette.WHITE} !important;`}
&:last-of-type {
border-bottom: none;
}
&.disabled {
color: ${Palette.NIGHT_RIDER} !important;
}
&:hover:not(.disabled) {
background-color: ${Palette.LIGHT_BLACK};
color: ${Palette.WHITE} !important;
}
`);
export const TriggerButton = styled(Button)`
box-sizing: border-box;
height: 40px;
width: 40px;
font-size: 16px;
padding: 0;
margin-left: calc(${Measures.minMargin} * 2);
border-radius: 50%;
background: ${Palette.PRIMARY};
border: 1px solid ${Palette.PRIMARY};
color: ${Palette.BLACK};
transition-property: all;
transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);
transition-duration: 120ms;
&:hover {
background: ${Palette.PRIMARY};
border-color: ${Palette.PRIMARY};
box-shadow: none;
}
&:focus {
background: ${Palette.PRIMARY};
border-color: ${Palette.PRIMARY};
}
`;
export const SeparatorStyled = styled(Separator)`
background-color: ${Palette.LIGHT_BLACK};
width: 100%;
margin: 8px 0;
`;
export const AvatarStyled = styled(Avatar)`
color: ${Palette.BLACK} !important;
font: ${FontStyles.BODY1_FONT} !important;
font-size: 16px !important;
height: 56px !important;
width: 56px !important;
margin-right: 8px !important;
`;
export const UserInfoWrapper = styled(Row)`
padding: 8px;
`;
export const TextName = styled(Row)`
color: ${Palette.WHITE};
font: ${FontStyles.BODY1_FONT};
`;
export const TextInfo = styled(Row)`
Color: ${Palette.DIM_GREY};
margin-top: 4px;
font: ${FontStyles.BODY2_FONT};
`;
const defaultTranslations = {
version: "Current version",
profile: "Profile settings",
onboarding: "Onboarding tour",
fullscreen: "Full screen mode",
language: "Select language",
signOut: "Sign out"
};
const ProfileButton = ({
icon = null,
faIcon,
disabled = false,
tooltip = null,
placement = "bottom-start",
user,
handleProfileSettingsClick,
handleOnboardingTourClick,
toggleFullScreen,
handleSignOutClick,
valueScreen = false,
isMobile = false,
version = "",
selectedLanguage = "en",
availableLanguages,
onChangeLanguage,
translations = defaultTranslations
}) => {
var _a, _b, _c;
const [open, setOpen] = React.useState(false);
const anchorRef = React.useRef(null);
const fullName = user && `${user.firstname || ""} ${user.lastname || ""}`;
const initials = user && `${((_a = user.firstname) === null || _a === void 0 ? void 0 : _a.charAt(0)) || ""}${((_b = user.lastname) === null || _b === void 0 ? void 0 : _b.charAt(0)) || ""}`;
const resources = (_c = user === null || user === void 0 ? void 0 : user.resourcesNames) === null || _c === void 0 ? void 0 : _c.join(",");
const words = translations;
const formattedResources = _jsxs(Column, {
children: [_jsx(Row, {
style: {
fontWeight: "bold"
},
children: "Access to:"
}), _jsx(Row, {
children: resources
})]
});
const handleToggle = () => {
setOpen(prevOpen => !prevOpen);
};
const handleClose = event => {
if (anchorRef.current && anchorRef.current.contains(event.target)) {
return;
}
setOpen(false);
};
function handleListKeyDown(event) {
if (event.key === 'Tab') {
event.preventDefault();
setOpen(false);
} else if (event.key === 'Escape') {
setOpen(false);
}
}
const prevOpen = React.useRef(open);
React.useEffect(() => {
if (prevOpen.current === true && open === false) {
anchorRef.current.focus();
}
prevOpen.current = open;
}, [open]);
return _jsxs(_Fragment, {
children: [_jsx(Column, {
children: _jsx(TriggerButton, {
ref: anchorRef,
id: "composition-button",
"aria-controls": open ? 'composition-menu' : undefined,
"aria-expanded": open ? 'true' : undefined,
"aria-haspopup": "true",
onClick: handleToggle,
"data-testid": "avatar",
children: initials || "D"
})
}), !isMobile && _jsx(Column, {
children: _jsx(Icons.OpenArrowIcon, {
filter: Palette.FILTER_WHITE,
style: {
transform: "translateY(8px)",
cursor: 'pointer'
},
onClick: handleToggle
})
}), _jsx(Popper, {
open: open,
anchorEl: anchorRef.current,
role: undefined,
placement: placement,
transition: true,
disablePortal: true,
children: ({
TransitionProps
}) => _jsx(Grow, Object.assign({}, TransitionProps, {
style: {
transformOrigin: 'right top',
marginTop: 20,
marginRight: isMobile ? 0 : -20
},
children: _jsx(PaperStyled, {
children: _jsx(ClickAwayListener, {
onClickAway: handleClose,
children: _jsxs(MenuListStyled, {
autoFocusItem: open,
id: "composition-menu",
"aria-labelledby": "composition-button",
onKeyDown: handleListKeyDown,
"data-testid": "avatar-menu-list",
children: [_jsxs(UserInfoWrapper, {
style: {
marginLeft: 15
},
children: [_jsx(Column, {
children: _jsx(AvatarStyled, {
sx: {
bgcolor: `${Palette.PRIMARY}`
},
children: initials || "D"
})
}), _jsxs(Column, {
style: {
marginLeft: 5
},
children: [_jsx(TextName, {
"data-testid": "user-name",
children: fullName || "default"
}), _jsx(TextInfo, {
children: user === null || user === void 0 ? void 0 : user.email
}), _jsxs(TextInfo, {
children: [_jsx(Column, {
style: {
marginRight: 8
},
children: user && user.type + " user"
}), _jsx(Column, {
style: {
marginTop: 2
},
children: (user === null || user === void 0 ? void 0 : user.type) && _jsx(CustomTooltip, {
placement: "bottom",
content: user.type === "Global" ? "Full access to INX" : formattedResources,
children: _jsx(InfoIcon, {
size: 14,
filter: Palette.FILTER_DIM_GREY
})
})
})]
}), _jsxs(TextInfo, {
style: {
color: Palette.WHITE_SMOKE
},
children: [words.version, ": ", version]
})]
})]
}), _jsx(SeparatorStyled, {}), _jsx(StyledMenuItem, {
datatestid: "profile-settings",
onClick: handleProfileSettingsClick,
children: _jsx(LabelWithIcon, {
text: words.profile,
leftIcon: _jsx(ProfileSettingsIcon, {})
})
}), _jsx(StyledMenuItem, {
onClick: () => {
handleOnboardingTourClick();
setOpen(false);
},
children: _jsx(LabelWithIcon, {
text: words.onboarding,
leftIcon: _jsx(DocumentationIcon, {})
})
}), _jsx(StyledMenuItem, {
onClick: toggleFullScreen,
children: _jsx(LabelWithIcon, {
text: words.fullscreen,
leftIcon: _jsx(FullscreenIcon, {})
})
}), _jsx(SeparatorStyled, {}), _jsx(StyledMenuItem, {
dataTestId: "sign-out",
onClick: handleSignOutClick,
children: _jsx(LabelWithIcon, {
text: words.signOut,
leftIcon: _jsx(LogoutIcon, {})
})
})]
})
})
})
}))
}), _jsx(Helmet, {
children: _jsx("style", {
children: `
.MuiMenuItem-root img {
filter: ${Palette.FILTER_DIM_GREY} !important;
}
.MuiMenuItem-root:hover img {
filter: ${Palette.FILTER_WHITE} !important;
}
`
})
})]
});
};
export default ProfileButton;