Files
2024-02-15 17:01:50 +00:00

95 lines
2.4 KiB
TypeScript

import styled from '@emotion/styled';
import {trimPackage} from 'sentry/components/events/interfaces/frame/utils';
import {Tooltip} from 'sentry/components/tooltip';
import {SLOW_TOOLTIP_DELAY} from 'sentry/constants';
import {space} from 'sentry/styles/space';
import {defined} from 'sentry/utils';
type Props = {
includeSystemFrames: boolean;
onClick: (event: React.MouseEvent<HTMLAnchorElement>) => void;
packagePath: string | null;
withLeadHint: boolean;
isClickable?: boolean;
/**
* Is the stack trace being previewed in a hovercard?
*/
isHoverPreviewed?: boolean;
};
function PackageLink({
children,
includeSystemFrames,
isClickable,
isHoverPreviewed,
onClick,
packagePath,
withLeadHint,
}) {
const handleClick = (event: React.MouseEvent<HTMLAnchorElement>) => {
if (isClickable) {
onClick(event);
}
};
return (
<Package
onClick={handleClick}
isClickable={isClickable}
withLeadHint={withLeadHint}
includeSystemFrames={includeSystemFrames}
>
{defined(packagePath) ? (
<Tooltip
title={packagePath}
delay={isHoverPreviewed ? SLOW_TOOLTIP_DELAY : undefined}
>
<PackageName
isClickable={isClickable}
withLeadHint={withLeadHint}
includeSystemFrames={includeSystemFrames}
>
{trimPackage(packagePath)}
</PackageName>
</Tooltip>
) : (
<span>{'<unknown>'}</span>
)}
{children}
</Package>
);
}
export const Package = styled('a')<Partial<Props>>`
font-size: 13px;
font-weight: bold;
padding: 0 0 0 ${space(0.5)};
color: ${p => p.theme.textColor};
:hover {
color: ${p => p.theme.textColor};
}
cursor: ${p => (p.isClickable ? 'pointer' : 'default')};
display: flex;
align-items: center;
${p =>
p.withLeadHint && (p.includeSystemFrames ? `max-width: 89px;` : `max-width: 76px;`)}
@media (min-width: ${p => p.theme.breakpoints.large}) and (max-width: ${p =>
p.theme.breakpoints.xlarge}) {
${p =>
p.withLeadHint && (p.includeSystemFrames ? `max-width: 76px;` : `max-width: 63px;`)}
}
`;
export const PackageName = styled('span')<
Pick<Props, 'isClickable' | 'withLeadHint' | 'includeSystemFrames'>
>`
max-width: ${p =>
p.withLeadHint && p.isClickable && !p.includeSystemFrames ? '45px' : '104px'};
${p => p.theme.overflowEllipsis}
`;
export default PackageLink;