selectors.ts 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170
  1. import { createSelector } from '@reduxjs/toolkit';
  2. import { RootState, TopicName, TopicsState } from 'redux/interfaces';
  3. import { CleanUpPolicy } from 'generated-sources';
  4. import { createFetchingSelector } from 'redux/reducers/loader/selectors';
  5. import {
  6. fetchTopicsList,
  7. fetchTopicDetails,
  8. fetchTopicConfig,
  9. updateTopic,
  10. fetchTopicMessageSchema,
  11. fetchTopicConsumerGroups,
  12. createTopic,
  13. deleteTopic,
  14. } from 'redux/reducers/topics/topicsSlice';
  15. import { AsyncRequestStatus } from 'lib/constants';
  16. const topicsState = ({ topics }: RootState): TopicsState => topics;
  17. const getAllNames = (state: RootState) => topicsState(state).allNames;
  18. const getTopicMap = (state: RootState) => topicsState(state).byName;
  19. export const getTopicListTotalPages = (state: RootState) =>
  20. topicsState(state).totalPages;
  21. const getTopicDeletingStatus = createFetchingSelector(deleteTopic.typePrefix);
  22. export const getIsTopicDeleted = createSelector(
  23. getTopicDeletingStatus,
  24. (status) => status === AsyncRequestStatus.fulfilled
  25. );
  26. const getAreTopicsFetchingStatus = createFetchingSelector(
  27. fetchTopicsList.typePrefix
  28. );
  29. export const getAreTopicsFetching = createSelector(
  30. getAreTopicsFetchingStatus,
  31. (status) => status === AsyncRequestStatus.pending
  32. );
  33. export const getAreTopicsFetched = createSelector(
  34. getAreTopicsFetchingStatus,
  35. (status) => status === AsyncRequestStatus.fulfilled
  36. );
  37. const getTopicDetailsFetchingStatus = createFetchingSelector(
  38. fetchTopicDetails.typePrefix
  39. );
  40. export const getIsTopicDetailsFetching = createSelector(
  41. getTopicDetailsFetchingStatus,
  42. (status) => status === AsyncRequestStatus.pending
  43. );
  44. export const getIsTopicDetailsFetched = createSelector(
  45. getTopicDetailsFetchingStatus,
  46. (status) => status === AsyncRequestStatus.fulfilled
  47. );
  48. const getTopicConfigFetchingStatus = createFetchingSelector(
  49. fetchTopicConfig.typePrefix
  50. );
  51. export const getTopicConfigFetched = createSelector(
  52. getTopicConfigFetchingStatus,
  53. (status) => status === AsyncRequestStatus.fulfilled
  54. );
  55. const getTopicCreationStatus = createFetchingSelector(createTopic.typePrefix);
  56. export const getTopicCreated = createSelector(
  57. getTopicCreationStatus,
  58. (status) => status === AsyncRequestStatus.fulfilled
  59. );
  60. const getTopicUpdateStatus = createFetchingSelector(updateTopic.typePrefix);
  61. export const getTopicUpdated = createSelector(
  62. getTopicUpdateStatus,
  63. (status) => status === AsyncRequestStatus.fulfilled
  64. );
  65. const getTopicMessageSchemaFetchingStatus = createFetchingSelector(
  66. fetchTopicMessageSchema.typePrefix
  67. );
  68. export const getTopicMessageSchemaFetched = createSelector(
  69. getTopicMessageSchemaFetchingStatus,
  70. (status) => status === AsyncRequestStatus.fulfilled
  71. );
  72. const getTopicConsumerGroupsStatus = createFetchingSelector(
  73. fetchTopicConsumerGroups.typePrefix
  74. );
  75. export const getTopicsConsumerGroupsFetched = createSelector(
  76. getTopicConsumerGroupsStatus,
  77. (status) => status === AsyncRequestStatus.fulfilled
  78. );
  79. export const getTopicList = createSelector(
  80. getAreTopicsFetched,
  81. getAllNames,
  82. getTopicMap,
  83. (isFetched, allNames, byName) => {
  84. if (!isFetched) {
  85. return [];
  86. }
  87. return allNames.map((name) => byName[name]);
  88. }
  89. );
  90. const getTopicName = (_: RootState, topicName: TopicName) => topicName;
  91. export const getTopicByName = createSelector(
  92. getTopicMap,
  93. getTopicName,
  94. (topics, topicName) => topics[topicName] || {}
  95. );
  96. export const getPartitionsByTopicName = createSelector(
  97. getTopicMap,
  98. getTopicName,
  99. (topics, topicName) => topics[topicName]?.partitions || []
  100. );
  101. export const getFullTopic = createSelector(getTopicByName, (topic) =>
  102. topic && topic.config && !!topic.partitionCount ? topic : undefined
  103. );
  104. export const getTopicConfig = createSelector(
  105. getTopicByName,
  106. ({ config }) => config
  107. );
  108. export const getIsTopicDeletePolicy = createSelector(
  109. getTopicByName,
  110. (topic) => {
  111. return topic?.cleanUpPolicy === CleanUpPolicy.DELETE;
  112. }
  113. );
  114. export const getTopicsSearch = createSelector(
  115. topicsState,
  116. (state) => state.search
  117. );
  118. export const getTopicsOrderBy = createSelector(
  119. topicsState,
  120. (state) => state.orderBy
  121. );
  122. export const getTopicsSortOrder = createSelector(
  123. topicsState,
  124. (state) => state.sortOrder
  125. );
  126. export const getIsTopicInternal = createSelector(
  127. getTopicByName,
  128. (topic) => !!topic?.internal
  129. );
  130. export const getTopicConsumerGroups = createSelector(
  131. getTopicByName,
  132. ({ consumerGroups }) => consumerGroups || []
  133. );
  134. export const getMessageSchemaByTopicName = createSelector(
  135. getTopicByName,
  136. (topic) => topic?.messageSchema
  137. );