import {useMemo} from 'react';
import styled from '@emotion/styled';
import {urlEncode} from '@sentry/utils';
import {openAddToDashboardModal, openModal} from 'sentry/actionCreators/modal';
import {DropdownMenu} from 'sentry/components/dropdownMenu';
import {IconDashboard, IconEllipsis, IconSiren} from 'sentry/icons';
import {t} from 'sentry/locale';
import {space} from 'sentry/styles/space';
import {Organization} from 'sentry/types';
import {
getFieldFromMetricsQuery,
isCustomMeasurement,
isCustomMetric,
MetricDisplayType,
MetricsQuery,
} from 'sentry/utils/metrics';
import {hasDDMFeature} from 'sentry/utils/metrics/features';
import useOrganization from 'sentry/utils/useOrganization';
import useRouter from 'sentry/utils/useRouter';
import {DashboardWidgetSource, WidgetType} from 'sentry/views/dashboards/types';
import {CreateAlertModal} from 'sentry/views/ddm/createAlertModal';
import {OrganizationContext} from 'sentry/views/organizationContext';
type ContextMenuProps = {
displayType: MetricDisplayType;
metricsQuery: MetricsQuery;
};
export function MetricWidgetContextMenu({metricsQuery, displayType}: ContextMenuProps) {
const organization = useOrganization();
const createAlert = useCreateAlert(organization, metricsQuery);
const createDashboardWidget = useCreateDashboardWidget(
organization,
metricsQuery,
displayType
);
if (!hasDDMFeature(organization)) {
return null;
}
return (
],
key: 'add-alert',
label: t('Create Alert'),
disabled: !createAlert,
onAction: createAlert,
},
{
leadingItems: [],
key: 'add-dashoard',
label: t('Add to Dashboard'),
disabled: !createDashboardWidget,
onAction: createDashboardWidget,
},
]}
triggerProps={{
'aria-label': t('Widget actions'),
size: 'xs',
borderless: true,
showChevron: false,
icon: ,
}}
position="bottom-end"
/>
);
}
const StyledDropdownMenuControl = styled(DropdownMenu)`
margin: ${space(1)};
`;
export function useCreateAlert(organization: Organization, metricsQuery: MetricsQuery) {
return useMemo(() => {
if (
!metricsQuery.mri ||
!metricsQuery.op ||
isCustomMeasurement(metricsQuery) ||
!organization.access.includes('alerts:write')
) {
return undefined;
}
return function () {
return openModal(deps => (
));
};
}, [metricsQuery, organization]);
}
export function useCreateDashboardWidget(
organization: Organization,
metricsQuery: MetricsQuery,
displayType?: MetricDisplayType
) {
const router = useRouter();
const {projects, environments, datetime} = metricsQuery;
const isCustomMetricQuery = isCustomMetric(metricsQuery);
return useMemo(() => {
if (!metricsQuery.mri || !metricsQuery.op || isCustomMeasurement(metricsQuery)) {
return undefined;
}
const widgetQuery = getWidgetQuery(metricsQuery);
const urlWidgetQuery = encodeWidgetQuery(widgetQuery);
const widgetAsQueryParams = getWidgetAsQueryParams(
metricsQuery,
urlWidgetQuery,
displayType
);
return () =>
openAddToDashboardModal({
organization,
selection: {
projects,
environments,
datetime,
},
widget: {
title: 'DDM Widget',
displayType,
widgetType: isCustomMetricQuery ? WidgetType.METRICS : WidgetType.DISCOVER,
limit: !metricsQuery.groupBy?.length ? 1 : 10,
queries: [widgetQuery],
},
router,
widgetAsQueryParams,
location: router.location,
});
}, [
isCustomMetricQuery,
metricsQuery,
datetime,
displayType,
environments,
organization,
projects,
router,
]);
}
function getWidgetQuery(metricsQuery: MetricsQuery) {
const field = getFieldFromMetricsQuery(metricsQuery);
return {
name: '',
aggregates: [field],
columns: metricsQuery.groupBy ?? [],
fields: [field],
conditions: metricsQuery.query ?? '',
orderby: '',
};
}
function encodeWidgetQuery(query) {
return urlEncode({
...query,
aggregates: query.aggregates.join(','),
fields: query.fields?.join(','),
columns: query.columns.join(','),
});
}
function getWidgetAsQueryParams(
metricsQuery: MetricsQuery,
urlWidgetQuery: string,
displayType?: MetricDisplayType
) {
const {start, end, period} = metricsQuery.datetime;
const {projects} = metricsQuery;
return {
source: DashboardWidgetSource.DDM,
start,
end,
statsPeriod: period,
defaultWidgetQuery: urlWidgetQuery,
defaultTableColumns: [],
defaultTitle: 'DDM Widget',
environment: metricsQuery.environments,
displayType,
project: projects,
};
}