Cluster.tsx 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149
  1. import React, { Suspense } from 'react';
  2. import { useSelector } from 'react-redux';
  3. import { Routes, Navigate, Route, Outlet } from 'react-router-dom';
  4. import useAppParams from 'lib/hooks/useAppParams';
  5. import { ClusterFeaturesEnum } from 'generated-sources';
  6. import {
  7. getClustersFeatures,
  8. getClustersReadonlyStatus,
  9. } from 'redux/reducers/clusters/clustersSlice';
  10. import {
  11. clusterBrokerRelativePath,
  12. clusterConnectorsRelativePath,
  13. clusterConnectsRelativePath,
  14. clusterConsumerGroupsRelativePath,
  15. clusterKsqlDbRelativePath,
  16. ClusterNameRoute,
  17. clusterSchemasRelativePath,
  18. clusterTopicsRelativePath,
  19. getNonExactPath,
  20. } from 'lib/paths';
  21. import ClusterContext from 'components/contexts/ClusterContext';
  22. import Breadcrumb from 'components/common/Breadcrumb/Breadcrumb';
  23. import { BreadcrumbRoute } from 'components/common/Breadcrumb/Breadcrumb.route';
  24. import { BreadcrumbProvider } from 'components/common/Breadcrumb/Breadcrumb.provider';
  25. import PageLoader from 'components/common/PageLoader/PageLoader';
  26. const Brokers = React.lazy(() => import('components/Brokers/Brokers'));
  27. const Topics = React.lazy(() => import('components/Topics/Topics'));
  28. const Schemas = React.lazy(() => import('components/Schemas/Schemas'));
  29. const Connect = React.lazy(() => import('components/Connect/Connect'));
  30. const KsqlDb = React.lazy(() => import('components/KsqlDb/KsqlDb'));
  31. const ConsumerGroups = React.lazy(
  32. () => import('components/ConsumerGroups/ConsumerGroups')
  33. );
  34. const Cluster: React.FC = () => {
  35. const { clusterName } = useAppParams<ClusterNameRoute>();
  36. const isReadOnly = useSelector(getClustersReadonlyStatus(clusterName));
  37. const features = useSelector(getClustersFeatures(clusterName));
  38. const hasKafkaConnectConfigured = features.includes(
  39. ClusterFeaturesEnum.KAFKA_CONNECT
  40. );
  41. const hasSchemaRegistryConfigured = features.includes(
  42. ClusterFeaturesEnum.SCHEMA_REGISTRY
  43. );
  44. const isTopicDeletionAllowed = features.includes(
  45. ClusterFeaturesEnum.TOPIC_DELETION
  46. );
  47. const hasKsqlDbConfigured = features.includes(ClusterFeaturesEnum.KSQL_DB);
  48. const contextValue = React.useMemo(
  49. () => ({
  50. isReadOnly,
  51. hasKafkaConnectConfigured,
  52. hasSchemaRegistryConfigured,
  53. isTopicDeletionAllowed,
  54. }),
  55. [
  56. hasKafkaConnectConfigured,
  57. hasSchemaRegistryConfigured,
  58. isReadOnly,
  59. isTopicDeletionAllowed,
  60. ]
  61. );
  62. return (
  63. <BreadcrumbProvider>
  64. <Breadcrumb />
  65. <Suspense fallback={<PageLoader />}>
  66. <ClusterContext.Provider value={contextValue}>
  67. <Routes>
  68. <Route
  69. path={getNonExactPath(clusterBrokerRelativePath)}
  70. element={
  71. <BreadcrumbRoute>
  72. <Brokers />
  73. </BreadcrumbRoute>
  74. }
  75. />
  76. <Route
  77. path={getNonExactPath(clusterTopicsRelativePath)}
  78. element={
  79. <BreadcrumbRoute>
  80. <Topics />
  81. </BreadcrumbRoute>
  82. }
  83. />
  84. <Route
  85. path={getNonExactPath(clusterConsumerGroupsRelativePath)}
  86. element={
  87. <BreadcrumbRoute>
  88. <ConsumerGroups />
  89. </BreadcrumbRoute>
  90. }
  91. />
  92. {hasSchemaRegistryConfigured && (
  93. <Route
  94. path={getNonExactPath(clusterSchemasRelativePath)}
  95. element={
  96. <BreadcrumbRoute>
  97. <Schemas />
  98. </BreadcrumbRoute>
  99. }
  100. />
  101. )}
  102. {hasKafkaConnectConfigured && (
  103. <Route
  104. path={getNonExactPath(clusterConnectsRelativePath)}
  105. element={
  106. <BreadcrumbRoute>
  107. <Connect />
  108. </BreadcrumbRoute>
  109. }
  110. />
  111. )}
  112. {hasKafkaConnectConfigured && (
  113. <Route
  114. path={getNonExactPath(clusterConnectorsRelativePath)}
  115. element={
  116. <BreadcrumbRoute>
  117. <Connect />
  118. </BreadcrumbRoute>
  119. }
  120. />
  121. )}
  122. {hasKsqlDbConfigured && (
  123. <Route
  124. path={getNonExactPath(clusterKsqlDbRelativePath)}
  125. element={
  126. <BreadcrumbRoute>
  127. <KsqlDb />
  128. </BreadcrumbRoute>
  129. }
  130. />
  131. )}
  132. <Route
  133. path="/"
  134. element={<Navigate to={clusterBrokerRelativePath} replace />}
  135. />
  136. </Routes>
  137. <Outlet />
  138. </ClusterContext.Provider>
  139. </Suspense>
  140. </BreadcrumbProvider>
  141. );
  142. };
  143. export default Cluster;