useAddToDashboard.tsx 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114
  1. import {useCallback} from 'react';
  2. import {t} from 'sentry/locale';
  3. import type {NewQuery} from 'sentry/types/organization';
  4. import EventView from 'sentry/utils/discover/eventView';
  5. import {MutableSearch} from 'sentry/utils/tokenizeSearch';
  6. import {useLocation} from 'sentry/utils/useLocation';
  7. import useOrganization from 'sentry/utils/useOrganization';
  8. import usePageFilters from 'sentry/utils/usePageFilters';
  9. import useRouter from 'sentry/utils/useRouter';
  10. import {DashboardWidgetSource, WidgetType} from 'sentry/views/dashboards/types';
  11. import {MAX_NUM_Y_AXES} from 'sentry/views/dashboards/widgetBuilder/buildSteps/yAxisStep/yAxisSelector';
  12. import {handleAddQueryToDashboard} from 'sentry/views/discover/utils';
  13. import {
  14. useExploreDataset,
  15. useExploreFields,
  16. useExploreGroupBys,
  17. useExploreMode,
  18. useExploreQuery,
  19. useExploreSortBys,
  20. useExploreVisualizes,
  21. } from 'sentry/views/explore/contexts/pageParamsContext';
  22. import {Mode} from 'sentry/views/explore/contexts/pageParamsContext/mode';
  23. import {formatSort} from 'sentry/views/explore/contexts/pageParamsContext/sortBys';
  24. export function useAddToDashboard() {
  25. const location = useLocation();
  26. const router = useRouter();
  27. const {selection} = usePageFilters();
  28. const organization = useOrganization();
  29. const mode = useExploreMode();
  30. const dataset = useExploreDataset();
  31. const groupBys = useExploreGroupBys();
  32. const sortBys = useExploreSortBys();
  33. const visualizes = useExploreVisualizes();
  34. const sampleFields = useExploreFields();
  35. const query = useExploreQuery();
  36. const hasWidgetBuilderRedesign = organization.features.includes(
  37. 'dashboards-widget-builder-redesign'
  38. );
  39. const getEventView = useCallback(
  40. (visualizeIndex: number) => {
  41. const yAxes = visualizes[visualizeIndex]!.yAxes.slice(0, MAX_NUM_Y_AXES);
  42. let fields: any;
  43. if (mode === Mode.SAMPLES) {
  44. if (hasWidgetBuilderRedesign) {
  45. // TODO: Handle the fields for the widget builder if we've selected the samples mode
  46. fields = [];
  47. } else {
  48. fields = sampleFields.filter(Boolean);
  49. }
  50. } else {
  51. fields = [
  52. ...new Set([...groupBys, ...yAxes, ...sortBys.map(sort => sort.field)]),
  53. ].filter(Boolean);
  54. }
  55. const search = new MutableSearch(query);
  56. const discoverQuery: NewQuery = {
  57. name: t('Custom Widget'),
  58. fields,
  59. orderby: sortBys.map(formatSort),
  60. query: search.formatString(),
  61. version: 2,
  62. dataset,
  63. yAxis: yAxes,
  64. };
  65. const newEventView = EventView.fromNewQueryWithPageFilters(
  66. discoverQuery,
  67. selection
  68. );
  69. newEventView.dataset = dataset;
  70. return newEventView;
  71. },
  72. [
  73. visualizes,
  74. mode,
  75. sampleFields,
  76. groupBys,
  77. query,
  78. dataset,
  79. selection,
  80. sortBys,
  81. hasWidgetBuilderRedesign,
  82. ]
  83. );
  84. const addToDashboard = useCallback(
  85. (visualizeIndex: number) => {
  86. const eventView = getEventView(visualizeIndex);
  87. handleAddQueryToDashboard({
  88. organization,
  89. location,
  90. eventView,
  91. router,
  92. yAxis: eventView.yAxis,
  93. widgetType: WidgetType.SPANS,
  94. source: DashboardWidgetSource.TRACE_EXPLORER,
  95. });
  96. },
  97. [organization, location, getEventView, router]
  98. );
  99. return {
  100. addToDashboard,
  101. };
  102. }