modulePageProviders.tsx 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748
  1. import type {ComponentProps} from 'react';
  2. import Feature from 'sentry/components/acl/feature';
  3. import * as Layout from 'sentry/components/layouts/thirds';
  4. import NoProjectMessage from 'sentry/components/noProjectMessage';
  5. import PageFiltersContainer from 'sentry/components/organizations/pageFilters/container';
  6. import SentryDocumentTitle from 'sentry/components/sentryDocumentTitle';
  7. import useOrganization from 'sentry/utils/useOrganization';
  8. import {NoAccess} from 'sentry/views/insights/common/components/noAccess';
  9. import {useModuleTitle} from 'sentry/views/insights/common/utils/useModuleTitle';
  10. import {INSIGHTS_TITLE} from 'sentry/views/insights/settings';
  11. import type {ModuleName} from 'sentry/views/insights/types';
  12. type ModuleNameStrings = `${ModuleName}`;
  13. type TitleableModuleNames = Exclude<ModuleNameStrings, '' | 'other'>;
  14. interface Props {
  15. children: React.ReactNode;
  16. features: ComponentProps<typeof Feature>['features'];
  17. moduleName: TitleableModuleNames;
  18. pageTitle?: string;
  19. }
  20. export function ModulePageProviders({moduleName, pageTitle, children, features}: Props) {
  21. const organization = useOrganization();
  22. const moduleTitle = useModuleTitle(moduleName);
  23. const fullPageTitle = [pageTitle, moduleTitle, INSIGHTS_TITLE]
  24. .filter(Boolean)
  25. .join(' — ');
  26. return (
  27. <PageFiltersContainer>
  28. <SentryDocumentTitle title={fullPageTitle} orgSlug={organization.slug}>
  29. <Layout.Page>
  30. <Feature
  31. features={features}
  32. organization={organization}
  33. renderDisabled={NoAccess}
  34. >
  35. <NoProjectMessage organization={organization}>{children}</NoProjectMessage>
  36. </Feature>
  37. </Layout.Page>
  38. </SentryDocumentTitle>
  39. </PageFiltersContainer>
  40. );
  41. }