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

80 lines
1.7 KiB
TypeScript

import {useState} from 'react';
import styled from '@emotion/styled';
import type {LocationDescriptor} from 'history';
import Link from 'sentry/components/links/link';
import {t} from 'sentry/locale';
import {space} from 'sentry/styles/space';
type Item = {
target: LocationDescriptor;
value: string;
onClick?: () => void;
};
interface ArrayLinksProps {
items: Item[];
}
function ArrayLinks({items}: ArrayLinksProps) {
const [expanded, setExpanded] = useState(false);
const firstItem = items[0];
return (
<ArrayContainer expanded={expanded}>
{firstItem && <LinkedItem item={firstItem} />}
{items.length > 1 &&
expanded &&
items
.slice(1, items.length)
.map(item => <LinkedItem key={item.value} item={item} />)}
{items.length > 1 ? (
<ButtonContainer>
<button onClick={() => setExpanded(!expanded)}>
{expanded ? t('[collapse]') : t('[+%s more]', items.length - 1)}
</button>
</ButtonContainer>
) : null}
</ArrayContainer>
);
}
function LinkedItem({item}: {item: Item}) {
return (
<ArrayItem>
<Link to={item.target} onClick={item?.onClick}>
{item.value}
</Link>
</ArrayItem>
);
}
const ArrayContainer = styled('div')<{expanded: boolean}>`
display: flex;
flex-direction: ${p => (p.expanded ? 'column' : 'row')};
`;
const ArrayItem = styled('span')`
flex-shrink: 1;
display: block;
${p => p.theme.overflowEllipsis};
width: unset;
`;
const ButtonContainer = styled('div')`
white-space: nowrap;
& button {
background: none;
border: 0;
outline: none;
padding: 0;
cursor: pointer;
color: ${p => p.theme.linkColor};
margin-left: ${space(0.5)};
}
`;
export {ArrayLinks};