123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123 |
- import {Fragment, useState} from 'react';
- import styled from '@emotion/styled';
- import {addErrorMessage} from 'sentry/actionCreators/indicator';
- import {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 {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};
- `;
|