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