import {useEffect, useState} from 'react';
import type {Theme} from '@emotion/react';
import {withTheme} from '@emotion/react';
import styled from '@emotion/styled';
import {AnimatePresence, motion} from 'framer-motion';
import ProgressRing from 'sentry/components/progressRing';
import {IconBusiness} from 'sentry/icons';
import {t} from 'sentry/locale';
import {space} from 'sentry/styles/space';
import testableTransition from 'sentry/utils/testableTransition';
import MoreFeaturesLink from 'getsentry/views/amCheckout/moreFeaturesLink';
import type {Feature} from './types';
type Props = {
features: Feature[];
onClick: (feat: Feature) => void;
shouldShowPerformanceFeatures: boolean;
shouldShowTeamFeatures: boolean;
selected?: Feature;
withCountdown?: number;
};
function FeatureList({
features,
selected,
onClick,
withCountdown,
shouldShowTeamFeatures,
shouldShowPerformanceFeatures,
}: Props) {
return (
{shouldShowPerformanceFeatures
? t('Features Include')
: shouldShowTeamFeatures
? t('Features Include')
: t('Business Features Include')}
{selected && withCountdown && (
)}
{features.map(feat => (
onClick(feat)}
aria-selected={feat === selected ? true : undefined}
data-test-id={feat.id}
whileTap={{x: -7}}
transition={testableTransition()}
>
{feat.name}
))}
);
}
type CountdownRingProps = {
id: string;
theme: Theme;
totalTime: number;
};
/**
* Countdown ring is used to show a countdown ring to the right of the header
* when in 'auto rotate' carousel mode
*/
const CountdownRing = withTheme(({theme, id, totalTime}: CountdownRingProps) => {
const [timeLeft, setTimeLeft] = useState(totalTime);
const tick = 200;
useEffect(() => {
if (timeLeft <= 0) {
return () => void 0;
}
const intervalId = setInterval(() => setTimeLeft(timeLeft - tick), tick);
return () => clearInterval(intervalId);
}, [timeLeft]);
// Reset time left when id changes
useEffect(() => void setTimeLeft(totalTime), [id, totalTime]);
return (
);
});
const RingContainer = styled(motion.div)`
display: flex;
align-items: center;
`;
const Heading = styled('div')`
font-weight: bold;
margin-bottom: ${space(1)};
display: grid;
grid-template-columns: 1fr max-content;
gap: ${space(0.5)};
`;
const FeatureLink = styled(motion.div)`
cursor: pointer;
transition: color 300ms;
color: ${p => p.theme.gray300};
position: relative;
display: grid;
grid-template-columns: max-content auto;
gap: ${space(1)};
align-items: center;
align-content: center;
margin-bottom: ${space(0.5)};
&:hover {
color: ${p => p.theme.textColor};
}
&[aria-selected] {
color: ${p => p.theme.textColor};
font-weight: bold;
}
`;
export default FeatureList;