modulePageProviders.tsx 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657
  1. import * as Layout from 'sentry/components/layouts/thirds';
  2. import NoProjectMessage from 'sentry/components/noProjectMessage';
  3. import PageFiltersContainer from 'sentry/components/organizations/pageFilters/container';
  4. import SentryDocumentTitle from 'sentry/components/sentryDocumentTitle';
  5. import type {InsightEventKey} from 'sentry/utils/analytics/insightAnalyticEvents';
  6. import useOrganization from 'sentry/utils/useOrganization';
  7. import {WidgetSyncContextProvider} from 'sentry/views/dashboards/contexts/widgetSyncContext';
  8. import {useHasDataTrackAnalytics} from 'sentry/views/insights/common/utils/useHasDataTrackAnalytics';
  9. import {useModuleTitles} from 'sentry/views/insights/common/utils/useModuleTitle';
  10. import {INSIGHTS_TITLE, QUERY_DATE_RANGE_LIMIT} from 'sentry/views/insights/settings';
  11. import type {ModuleName} from 'sentry/views/insights/types';
  12. type ModuleNameStrings = `${ModuleName}`;
  13. export type TitleableModuleNames = Exclude<ModuleNameStrings, '' | 'other'>;
  14. interface Props {
  15. children: React.ReactNode;
  16. moduleName: TitleableModuleNames;
  17. analyticEventName?: InsightEventKey;
  18. pageTitle?: string;
  19. }
  20. export function ModulePageProviders({
  21. moduleName,
  22. pageTitle,
  23. children,
  24. analyticEventName,
  25. }: Props) {
  26. const organization = useOrganization();
  27. const moduleTitles = useModuleTitles();
  28. const hasDateRangeQueryLimit = organization.features.includes(
  29. 'insights-query-date-range-limit'
  30. );
  31. useHasDataTrackAnalytics(moduleName as ModuleName, analyticEventName);
  32. const moduleTitle = moduleTitles[moduleName];
  33. const fullPageTitle = [pageTitle, moduleTitle, INSIGHTS_TITLE]
  34. .filter(Boolean)
  35. .join(' — ');
  36. return (
  37. <PageFiltersContainer
  38. maxPickableDays={hasDateRangeQueryLimit ? QUERY_DATE_RANGE_LIMIT : undefined}
  39. >
  40. <SentryDocumentTitle title={fullPageTitle} orgSlug={organization.slug}>
  41. <Layout.Page>
  42. <NoProjectMessage organization={organization}>
  43. <WidgetSyncContextProvider>{children}</WidgetSyncContextProvider>
  44. </NoProjectMessage>
  45. </Layout.Page>
  46. </SentryDocumentTitle>
  47. </PageFiltersContainer>
  48. );
  49. }