import {Fragment} from 'react'; import styled from '@emotion/styled'; import type {DataZoomComponentOption, LegendComponentOption} from 'echarts'; import type {Location} from 'history'; import type {Client} from 'sentry/api'; import TransparentLoadingMask from 'sentry/components/charts/transparentLoadingMask'; import LoadingIndicator from 'sentry/components/loadingIndicator'; import type {Organization, PageFilters} from 'sentry/types'; import type {EChartEventHandler, Series} from 'sentry/types/echarts'; import type {TableDataWithTitle} from 'sentry/utils/discover/discoverQuery'; import type {AggregationOutputType} from 'sentry/utils/discover/fields'; import {useLocation} from 'sentry/utils/useLocation'; import useRouter from 'sentry/utils/useRouter'; import MetricWidgetQueries from 'sentry/views/dashboards/widgetCard/metricWidgetQueries'; import type {DashboardFilters, Widget} from '../types'; import {WidgetType} from '../types'; import type {AugmentedEChartDataZoomHandler} from './chart'; import WidgetCardChart from './chart'; import {IssueWidgetCard} from './issueWidgetCard'; import IssueWidgetQueries from './issueWidgetQueries'; import ReleaseWidgetQueries from './releaseWidgetQueries'; import WidgetQueries from './widgetQueries'; type Props = { api: Client; location: Location; organization: Organization; selection: PageFilters; widget: Widget; chartGroup?: string; chartZoomOptions?: DataZoomComponentOption; dashboardFilters?: DashboardFilters; expandNumbers?: boolean; isMobile?: boolean; legendOptions?: LegendComponentOption; noPadding?: boolean; onDataFetched?: (results: { pageLinks?: string; tableResults?: TableDataWithTitle[]; timeseriesResults?: Series[]; timeseriesResultsTypes?: Record; totalIssuesCount?: string; }) => void; onLegendSelectChanged?: EChartEventHandler<{ name: string; selected: Record; type: 'legendselectchanged'; }>; onZoom?: AugmentedEChartDataZoomHandler; renderErrorMessage?: (errorMessage?: string) => React.ReactNode; showSlider?: boolean; tableItemLimit?: number; windowWidth?: number; }; export function WidgetCardChartContainer({ api, organization, selection, widget, dashboardFilters, isMobile, renderErrorMessage, tableItemLimit, windowWidth, onZoom, onLegendSelectChanged, legendOptions, expandNumbers, onDataFetched, showSlider, noPadding, chartZoomOptions, chartGroup, }: Props) { const location = useLocation(); const router = useRouter(); if (widget.widgetType === WidgetType.ISSUE) { return ( {({tableResults, errorMessage, loading}) => { return ( {typeof renderErrorMessage === 'function' ? renderErrorMessage(errorMessage) : null} ); }} ); } if (widget.widgetType === WidgetType.RELEASE) { return ( {({tableResults, timeseriesResults, errorMessage, loading}) => { return ( {typeof renderErrorMessage === 'function' ? renderErrorMessage(errorMessage) : null} ); }} ); } if (widget.widgetType === WidgetType.METRICS) { return ( {({tableResults, timeseriesResults, errorMessage, loading}) => { return ( {typeof renderErrorMessage === 'function' ? renderErrorMessage(errorMessage) : null} ); }} ); } return ( {({ tableResults, timeseriesResults, errorMessage, loading, timeseriesResultsTypes, }) => { return ( {typeof renderErrorMessage === 'function' ? renderErrorMessage(errorMessage) : null} ); }} ); } export default WidgetCardChartContainer; const StyledTransparentLoadingMask = styled(props => ( ))` display: flex; justify-content: center; align-items: center; `; export function LoadingScreen({loading}: {loading: boolean}) { if (!loading) { return null; } return ( ); }