import {useMemo} from 'react';
import {ClassNames} from '@emotion/react';
import styled from '@emotion/styled';
import capitalize from 'lodash/capitalize';
import {Body, Hovercard} from 'sentry/components/hovercard';
import {IconAdd, IconClose} from 'sentry/icons';
import {t} from 'sentry/locale';
import space from 'sentry/styles/space';
import {getIntegrationIcon} from 'sentry/utils/integrationUtil';
type Props = {
children?: React.ReactNode;
disabled?: boolean;
externalIssueDisplayName?: string | null;
externalIssueId?: string | null;
externalIssueKey?: string | null;
externalIssueLink?: string | null;
hoverCardBody?: React.ReactNode;
hoverCardHeader?: React.ReactNode;
integrationType?: string;
onClose?: (externalIssueId?: string | null) => void;
onOpen?: () => void;
showHoverCard?: boolean;
};
function IssueSyncListElement({
children,
disabled,
externalIssueDisplayName,
externalIssueId,
externalIssueKey,
externalIssueLink,
hoverCardBody,
hoverCardHeader,
integrationType,
onClose,
onOpen,
showHoverCard,
}: Props) {
const isLinked = !!(externalIssueLink && externalIssueId);
const handleIconClick = () => {
if (isLinked) {
onClose?.(externalIssueId);
} else {
onOpen?.();
}
};
const icon = getIntegrationIcon(integrationType);
const prettyName = useMemo(() => {
switch (integrationType) {
case 'gitlab':
return 'GitLab';
case 'github':
return 'GitHub';
case 'github_enterprise':
return 'GitHub Enterprise';
case 'vsts':
return 'Azure DevOps';
case 'jira_server':
return 'Jira Server';
default:
return capitalize(integrationType);
}
}, [integrationType]);
const text =
children || externalIssueDisplayName || externalIssueKey || `${prettyName} Issue`;
const link = (
{text}
);
return (
{({css}) => (
{icon}
{link}
)}
{(onClose || onOpen) && (
{isLinked ? : onOpen ? : null}
)}
);
}
export const IssueSyncListElementContainer = styled('div')`
line-height: 0;
display: flex;
align-items: center;
justify-content: space-between;
&:not(:last-child) {
margin-bottom: ${space(2)};
}
`;
export const IntegrationLink = styled('a')<{disabled?: boolean}>`
text-decoration: none;
margin-left: ${space(1)};
color: ${p => p.theme.textColor};
cursor: pointer;
line-height: 1;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
&:hover {
color: ${({disabled, theme}) => (disabled ? theme.disabled : theme.blue300)};
}
`;
const StyledHovercard = styled(Hovercard)`
${Body} {
max-height: 300px;
overflow-y: auto;
}
`;
const StyledIcon = styled('span')`
color: ${p => p.theme.textColor};
cursor: pointer;
`;
export default IssueSyncListElement;