mirror of
https://github.com/hanzoai/sentinel.git
synced 2026-09-29 22:34:33 +00:00
80 lines
1.7 KiB
TypeScript
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};
|