import React, { Suspense } from 'react'; import { NavLink, Route, Routes, useNavigate } from 'react-router-dom'; import { clusterTopicConsumerGroupsRelativePath, clusterTopicEditRelativePath, clusterTopicMessagesRelativePath, clusterTopicSettingsRelativePath, clusterTopicsPath, clusterTopicStatisticsRelativePath, RouteParamsClusterTopic, } from 'lib/paths'; import ClusterContext from 'components/contexts/ClusterContext'; import PageHeading from 'components/common/PageHeading/PageHeading'; import { ActionButton, ActionNavLink, ActionDropdownItem, } from 'components/common/ActionComponent'; import Navbar from 'components/common/Navigation/Navbar.styled'; import { useAppDispatch } from 'lib/hooks/redux'; import useAppParams from 'lib/hooks/useAppParams'; import { Dropdown, DropdownItemHint } from 'components/common/Dropdown'; import { useClearTopicMessages, useDeleteTopic, useRecreateTopic, useTopicDetails, } from 'lib/hooks/api/topics'; import { resetTopicMessages } from 'redux/reducers/topicMessages/topicMessagesSlice'; import { Action, CleanUpPolicy, ResourceType } from 'generated-sources'; import PageLoader from 'components/common/PageLoader/PageLoader'; import SlidingSidebar from 'components/common/SlidingSidebar'; import useBoolean from 'lib/hooks/useBoolean'; import Messages from './Messages/Messages'; import Overview from './Overview/Overview'; import Settings from './Settings/Settings'; import TopicConsumerGroups from './ConsumerGroups/TopicConsumerGroups'; import Statistics from './Statistics/Statistics'; import Edit from './Edit/Edit'; import SendMessage from './SendMessage/SendMessage'; const Topic: React.FC = () => { const dispatch = useAppDispatch(); const { value: isSidebarOpen, setFalse: closeSidebar, setTrue: openSidebar, } = useBoolean(false); const { clusterName, topicName } = useAppParams(); const navigate = useNavigate(); const deleteTopic = useDeleteTopic(clusterName); const recreateTopic = useRecreateTopic({ clusterName, topicName }); const { data } = useTopicDetails({ clusterName, topicName }); const { isReadOnly, isTopicDeletionAllowed } = React.useContext(ClusterContext); const deleteTopicHandler = async () => { await deleteTopic.mutateAsync(topicName); navigate(clusterTopicsPath(clusterName)); }; React.useEffect(() => { return () => { dispatch(resetTopicMessages()); }; }, []); const clearMessages = useClearTopicMessages(clusterName); const clearTopicMessagesHandler = async () => { await clearMessages.mutateAsync(topicName); }; const canCleanup = data?.cleanUpPolicy === CleanUpPolicy.DELETE; return ( <> Produce Message navigate(clusterTopicEditRelativePath)} permission={{ resource: ResourceType.TOPIC, action: Action.EDIT, value: topicName, }} > Edit settings Pay attention! This operation has
especially important consequences.
Clear messages Clearing messages is only allowed for topics
with DELETE policy
Are you sure want to recreate {topicName} topic? } danger permission={{ resource: ResourceType.TOPIC, action: [Action.MESSAGES_READ, Action.CREATE, Action.DELETE], value: topicName, }} > Recreate Topic Are you sure want to remove {topicName} topic? } disabled={!isTopicDeletionAllowed} danger permission={{ resource: ResourceType.TOPIC, action: Action.DELETE, value: topicName, }} > Remove Topic {!isTopicDeletionAllowed && ( The topic deletion is restricted at the application
configuration level
)}
(isActive ? 'is-active' : '')} end > Overview (isActive ? 'is-active' : '')} permission={{ resource: ResourceType.TOPIC, action: Action.MESSAGES_READ, value: topicName, }} > Messages (isActive ? 'is-active' : '')} > Consumers (isActive ? 'is-active' : '')} > Settings (isActive ? 'is-active' : '')} > Statistics }> } /> } /> } /> } /> } /> } /> }> ); }; export default Topic;