Topic.tsx 2.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192
  1. import React from 'react';
  2. import { Switch, Route, useParams } from 'react-router-dom';
  3. import { clusterTopicPath, clusterTopicsPath } from 'lib/paths';
  4. import { ClusterName, TopicName } from 'redux/interfaces';
  5. import Breadcrumb from 'components/common/Breadcrumb/Breadcrumb';
  6. import EditContainer from 'components/Topics/Topic/Edit/EditContainer';
  7. import DetailsContainer from 'components/Topics/Topic/Details/DetailsContainer';
  8. import PageLoader from 'components/common/PageLoader/PageLoader';
  9. import SendMessageContainer from './SendMessage/SendMessageContainer';
  10. interface RouterParams {
  11. clusterName: ClusterName;
  12. topicName: TopicName;
  13. }
  14. interface TopicProps {
  15. isTopicFetching: boolean;
  16. fetchTopicDetails: (clusterName: ClusterName, topicName: TopicName) => void;
  17. }
  18. const Topic: React.FC<TopicProps> = ({
  19. isTopicFetching,
  20. fetchTopicDetails,
  21. }) => {
  22. const { clusterName, topicName } = useParams<RouterParams>();
  23. React.useEffect(() => {
  24. fetchTopicDetails(clusterName, topicName);
  25. }, [fetchTopicDetails, clusterName, topicName]);
  26. const rootBreadcrumbLinks = [
  27. {
  28. href: clusterTopicsPath(clusterName),
  29. label: 'All Topics',
  30. },
  31. ];
  32. const childBreadcrumbLinks = [
  33. ...rootBreadcrumbLinks,
  34. {
  35. href: clusterTopicPath(clusterName, topicName),
  36. label: topicName,
  37. },
  38. ];
  39. const topicPageUrl = '/ui/clusters/:clusterName/topics/:topicName';
  40. return (
  41. <div className="section">
  42. <div className="level">
  43. <div className="level-item level-left">
  44. <Switch>
  45. <Route exact path={`${topicPageUrl}/message`}>
  46. <Breadcrumb links={childBreadcrumbLinks}>
  47. Produce Message
  48. </Breadcrumb>
  49. </Route>
  50. <Route exact path={`${topicPageUrl}/edit`}>
  51. <Breadcrumb links={childBreadcrumbLinks}>Edit</Breadcrumb>
  52. </Route>
  53. <Route path={topicPageUrl}>
  54. <Breadcrumb links={rootBreadcrumbLinks}>{topicName}</Breadcrumb>
  55. </Route>
  56. </Switch>
  57. </div>
  58. </div>
  59. {isTopicFetching ? (
  60. <PageLoader />
  61. ) : (
  62. <Switch>
  63. <Route
  64. exact
  65. path="/ui/clusters/:clusterName/topics/:topicName/edit"
  66. component={EditContainer}
  67. />
  68. <Route
  69. exact
  70. path="/ui/clusters/:clusterName/topics/:topicName/message"
  71. component={SendMessageContainer}
  72. />
  73. <Route
  74. path="/ui/clusters/:clusterName/topics/:topicName"
  75. component={DetailsContainer}
  76. />
  77. </Switch>
  78. )}
  79. </div>
  80. );
  81. };
  82. export default Topic;