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

124 lines
4.1 KiB
TypeScript

import {Fragment, useState} from 'react';
import styled from '@emotion/styled';
import {addErrorMessage} from 'sentry/actionCreators/indicator';
import type {ModalRenderProps} from 'sentry/actionCreators/modal';
import NumberField from 'sentry/components/forms/fields/numberField';
import RadioField from 'sentry/components/forms/fields/radioField';
import Form from 'sentry/components/forms/form';
import ExternalLink from 'sentry/components/links/externalLink';
import List from 'sentry/components/list';
import ListItem from 'sentry/components/list/listItem';
import {t, tct} from 'sentry/locale';
import {space} from 'sentry/styles/space';
import type {Group, Organization} from 'sentry/types';
export type ReprocessEventModalOptions = {
groupId: Group['id'];
organization: Organization;
};
export function ReprocessingEventModal({
Header,
Body,
organization,
closeModal,
groupId,
}: ModalRenderProps & ReprocessEventModalOptions) {
const [maxEvents, setMaxEvents] = useState<number | undefined>(undefined);
function handleSuccess() {
closeModal();
window.location.reload();
}
return (
<Fragment>
<Header closeButton>
<h4>{t('Reprocess Events')}</h4>
</Header>
<Body>
<Introduction>
{t(
'Reprocessing applies new debug files and grouping enhancements to this Issue. Please consider these impacts:'
)}
</Introduction>
<StyledList symbol="bullet">
<ListItem>
{tct(
"[strong:Quota applies.] Every event you choose to reprocess counts against your plan's quota. Rate limits and spike protection do not apply.",
{strong: <strong />}
)}
</ListItem>
<ListItem>
{tct(
'[strong:Attachment storage required.] If your events come from minidumps or unreal crash reports, you must have [link:attachment storage] enabled.',
{
strong: <strong />,
link: (
<ExternalLink href="https://docs.sentry.io/platforms/native/enriching-events/attachments/#crash-reports-and-privacy" />
),
}
)}
</ListItem>
<ListItem>
{t(
'Please wait one hour after upload before attempting to reprocess missing debug files.'
)}
</ListItem>
</StyledList>
<Introduction>
{tct('For more information, please refer to [link:the documentation.]', {
link: (
<ExternalLink href="https://docs.sentry.io/product/error-monitoring/reprocessing/" />
),
})}
</Introduction>
<Form
submitLabel={t('Reprocess Events')}
apiEndpoint={`/organizations/${organization.slug}/issues/${groupId}/reprocessing/`}
apiMethod="POST"
initialData={{maxEvents: undefined, remainingEvents: 'keep'}}
onSubmitSuccess={handleSuccess}
onSubmitError={() =>
addErrorMessage(t('Failed to reprocess. Please check your input.'))
}
onCancel={closeModal}
footerClass="modal-footer"
>
<NumberField
name="maxEvents"
label={t('Number of events to be reprocessed')}
help={t('If you set a limit, we will reprocess your most recent events.')}
placeholder={t('Reprocess all events')}
onChange={value => setMaxEvents(!isNaN(value) ? Number(value) : undefined)}
min={1}
/>
<RadioField
orientInline
label={t('Remaining events')}
help={t('What to do with the events that are not reprocessed.')}
name="remainingEvents"
choices={[
['keep', t('Keep')],
['delete', t('Delete')],
]}
disabled={maxEvents === undefined}
/>
</Form>
</Body>
</Fragment>
);
}
const Introduction = styled('p')`
font-size: ${p => p.theme.fontSizeLarge};
`;
const StyledList = styled(List)`
gap: ${space(1)};
margin-bottom: ${space(4)};
font-size: ${p => p.theme.fontSizeMedium};
`;