import {Fragment} from 'react'; import type {RouteComponentProps} from 'react-router'; import { addErrorMessage, addLoadingMessage, clearIndicators, } from 'sentry/actionCreators/indicator'; import {LinkButton} from 'sentry/components/button'; import EmptyMessage from 'sentry/components/emptyMessage'; import FieldGroup from 'sentry/components/forms/fieldGroup'; import Link from 'sentry/components/links/link'; import Panel from 'sentry/components/panels/panel'; import PanelAlert from 'sentry/components/panels/panelAlert'; import PanelBody from 'sentry/components/panels/panelBody'; import PanelHeader from 'sentry/components/panels/panelHeader'; import Switch from 'sentry/components/switchButton'; import Truncate from 'sentry/components/truncate'; import {IconAdd} from 'sentry/icons'; import {t} from 'sentry/locale'; import type {ServiceHook} from 'sentry/types/integrations'; import type {Organization} from 'sentry/types/organization'; import withOrganization from 'sentry/utils/withOrganization'; import DeprecatedAsyncView from 'sentry/views/deprecatedAsyncView'; import SettingsPageHeader from 'sentry/views/settings/components/settingsPageHeader'; type RowProps = { hook: ServiceHook; onToggleActive: () => void; orgId: string; projectId: string; }; function ServiceHookRow({orgId, projectId, hook, onToggleActive}: RowProps) { return ( } help={ {hook.events && hook.events.length !== 0 ? ( hook.events.join(', ') ) : ( {t('no events configured')} )} } > ); } type Props = RouteComponentProps<{projectId: string}, {}> & { organization: Organization; }; type State = { hookList: null | ServiceHook[]; } & DeprecatedAsyncView['state']; class ProjectServiceHooks extends DeprecatedAsyncView { getEndpoints(): ReturnType { const {organization, params} = this.props; const projectId = params.projectId; return [['hookList', `/projects/${organization.slug}/${projectId}/hooks/`]]; } onToggleActive = (hook: ServiceHook) => { const {organization, params} = this.props; const {hookList} = this.state; if (!hookList) { return; } addLoadingMessage(t('Saving changes\u2026')); this.api.request( `/projects/${organization.slug}/${params.projectId}/hooks/${hook.id}/`, { method: 'PUT', data: { isActive: hook.status !== 'active', }, success: data => { clearIndicators(); this.setState({ hookList: hookList.map(h => { if (h.id === data.id) { return { ...h, ...data, }; } return h; }), }); }, error: () => { addErrorMessage(t('Unable to remove application. Please try again.')); }, } ); }; renderEmpty() { return ( {t('There are no service hooks associated with this project.')} ); } renderResults() { const {organization, params} = this.props; return ( {t('Service Hook')} {t( 'Service Hooks are an early adopter preview feature and will change in the future.' )} {this.state.hookList?.map(hook => ( ))} ); } renderBody() { const {hookList} = this.state; const body = hookList && hookList.length > 0 ? this.renderResults() : this.renderEmpty(); const {organization, params} = this.props; return ( } > {t('Create New Hook')} ) : null } /> {body} ); } } export default withOrganization(ProjectServiceHooks);