Cluster.tsx 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111
  1. import React from 'react';
  2. import { useSelector } from 'react-redux';
  3. import { Switch, Redirect, useParams } from 'react-router-dom';
  4. import { ClusterFeaturesEnum } from 'generated-sources';
  5. import {
  6. getClustersFeatures,
  7. getClustersReadonlyStatus,
  8. } from 'redux/reducers/clusters/clustersSlice';
  9. import {
  10. clusterBrokersPath,
  11. clusterConnectorsPath,
  12. clusterConnectsPath,
  13. clusterConsumerGroupsPath,
  14. clusterKsqlDbPath,
  15. clusterSchemasPath,
  16. clusterTopicsPath,
  17. } from 'lib/paths';
  18. import Topics from 'components/Topics/Topics';
  19. import Schemas from 'components/Schemas/Schemas';
  20. import Connect from 'components/Connect/Connect';
  21. import ClusterContext from 'components/contexts/ClusterContext';
  22. import Brokers from 'components/Brokers/Brokers';
  23. import ConsumersGroups from 'components/ConsumerGroups/ConsumerGroups';
  24. import KsqlDb from 'components/KsqlDb/KsqlDb';
  25. import Breadcrumb from 'components/common/Breadcrumb/Breadcrumb';
  26. import { BreadcrumbRoute } from 'components/common/Breadcrumb/Breadcrumb.route';
  27. import { BreadcrumbProvider } from 'components/common/Breadcrumb/Breadcrumb.provider';
  28. const Cluster: React.FC = () => {
  29. const { clusterName } = useParams<{ clusterName: string }>();
  30. const isReadOnly = useSelector(getClustersReadonlyStatus(clusterName));
  31. const features = useSelector(getClustersFeatures(clusterName));
  32. const hasKafkaConnectConfigured = features.includes(
  33. ClusterFeaturesEnum.KAFKA_CONNECT
  34. );
  35. const hasSchemaRegistryConfigured = features.includes(
  36. ClusterFeaturesEnum.SCHEMA_REGISTRY
  37. );
  38. const isTopicDeletionAllowed = features.includes(
  39. ClusterFeaturesEnum.TOPIC_DELETION
  40. );
  41. const hasKsqlDbConfigured = features.includes(ClusterFeaturesEnum.KSQL_DB);
  42. const contextValue = React.useMemo(
  43. () => ({
  44. isReadOnly,
  45. hasKafkaConnectConfigured,
  46. hasSchemaRegistryConfigured,
  47. isTopicDeletionAllowed,
  48. }),
  49. [
  50. hasKafkaConnectConfigured,
  51. hasSchemaRegistryConfigured,
  52. isReadOnly,
  53. isTopicDeletionAllowed,
  54. ]
  55. );
  56. return (
  57. <BreadcrumbProvider>
  58. <Breadcrumb />
  59. <ClusterContext.Provider value={contextValue}>
  60. <Switch>
  61. <BreadcrumbRoute
  62. path={clusterBrokersPath(':clusterName')}
  63. component={Brokers}
  64. />
  65. <BreadcrumbRoute
  66. path={clusterTopicsPath(':clusterName')}
  67. component={Topics}
  68. />
  69. <BreadcrumbRoute
  70. path={clusterConsumerGroupsPath(':clusterName')}
  71. component={ConsumersGroups}
  72. />
  73. {hasSchemaRegistryConfigured && (
  74. <BreadcrumbRoute
  75. path={clusterSchemasPath(':clusterName')}
  76. component={Schemas}
  77. />
  78. )}
  79. {hasKafkaConnectConfigured && (
  80. <BreadcrumbRoute
  81. path={clusterConnectsPath(':clusterName')}
  82. component={Connect}
  83. />
  84. )}
  85. {hasKafkaConnectConfigured && (
  86. <BreadcrumbRoute
  87. path={clusterConnectorsPath(':clusterName')}
  88. component={Connect}
  89. />
  90. )}
  91. {hasKsqlDbConfigured && (
  92. <BreadcrumbRoute
  93. path={clusterKsqlDbPath(':clusterName')}
  94. component={KsqlDb}
  95. />
  96. )}
  97. <Redirect
  98. from="/ui/clusters/:clusterName"
  99. to="/ui/clusters/:clusterName/brokers"
  100. />
  101. </Switch>
  102. </ClusterContext.Provider>
  103. </BreadcrumbProvider>
  104. );
  105. };
  106. export default Cluster;