metricsEnhancedPerformanceDataContext.tsx 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  1. import {ReactNode, useCallback, useState} from 'react';
  2. import Tag from 'sentry/components/tag';
  3. import useOrganization from 'sentry/utils/useOrganization';
  4. import {WIDGET_MAP_DENY_LIST} from 'sentry/views/performance/landing/widgets/utils';
  5. import {PerformanceWidgetSetting} from 'sentry/views/performance/landing/widgets/widgetDefinitions';
  6. import {AutoSampleState, useMEPSettingContext} from './metricsEnhancedSetting';
  7. import {createDefinedContext} from './utils';
  8. interface MetricsEnhancedPerformanceDataContext {
  9. setIsMetricsData: (value?: boolean) => void;
  10. isMetricsData?: boolean;
  11. }
  12. const [_MEPDataProvider, _useMEPDataContext] =
  13. createDefinedContext<MetricsEnhancedPerformanceDataContext>({
  14. name: 'MetricsEnhancedPerformanceDataContext',
  15. });
  16. export const MEPDataProvider = ({
  17. children,
  18. chartSetting,
  19. }: {
  20. children: ReactNode;
  21. chartSetting?: PerformanceWidgetSetting;
  22. }) => {
  23. const {setAutoSampleState} = useMEPSettingContext();
  24. const [isMetricsData, _setIsMetricsData] = useState<boolean | undefined>(undefined); // Uses undefined to cover 'not initialized'
  25. const setIsMetricsData = useCallback(
  26. (value?: boolean) => {
  27. if (WIDGET_MAP_DENY_LIST.includes(chartSetting as PerformanceWidgetSetting)) {
  28. // Certain widgets shouldn't update their sampled tags or have the page info change eg. Auto(...)
  29. return;
  30. }
  31. if (value === true) {
  32. setAutoSampleState(AutoSampleState.metrics);
  33. } else if (value === false) {
  34. setAutoSampleState(AutoSampleState.transactions);
  35. }
  36. _setIsMetricsData(value);
  37. },
  38. [setAutoSampleState, _setIsMetricsData, chartSetting]
  39. );
  40. return (
  41. <_MEPDataProvider value={{isMetricsData, setIsMetricsData}}>
  42. {children}
  43. </_MEPDataProvider>
  44. );
  45. };
  46. export const useMEPDataContext = _useMEPDataContext;
  47. export const MEPTag = () => {
  48. const {isMetricsData} = useMEPDataContext();
  49. const organization = useOrganization();
  50. if (!organization.features.includes('performance-use-metrics')) {
  51. // Separate if for easier flag deletion
  52. return null;
  53. }
  54. if (isMetricsData === undefined) {
  55. return <span data-test-id="no-metrics-data-tag" />;
  56. }
  57. const tagText = isMetricsData ? 'processed' : 'indexed';
  58. return <Tag data-test-id="has-metrics-data-tag">{tagText}</Tag>;
  59. };