widgetCardDataLoader.tsx 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148
  1. import {Fragment} from 'react';
  2. import type {PageFilters} from 'sentry/types/core';
  3. import type {Series} from 'sentry/types/echarts';
  4. import type {Confidence} from 'sentry/types/organization';
  5. import type {TableDataWithTitle} from 'sentry/utils/discover/discoverQuery';
  6. import type {AggregationOutputType} from 'sentry/utils/discover/fields';
  7. import useApi from 'sentry/utils/useApi';
  8. import useOrganization from 'sentry/utils/useOrganization';
  9. import SpansWidgetQueries from 'sentry/views/dashboards/widgetCard/spansWidgetQueries';
  10. import type {DashboardFilters, Widget} from '../types';
  11. import {WidgetType} from '../types';
  12. import IssueWidgetQueries from './issueWidgetQueries';
  13. import ReleaseWidgetQueries from './releaseWidgetQueries';
  14. import WidgetQueries from './widgetQueries';
  15. type Results = {
  16. loading: boolean;
  17. confidence?: Confidence;
  18. errorMessage?: string;
  19. pageLinks?: string;
  20. tableResults?: TableDataWithTitle[];
  21. timeseriesResults?: Series[];
  22. timeseriesResultsTypes?: Record<string, AggregationOutputType>;
  23. totalIssuesCount?: string;
  24. };
  25. type Props = {
  26. children: (props: Results) => React.ReactNode;
  27. selection: PageFilters;
  28. widget: Widget;
  29. dashboardFilters?: DashboardFilters;
  30. onDataFetched?: (
  31. results: Pick<
  32. Results,
  33. | 'pageLinks'
  34. | 'tableResults'
  35. | 'timeseriesResults'
  36. | 'timeseriesResultsTypes'
  37. | 'totalIssuesCount'
  38. | 'confidence'
  39. >
  40. ) => void;
  41. onWidgetSplitDecision?: (splitDecision: WidgetType) => void;
  42. tableItemLimit?: number;
  43. };
  44. export function WidgetCardDataLoader({
  45. children,
  46. widget,
  47. selection,
  48. dashboardFilters,
  49. tableItemLimit,
  50. onDataFetched,
  51. onWidgetSplitDecision,
  52. }: Props) {
  53. const api = useApi();
  54. const organization = useOrganization();
  55. if (widget.widgetType === WidgetType.ISSUE) {
  56. return (
  57. <IssueWidgetQueries
  58. api={api}
  59. organization={organization}
  60. widget={widget}
  61. selection={selection}
  62. limit={tableItemLimit}
  63. onDataFetched={onDataFetched}
  64. dashboardFilters={dashboardFilters}
  65. >
  66. {({tableResults, errorMessage, loading}) => (
  67. <Fragment>{children({tableResults, errorMessage, loading})}</Fragment>
  68. )}
  69. </IssueWidgetQueries>
  70. );
  71. }
  72. if (widget.widgetType === WidgetType.RELEASE) {
  73. return (
  74. <ReleaseWidgetQueries
  75. api={api}
  76. organization={organization}
  77. widget={widget}
  78. selection={selection}
  79. limit={widget.limit ?? tableItemLimit}
  80. onDataFetched={onDataFetched}
  81. dashboardFilters={dashboardFilters}
  82. >
  83. {({tableResults, timeseriesResults, errorMessage, loading}) => (
  84. <Fragment>
  85. {children({tableResults, timeseriesResults, errorMessage, loading})}
  86. </Fragment>
  87. )}
  88. </ReleaseWidgetQueries>
  89. );
  90. }
  91. if (widget.widgetType === WidgetType.SPANS) {
  92. return (
  93. <SpansWidgetQueries
  94. api={api}
  95. organization={organization}
  96. widget={widget}
  97. selection={selection}
  98. limit={tableItemLimit}
  99. onDataFetched={onDataFetched}
  100. dashboardFilters={dashboardFilters}
  101. >
  102. {props => <Fragment>{children({...props})}</Fragment>}
  103. </SpansWidgetQueries>
  104. );
  105. }
  106. return (
  107. <WidgetQueries
  108. api={api}
  109. organization={organization}
  110. widget={widget}
  111. selection={selection}
  112. limit={tableItemLimit}
  113. onDataFetched={onDataFetched}
  114. dashboardFilters={dashboardFilters}
  115. onWidgetSplitDecision={onWidgetSplitDecision}
  116. >
  117. {({
  118. tableResults,
  119. timeseriesResults,
  120. errorMessage,
  121. loading,
  122. timeseriesResultsTypes,
  123. confidence,
  124. }) => (
  125. <Fragment>
  126. {children({
  127. tableResults,
  128. timeseriesResults,
  129. errorMessage,
  130. loading,
  131. timeseriesResultsTypes,
  132. confidence,
  133. })}
  134. </Fragment>
  135. )}
  136. </WidgetQueries>
  137. );
  138. }