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

70 lines
2.3 KiB
TypeScript

import {useEffect, useState} from 'react';
import type {RouteComponentProps} from 'react-router';
import {browserHistory} from 'react-router';
import Feature from 'sentry/components/acl/feature';
import {Alert} from 'sentry/components/alert';
import ErrorBoundary from 'sentry/components/errorBoundary';
import * as Layout from 'sentry/components/layouts/thirds';
import {t} from 'sentry/locale';
import type {Organization} from 'sentry/types';
import withOrganization from 'sentry/utils/withOrganization';
import {DASHBOARDS_TEMPLATES, EMPTY_DASHBOARD} from './data';
import DashboardDetail from './detail';
import type {Widget} from './types';
import {DashboardState} from './types';
import {cloneDashboard, constructWidgetFromQuery} from './utils';
type Props = RouteComponentProps<{templateId?: string; widgetId?: string}, {}> & {
children: React.ReactNode;
organization: Organization;
};
function CreateDashboard(props: Props) {
const {location} = props;
const {templateId} = props.params;
const [newWidget, setNewWidget] = useState<Widget | undefined>();
function renderDisabled() {
return (
<Layout.Page withPadding>
<Alert type="warning">{t("You don't have access to this feature")}</Alert>
</Layout.Page>
);
}
const template = templateId
? DASHBOARDS_TEMPLATES.find(dashboardTemplate => dashboardTemplate.id === templateId)
: undefined;
const dashboard = template ? cloneDashboard(template) : cloneDashboard(EMPTY_DASHBOARD);
const initialState = template ? DashboardState.PREVIEW : DashboardState.CREATE;
useEffect(() => {
const constructedWidget = constructWidgetFromQuery(location.query);
setNewWidget(constructedWidget);
if (constructedWidget) {
browserHistory.replace(location.pathname);
}
}, [location.pathname, location.query]);
return (
<Feature
features="dashboards-edit"
organization={props.organization}
renderDisabled={renderDisabled}
>
<ErrorBoundary>
<DashboardDetail
{...props}
initialState={initialState}
dashboard={dashboard}
dashboards={[]}
newWidget={newWidget}
onSetNewWidget={() => setNewWidget(undefined)}
/>
</ErrorBoundary>
</Feature>
);
}
export default withOrganization(CreateDashboard);