Cluster.tsx 4.6 KB

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