selectors.ts 4.4 KB

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