1
0
mirror of https://github.com/Unleash/unleash.git synced 2024-10-18 20:09:08 +02:00
unleash.unleash/frontend/src/component/common/PermissionIconButton/PermissionIconButton.tsx
olav ae012d62e6 refactor: fix missing IconButton labels (#1038)
* refactor: fix missing IconButton labels

* refactor: fix percentage text color contrast
2022-05-27 13:12:03 +02:00

77 lines
2.0 KiB
TypeScript

import { IconButton, IconButtonProps } from '@mui/material';
import React, { useContext, ReactNode } from 'react';
import AccessContext from 'contexts/AccessContext';
import { Link } from 'react-router-dom';
import {
TooltipResolver,
ITooltipResolverProps,
} from 'component/common/TooltipResolver/TooltipResolver';
import { formatAccessText } from 'utils/formatAccessText';
import { useId } from 'hooks/useId';
interface IPermissionIconButtonProps {
permission: string;
projectId?: string;
environmentId?: string;
className?: string;
children?: ReactNode;
disabled?: boolean;
hidden?: boolean;
type?: 'button';
edge?: IconButtonProps['edge'];
tooltipProps?: Omit<ITooltipResolverProps, 'children'>;
size?: string;
}
interface IButtonProps extends IPermissionIconButtonProps {
onClick: (event: React.SyntheticEvent) => void;
}
interface ILinkProps extends IPermissionIconButtonProps {
component: typeof Link;
to: string;
}
const PermissionIconButton = ({
permission,
projectId,
children,
environmentId,
tooltipProps,
disabled,
...rest
}: IButtonProps | ILinkProps) => {
const { hasAccess } = useContext(AccessContext);
const id = useId();
let access;
if (projectId && environmentId) {
access = hasAccess(permission, projectId, environmentId);
} else if (projectId) {
access = hasAccess(permission, projectId);
} else {
access = hasAccess(permission);
}
return (
<TooltipResolver
{...tooltipProps}
title={formatAccessText(access, tooltipProps?.title)}
arrow
>
<div id={id} role="tooltip">
<IconButton
{...rest}
disabled={!access || disabled}
aria-labelledby={id}
size="large"
>
{children}
</IconButton>
</div>
</TooltipResolver>
);
};
export default PermissionIconButton;