import {Fragment} from 'react'; import styled from '@emotion/styled'; import DateTime from 'sentry/components/dateTime'; import Tag from 'sentry/components/tag'; import TimeSince, {getRelativeDate} from 'sentry/components/timeSince'; import {t, tct} from 'sentry/locale'; import {InboxDetails} from 'sentry/types'; import {getDuration} from 'sentry/utils/formatters'; import getDynamicText from 'sentry/utils/getDynamicText'; import {Theme} from 'sentry/utils/theme'; const GroupInboxReason = { NEW: 0, UNIGNORED: 1, REGRESSION: 2, MANUAL: 3, REPROCESSED: 4, }; type Props = { inbox: InboxDetails; fontSize?: 'sm' | 'md'; /** Displays the time an issue was added to inbox */ showDateAdded?: boolean; }; const EVENT_ROUND_LIMIT = 1000; function InboxReason({inbox, fontSize = 'sm', showDateAdded}: Props) { const {reason, reason_details: reasonDetails, date_added: dateAdded} = inbox; const relativeDateAdded = getDynamicText({ value: dateAdded && getRelativeDate(dateAdded, 'ago', true), fixed: '3s ago', }); const getCountText = (count: number) => count > EVENT_ROUND_LIMIT ? `More than ${Math.round(count / EVENT_ROUND_LIMIT)}k` : `${count}`; function getTooltipDescription() { const { until, count, window, user_count: userCount, user_window: userWindow, } = reasonDetails; if (until) { // Was ignored until `until` has passed. // `until` format: "2021-01-20T03:59:03+00:00" return tct('Was ignored until [window]', { window: , }); } if (count) { // Was ignored until `count` events occurred // If `window` is defined, than `count` events occurred in `window` minutes. // else `count` events occurred since it was ignored. if (window) { return tct('Occurred [count] time(s) in [duration]', { count: getCountText(count), duration: getDuration(window * 60, 0, true), }); } return tct('Occurred [count] time(s)', { count: getCountText(count), }); } if (userCount) { // Was ignored until `user_count` users were affected // If `user_window` is defined, than `user_count` users affected in `user_window` minutes. // else `user_count` events occurred since it was ignored. if (userWindow) { return tct('Affected [count] user(s) in [duration]', { count: getCountText(userCount), duration: getDuration(userWindow * 60, 0, true), }); } return tct('Affected [count] user(s)', { count: getCountText(userCount), }); } return undefined; } function getReasonDetails(): { reasonBadgeText: string; tagType: React.ComponentProps['type']; tooltipDescription?: string | React.ReactNode; tooltipText?: string; } { switch (reason) { case GroupInboxReason.UNIGNORED: return { tagType: 'default', reasonBadgeText: t('Unignored'), tooltipText: dateAdded && t('Unignored %(relative)s', { relative: relativeDateAdded, }), tooltipDescription: getTooltipDescription(), }; case GroupInboxReason.REGRESSION: return { tagType: 'error', reasonBadgeText: t('Regression'), tooltipText: dateAdded && t('Regressed %(relative)s', { relative: relativeDateAdded, }), // TODO: Add tooltip description for regression move when resolver is added to reason // Resolved by {full_name} {time} ago. }; // TODO: Manual moves will go away, remove this then case GroupInboxReason.MANUAL: return { tagType: 'highlight', reasonBadgeText: t('Manual'), tooltipText: dateAdded && t('Moved %(relative)s', {relative: relativeDateAdded}), // TODO: IF manual moves stay then add tooltip description for manual move // Moved to inbox by {full_name}. }; case GroupInboxReason.REPROCESSED: return { tagType: 'info', reasonBadgeText: t('Reprocessed'), tooltipText: dateAdded && t('Reprocessed %(relative)s', { relative: relativeDateAdded, }), }; case GroupInboxReason.NEW: default: return { tagType: 'warning', reasonBadgeText: t('New Issue'), tooltipText: dateAdded && t('Created %(relative)s', { relative: relativeDateAdded, }), }; } } const {tooltipText, tooltipDescription, reasonBadgeText, tagType} = getReasonDetails(); const tooltip = (tooltipText || tooltipDescription) && ( {tooltipText &&
{tooltipText}
} {tooltipDescription && ( {tooltipDescription} )} Mark Reviewed to remove this label
); return ( {reasonBadgeText} {showDateAdded && dateAdded && ( {' | '} )} ); } export default InboxReason; const TooltipWrapper = styled('div')` text-align: left; `; const TooltipDescription = styled('div')` color: ${p => p.theme.subText}; `; const Separator = styled('span')<{type: keyof Theme['tag']}>` color: ${p => p.theme.tag[p.type].border}; opacity: 80%; `; const StyledTag = styled(Tag, { shouldForwardProp: p => p !== 'fontSize', })<{fontSize: 'sm' | 'md'}>` font-size: ${p => p.fontSize === 'sm' ? p.theme.fontSizeSmall : p.theme.fontSizeMedium}; `;