useValidateWidget.tsx 1.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243
  1. import {validateWidgetRequest} from 'sentry/actionCreators/dashboards';
  2. import type {Client} from 'sentry/api';
  3. import PageFiltersStore from 'sentry/stores/pageFiltersStore';
  4. import {hasOnDemandMetricWidgetFeature} from 'sentry/utils/onDemandMetrics/features';
  5. import {useApiQuery} from 'sentry/utils/queryClient';
  6. import useOrganization from 'sentry/utils/useOrganization';
  7. import usePageFilters from 'sentry/utils/usePageFilters';
  8. import type {ValidateWidgetResponse, Widget} from '../types';
  9. import {cleanWidgetForRequest} from '../widgetCard/genericWidgetQueries';
  10. export function validateWidget(
  11. api: Client,
  12. orgId: string,
  13. widget: Widget
  14. ): Promise<undefined> {
  15. const {selection} = PageFiltersStore.getState();
  16. const widgetQuery = validateWidgetRequest(orgId, widget, selection);
  17. const promise: Promise<undefined> = api.requestPromise(widgetQuery[0], widgetQuery[1]);
  18. return promise;
  19. }
  20. export function useValidateWidgetQuery(_widget: Widget) {
  21. const organization = useOrganization();
  22. const {selection} = usePageFilters();
  23. const cleanedWidget = cleanWidgetForRequest(_widget);
  24. // Pin title and description to avoid re-triggering validation on
  25. // every change in title/description.
  26. cleanedWidget.title = 'sentinel';
  27. cleanedWidget.description = 'sentinel';
  28. const data = useApiQuery<ValidateWidgetResponse>(
  29. validateWidgetRequest(organization.slug, cleanedWidget, selection),
  30. {
  31. staleTime: 10000,
  32. enabled: hasOnDemandMetricWidgetFeature(organization),
  33. }
  34. );
  35. return data;
  36. }