projectSettingsLayout.tsx 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  1. import {cloneElement, Fragment, isValidElement} from 'react';
  2. import type {RouteComponentProps} from 'sentry/types/legacyReactRouter';
  3. import type {Organization} from 'sentry/types/organization';
  4. import type {Project} from 'sentry/types/project';
  5. import useRouteAnalyticsParams from 'sentry/utils/routeAnalytics/useRouteAnalyticsParams';
  6. import withOrganization from 'sentry/utils/withOrganization';
  7. import ProjectContext from 'sentry/views/projects/projectContext';
  8. import SettingsLayout from 'sentry/views/settings/components/settingsLayout';
  9. import ProjectSettingsNavigation from 'sentry/views/settings/project/projectSettingsNavigation';
  10. type Props = {
  11. children: React.ReactNode;
  12. organization: Organization;
  13. } & RouteComponentProps<{projectId: string}, {}>;
  14. type InnerProps = Props & {project: Project};
  15. function InnerProjectSettingsLayout({
  16. params,
  17. routes,
  18. project,
  19. organization,
  20. children,
  21. ...props
  22. }: InnerProps) {
  23. // set analytics params for route based analytics
  24. useRouteAnalyticsParams({
  25. project_id: project.id,
  26. project_platform: project.platform,
  27. });
  28. const hasNavigationV2 = organization?.features.includes('navigation-sidebar-v2');
  29. if (hasNavigationV2) {
  30. return (
  31. <Fragment>
  32. <ProjectSettingsNavigation organization={organization} />
  33. <SettingsLayout params={params} routes={routes} {...props}>
  34. {children && isValidElement(children)
  35. ? cloneElement<any>(children, {organization, project})
  36. : children}
  37. </SettingsLayout>
  38. </Fragment>
  39. );
  40. }
  41. return (
  42. <SettingsLayout
  43. params={params}
  44. routes={routes}
  45. {...props}
  46. renderNavigation={() => <ProjectSettingsNavigation organization={organization} />}
  47. >
  48. {children && isValidElement(children)
  49. ? cloneElement<any>(children, {organization, project})
  50. : children}
  51. </SettingsLayout>
  52. );
  53. }
  54. function ProjectSettingsLayout({organization, params, ...props}: Props) {
  55. return (
  56. <ProjectContext projectSlug={params.projectId}>
  57. {({project}) => (
  58. <InnerProjectSettingsLayout {...{params, project, organization, ...props}} />
  59. )}
  60. </ProjectContext>
  61. );
  62. }
  63. export default withOrganization(ProjectSettingsLayout);