mirror of
https://github.com/hanzoai/sentinel.git
synced 2026-09-29 22:34:33 +00:00
108 lines
3.1 KiB
TypeScript
108 lines
3.1 KiB
TypeScript
import {Fragment} from 'react';
|
|
import type {RouteComponentProps} from 'react-router';
|
|
|
|
import Alert from 'sentry/components/alert';
|
|
import ApiForm from 'sentry/components/forms/apiForm';
|
|
import HiddenField from 'sentry/components/forms/fields/hiddenField';
|
|
import ExternalLink from 'sentry/components/links/externalLink';
|
|
import Link from 'sentry/components/links/link';
|
|
import LoadingIndicator from 'sentry/components/loadingIndicator';
|
|
import NarrowLayout from 'sentry/components/narrowLayout';
|
|
import SentryDocumentTitle from 'sentry/components/sentryDocumentTitle';
|
|
import {t, tct} from 'sentry/locale';
|
|
import {useApiQuery} from 'sentry/utils/queryClient';
|
|
import {decodeScalar} from 'sentry/utils/queryString';
|
|
import {useParams} from 'sentry/utils/useParams';
|
|
|
|
type RouteParams = {
|
|
id: string;
|
|
orgId: string;
|
|
};
|
|
|
|
type Props = RouteComponentProps<RouteParams, {}>;
|
|
|
|
function UnsubscribeIssue({location}: Props) {
|
|
const signature = decodeScalar(location.query._);
|
|
const params = useParams();
|
|
return (
|
|
<SentryDocumentTitle title={t('Issue Notification Unsubscribe')}>
|
|
<NarrowLayout>
|
|
<h3>{t('Issue Notification Unsubscribe')}</h3>
|
|
<UnsubscribeBody
|
|
signature={signature}
|
|
orgSlug={params.orgId}
|
|
issueId={params.id}
|
|
/>
|
|
</NarrowLayout>
|
|
</SentryDocumentTitle>
|
|
);
|
|
}
|
|
|
|
interface UnsubscribeResponse {
|
|
displayName: string;
|
|
type: string;
|
|
viewUrl: string;
|
|
}
|
|
|
|
type BodyProps = {
|
|
issueId: string;
|
|
orgSlug: string;
|
|
signature?: string;
|
|
};
|
|
|
|
function UnsubscribeBody({orgSlug, issueId, signature}: BodyProps) {
|
|
const endpoint = `/organizations/${orgSlug}/unsubscribe/issue/${issueId}/`;
|
|
const {isLoading, isError, data} = useApiQuery<UnsubscribeResponse>(
|
|
[endpoint, {query: {_: signature}}],
|
|
{staleTime: 0}
|
|
);
|
|
|
|
if (isLoading) {
|
|
return <LoadingIndicator />;
|
|
}
|
|
if (isError) {
|
|
return (
|
|
<Alert type="error">
|
|
{t('There was an error loading unsubscribe data. Your link may have expired.')}
|
|
</Alert>
|
|
);
|
|
}
|
|
|
|
return (
|
|
<Fragment>
|
|
<p>
|
|
<strong>{t('Account')}</strong>: {data.displayName}
|
|
</p>
|
|
<p>
|
|
{tct('You are about to unsubscribe from [docsLink] for the [viewLink].', {
|
|
docsLink: (
|
|
<ExternalLink href="https://docs.sentry.io/workflow/notifications/workflow/">
|
|
{t('workflow notifications')}
|
|
</ExternalLink>
|
|
),
|
|
viewLink: <Link to={data.viewUrl}>{t('selected %s', data.type)}</Link>,
|
|
})}
|
|
</p>
|
|
<ApiForm
|
|
apiEndpoint={`${endpoint}?_=${signature}`}
|
|
apiMethod="POST"
|
|
submitLabel={t('Unsubscribe')}
|
|
cancelLabel={t('Cancel')}
|
|
onCancel={() => {
|
|
// Use window.location as we're going to an HTML view
|
|
window.location.assign('/auth/login/');
|
|
}}
|
|
onSubmitSuccess={() => {
|
|
// Use window.location as we're going to an HTML view
|
|
window.location.assign('/auth/login/');
|
|
}}
|
|
initialData={{cancel: 1}}
|
|
>
|
|
<HiddenField name="cancel" />
|
|
</ApiForm>
|
|
</Fragment>
|
|
);
|
|
}
|
|
|
|
export default UnsubscribeIssue;
|