src/components/ResourceIconLink/index.tsx (173 lines of code) (raw):
import { Icon } from '@iconify/react';
import {
Button,
ButtonProps,
Grid,
IconButton,
Link as MuiLink,
Tooltip,
useTheme,
} from '@mui/material';
import React from 'react';
import { ICONS } from '../../icons/iconify-icons-mapping';
import { ResourceIconLinkProps } from './types';
const stopPropagation = (e: React.SyntheticEvent) => e.stopPropagation();
const iconSizeByBtnSize = (btnSize: ButtonProps['size']) => {
switch (btnSize) {
case 'small':
return 16;
case 'medium':
return 20;
}
};
const DisabledResourceIconLink = ({
tooltipTitle,
icon,
iconBase64,
withoutDisabledStyle,
variant,
isTextButton,
name,
size,
}: ResourceIconLinkProps) => {
const theme = useTheme();
const iconSize = iconSizeByBtnSize(size);
return isTextButton ? (
<Button
variant={variant}
disabled
sx={!withoutDisabledStyle ? { opacity: 0.5 } : {}}
endIcon={<Icon icon={ICONS.NEW_WINDOW} color={theme.palette.grey['500']} width={iconSize} />}
size={size}
>
{name}
</Button>
) : (
<Tooltip title={<div>{tooltipTitle}</div>}>
<div>
<IconButton disabled style={!withoutDisabledStyle ? { opacity: 0.5 } : {}} size={size}>
{iconBase64 ? (
<img
src={`data:image/svg+xml;base64,${iconBase64}`}
style={{ width: theme.typography.pxToRem(16), height: theme.typography.pxToRem(16) }}
alt=""
/>
) : (
<Icon
icon={icon}
color={theme.palette.grey['500']}
width={iconSize}
height={iconSize}
/>
)}
</IconButton>
</div>
</Tooltip>
);
};
const EnabledResourceIconLink = ({
tooltipTitle,
icon,
iconBase64,
link,
variant,
isTextButton,
name,
size,
}: ResourceIconLinkProps) => {
const theme = useTheme();
const iconSize = iconSizeByBtnSize(size);
return isTextButton ? (
<Button
variant={variant}
component={MuiLink}
href={link}
target={'_blank'}
endIcon={
<Icon
icon={'material-symbols:open-in-new'}
color={theme.palette.secondary.dark}
width={iconSize}
/>
}
size={size}
sx={{ color: theme.palette.secondary.dark, borderColor: theme.palette.secondary.dark }}
>
{name}
</Button>
) : (
<Tooltip
title={
<Grid container alignItems={'center'} spacing={1}>
<Grid item>{tooltipTitle}</Grid>
<span> </span>
<Grid item>
<Icon
icon={ICONS.NEW_WINDOW}
width="15"
height="15"
color={theme.palette.common.white}
/>
</Grid>
</Grid>
}
>
<span>
<IconButton component={MuiLink} href={link} target={'_blank'} size={size}>
{iconBase64 ? (
<img
src={`data:image/svg+xml;base64,${iconBase64}`}
style={{ width: theme.typography.pxToRem(16), height: theme.typography.pxToRem(16) }}
alt=""
/>
) : (
<Icon
icon={icon}
color={theme.palette.grey['500']}
width={iconSize}
height={iconSize}
/>
)}
</IconButton>
</span>
</Tooltip>
);
};
export const ResourceIconLink = ({
disabled = false,
tooltipTitle,
icon,
iconBase64,
link,
withoutDisabledStyle,
variant,
name,
size,
isTextButton,
}: ResourceIconLinkProps) => {
return (
// eslint-disable-next-line jsx-a11y/click-events-have-key-events,jsx-a11y/no-static-element-interactions
<div onClick={stopPropagation} onFocus={stopPropagation}>
{disabled ? (
<DisabledResourceIconLink
tooltipTitle={tooltipTitle}
icon={icon}
iconBase64={iconBase64}
withoutDisabledStyle={withoutDisabledStyle}
variant={variant}
isTextButton={isTextButton}
name={name}
size={size}
/>
) : (
<EnabledResourceIconLink
tooltipTitle={tooltipTitle}
icon={icon}
iconBase64={iconBase64}
link={link}
variant={variant}
isTextButton={isTextButton}
name={name}
size={size}
/>
)}
</div>
);
};