selectors.ts 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181
  1. import { createSelector } from '@reduxjs/toolkit';
  2. import {
  3. RootState,
  4. TopicName,
  5. TopicsState,
  6. TopicConfigByName,
  7. } from 'redux/interfaces';
  8. import { CleanUpPolicy } from 'generated-sources';
  9. import { createLeagcyFetchingSelector } from 'redux/reducers/loader/selectors';
  10. const topicsState = ({ topics }: RootState): TopicsState => topics;
  11. const getAllNames = (state: RootState) => topicsState(state).allNames;
  12. const getTopicMap = (state: RootState) => topicsState(state).byName;
  13. export const getTopicListTotalPages = (state: RootState) =>
  14. topicsState(state).totalPages;
  15. const getTopicListFetchingStatus = createLeagcyFetchingSelector('GET_TOPICS');
  16. const getTopicDetailsFetchingStatus =
  17. createLeagcyFetchingSelector('GET_TOPIC_DETAILS');
  18. const getTopicConfigFetchingStatus =
  19. createLeagcyFetchingSelector('GET_TOPIC_CONFIG');
  20. const getTopicCreationStatus = createLeagcyFetchingSelector('POST_TOPIC');
  21. const getTopicUpdateStatus = createLeagcyFetchingSelector('PATCH_TOPIC');
  22. const getTopicMessageSchemaFetchingStatus =
  23. createLeagcyFetchingSelector('GET_TOPIC_SCHEMA');
  24. const getTopicMessageSendingStatus =
  25. createLeagcyFetchingSelector('SEND_TOPIC_MESSAGE');
  26. const getPartitionsCountIncreaseStatus =
  27. createLeagcyFetchingSelector('UPDATE_PARTITIONS');
  28. const getReplicationFactorUpdateStatus = createLeagcyFetchingSelector(
  29. 'UPDATE_REPLICATION_FACTOR'
  30. );
  31. const getTopicDeletingStatus = createLeagcyFetchingSelector('DELETE_TOPIC');
  32. export const getIsTopicDeleted = createSelector(
  33. getTopicDeletingStatus,
  34. (status) => status === 'fetched'
  35. );
  36. export const getAreTopicsFetching = createSelector(
  37. getTopicListFetchingStatus,
  38. (status) => status === 'fetching' || status === 'notFetched'
  39. );
  40. export const getAreTopicsFetched = createSelector(
  41. getTopicListFetchingStatus,
  42. (status) => status === 'fetched'
  43. );
  44. export const getIsTopicDetailsFetching = createSelector(
  45. getTopicDetailsFetchingStatus,
  46. (status) => status === 'notFetched' || status === 'fetching'
  47. );
  48. export const getIsTopicDetailsFetched = createSelector(
  49. getTopicDetailsFetchingStatus,
  50. (status) => status === 'fetched'
  51. );
  52. export const getTopicConfigFetched = createSelector(
  53. getTopicConfigFetchingStatus,
  54. (status) => status === 'fetched'
  55. );
  56. export const getTopicCreated = createSelector(
  57. getTopicCreationStatus,
  58. (status) => status === 'fetched'
  59. );
  60. export const getTopicUpdated = createSelector(
  61. getTopicUpdateStatus,
  62. (status) => status === 'fetched'
  63. );
  64. export const getTopicMessageSchemaFetched = createSelector(
  65. getTopicMessageSchemaFetchingStatus,
  66. (status) => status === 'fetched'
  67. );
  68. export const getTopicMessageSending = createSelector(
  69. getTopicMessageSendingStatus,
  70. (status) => status === 'fetching'
  71. );
  72. export const getTopicPartitionsCountIncreased = createSelector(
  73. getPartitionsCountIncreaseStatus,
  74. (status) => status === 'fetched'
  75. );
  76. export const getTopicReplicationFactorUpdated = createSelector(
  77. getReplicationFactorUpdateStatus,
  78. (status) => status === 'fetched'
  79. );
  80. export const getTopicList = createSelector(
  81. getAreTopicsFetched,
  82. getAllNames,
  83. getTopicMap,
  84. (isFetched, allNames, byName) => {
  85. if (!isFetched) {
  86. return [];
  87. }
  88. return allNames.map((name) => byName[name]);
  89. }
  90. );
  91. const getTopicName = (_: RootState, topicName: TopicName) => topicName;
  92. export const getTopicByName = createSelector(
  93. getTopicMap,
  94. getTopicName,
  95. (topics, topicName) => topics[topicName]
  96. );
  97. export const getPartitionsByTopicName = createSelector(
  98. getTopicMap,
  99. getTopicName,
  100. (topics, topicName) => topics[topicName]?.partitions || []
  101. );
  102. export const getFullTopic = createSelector(getTopicByName, (topic) =>
  103. topic && topic.config && !!topic.partitionCount ? topic : undefined
  104. );
  105. export const getTopicConfig = createSelector(
  106. getTopicByName,
  107. ({ config }) => config
  108. );
  109. export const getTopicConfigByParamName = createSelector(
  110. getTopicConfig,
  111. (config) => {
  112. const byParamName: TopicConfigByName = {
  113. byName: {},
  114. };
  115. if (config) {
  116. config.forEach((param) => {
  117. byParamName.byName[param.name] = param;
  118. });
  119. }
  120. return byParamName;
  121. }
  122. );
  123. export const getIsTopicDeletePolicy = createSelector(
  124. getTopicByName,
  125. (topic) => {
  126. return topic?.cleanUpPolicy === CleanUpPolicy.DELETE;
  127. }
  128. );
  129. export const getTopicsSearch = createSelector(
  130. topicsState,
  131. (state) => state.search
  132. );
  133. export const getTopicsOrderBy = createSelector(
  134. topicsState,
  135. (state) => state.orderBy
  136. );
  137. export const getIsTopicInternal = createSelector(
  138. getTopicByName,
  139. (topic) => !!topic?.internal
  140. );
  141. export const getTopicConsumerGroups = createSelector(
  142. getTopicMap,
  143. getTopicName,
  144. (topics, topicName) => topics[topicName].consumerGroups || []
  145. );
  146. export const getMessageSchemaByTopicName = createSelector(
  147. getTopicByName,
  148. (topic) => topic.messageSchema
  149. );