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

88 lines
3.0 KiB
TypeScript

import {Component} from 'react';
import type {RouteComponentProps} from 'react-router';
import Access from 'sentry/components/acl/access';
import Link from 'sentry/components/links/link';
import LoadingIndicator from 'sentry/components/loadingIndicator';
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 PanelItem from 'sentry/components/panels/panelItem';
import {t, tct} from 'sentry/locale';
import type {Organization, Plugin, Project} from 'sentry/types';
import RouteError from 'sentry/views/routeError';
import ProjectPluginRow from './projectPluginRow';
type Props = {
error: React.ComponentProps<typeof RouteError>['error'];
loading: boolean;
onChange: React.ComponentProps<typeof ProjectPluginRow>['onChange'];
organization: Organization;
plugins: Plugin[];
project: Project;
} & RouteComponentProps<{}, {}>;
class ProjectPlugins extends Component<Props> {
render() {
const {plugins, loading, error, onChange, routes, organization, project} = this.props;
const hasError = error;
const isLoading = !hasError && loading;
if (hasError) {
return <RouteError error={error} />;
}
if (isLoading) {
return <LoadingIndicator />;
}
const params = {orgId: organization.slug, projectId: project.slug};
return (
<Access access={['org:integrations']} project={project}>
{({hasAccess}) => (
<Panel>
<PanelHeader>
<div>{t('Legacy Integration')}</div>
<div />
</PanelHeader>
<PanelBody>
<PanelAlert type="warning">
{hasAccess
? tct(
"Legacy Integrations must be configured per-project. It's recommended to prefer organization integrations over the legacy project integrations when available. Visit the [link:organization integrations] settings to manage them.",
{
link: <Link to={`/settings/${organization.slug}/integrations`} />,
}
)
: t(
"Legacy Integrations must be configured per-project. It's recommended to prefer organization integrations over the legacy project integrations when available."
)}
</PanelAlert>
{plugins
.filter(p => {
return !p.isHidden;
})
.map(plugin => (
<PanelItem key={plugin.id}>
<ProjectPluginRow
params={params}
routes={routes}
project={project}
{...plugin}
onChange={onChange}
/>
</PanelItem>
))}
</PanelBody>
</Panel>
)}
</Access>
);
}
}
export default ProjectPlugins;