selectors.ts 7.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246
  1. /*
  2. * <<
  3. * Davinci
  4. * ==
  5. * Copyright (C) 2016 - 2017 EDP
  6. * ==
  7. * Licensed under the Apache License, Version 2.0 (the "License");
  8. * you may not use this file except in compliance with the License.
  9. * You may obtain a copy of the License at
  10. *
  11. * http://www.apache.org/licenses/LICENSE-2.0
  12. *
  13. * Unless required by applicable law or agreed to in writing, software
  14. * distributed under the License is distributed on an "AS IS" BASIS,
  15. * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  16. * See the License for the specific language governing permissions and
  17. * limitations under the License.
  18. * >>
  19. */
  20. import { createSelector, createSelectorCreator } from 'reselect'
  21. import { IDisplayState } from './types'
  22. import { initialState } from './reducer'
  23. import { LayerContextValue } from './components/types'
  24. const selectDisplay = (state: { display: IDisplayState }) =>
  25. state.display || initialState
  26. const selectPropsSlideId = (_, slideId: number) => slideId
  27. const selectPropsLayerId = (_, layerId: number) => layerId
  28. const selectCurrentSlideId = (state: { display: IDisplayState }) =>
  29. state.display ? state.display.currentSlideId : initialState.currentSlideId
  30. const selectSlideLayers = (state: { display: IDisplayState }) =>
  31. state.display ? state.display.slideLayers : initialState.slideLayers
  32. const selectSlideLayersInfo = (state: { display: IDisplayState }) =>
  33. state.display ? state.display.slideLayersInfo : initialState.slideLayersInfo
  34. const selectSlideLayersOperationInfo = (state: { display: IDisplayState }) =>
  35. state.display
  36. ? state.display.slideLayersOperationInfo
  37. : initialState.slideLayersOperationInfo
  38. const selectCurrentLayers = (state: { display: IDisplayState }) =>
  39. state.display
  40. ? state.display.slideLayers[state.display.currentSlideId] || {}
  41. : {}
  42. const makeSelectCurrentLayersOperationInfo = () => (state: {
  43. display: IDisplayState
  44. }) =>
  45. state.display
  46. ? state.display.slideLayersOperationInfo[state.display.currentSlideId] || {}
  47. : {}
  48. const makeSelectLayersBySlide = () =>
  49. createSelector(
  50. selectSlideLayers,
  51. selectPropsSlideId,
  52. (slideLayers, slideId) => slideLayers[slideId]
  53. )
  54. const makeSelectLayerIdsBySlide = () =>
  55. createSelector(makeSelectLayersBySlide(), (layers) =>
  56. !layers ? [] : Object.keys(layers).map((id) => +id)
  57. )
  58. const makeSelectCurrentLayerList = () =>
  59. createSelector(selectCurrentLayers, (currentLayers) =>
  60. Object.values(currentLayers).sort((l1, l2) => l2.index - l1.index)
  61. )
  62. const makeSelectCurrentLayerIds = () =>
  63. createSelector(selectCurrentLayers, (currentLayers) =>
  64. Object.keys(currentLayers).map((id) => +id)
  65. )
  66. const makeSelectSlideLayerContextValue = () =>
  67. createSelector(
  68. selectSlideLayers,
  69. selectSlideLayersOperationInfo,
  70. selectSlideLayersInfo,
  71. (_, slideId: number) => slideId,
  72. (_1, _2, layerId: number) => layerId,
  73. (_1, _2, _3, editing: boolean = true) => editing,
  74. (
  75. slideLayers,
  76. slideLayersOperationInfo,
  77. slideLayersInfo,
  78. slideId,
  79. layerId,
  80. editing
  81. ) => {
  82. const layerContextValue: LayerContextValue = {
  83. layer: slideLayers[slideId][layerId],
  84. layerInfo: slideLayersInfo[slideId][layerId]
  85. }
  86. if (editing) {
  87. layerContextValue.operationInfo =
  88. slideLayersOperationInfo[slideId][layerId]
  89. }
  90. return layerContextValue
  91. }
  92. )
  93. const makeSelectCurrentLayersMaxIndex = () =>
  94. createSelector(makeSelectCurrentLayerList(), (currentLayerList) =>
  95. currentLayerList.length
  96. ? currentLayerList[currentLayerList.length - 1].index
  97. : 0
  98. )
  99. const makeSelectCurrentSelectedLayerList = () =>
  100. createSelector(
  101. makeSelectCurrentLayerList(),
  102. makeSelectCurrentLayersOperationInfo(),
  103. (currentLayerList, currentLayersOperationInfo) =>
  104. currentLayerList.filter(
  105. ({ id }) => currentLayersOperationInfo[id].selected
  106. )
  107. )
  108. const makeSelectCurrentEditLayerOperationInfo = () =>
  109. createSelector(
  110. makeSelectCurrentLayersOperationInfo(),
  111. (currentEditOperationInfo) =>
  112. Object.values(currentEditOperationInfo).filter(
  113. (layerInfo) => layerInfo.editing
  114. )
  115. )
  116. const makeSelectCurrentSelectedLayerIds = () =>
  117. createSelector(
  118. makeSelectCurrentLayersOperationInfo(),
  119. (currentLayersOperationInfo) =>
  120. Object.keys(currentLayersOperationInfo)
  121. .filter((id) => currentLayersOperationInfo[+id].selected)
  122. .map((id) => +id)
  123. )
  124. const makeSelectCurrentOperatingLayerList = () =>
  125. createSelector(
  126. selectPropsLayerId,
  127. selectCurrentLayers,
  128. makeSelectCurrentLayersOperationInfo(),
  129. makeSelectCurrentSelectedLayerList(),
  130. (layerId, currentLayers, currentLayersOperationInfo, selectedLayerList) => {
  131. if (layerId && !currentLayersOperationInfo[layerId].selected) {
  132. return [currentLayers[layerId]]
  133. } else {
  134. return selectedLayerList
  135. }
  136. }
  137. )
  138. const makeSelectCurrentOtherLayerList = () =>
  139. createSelector(
  140. selectPropsLayerId,
  141. makeSelectCurrentLayersOperationInfo(),
  142. makeSelectCurrentSelectedLayerIds(),
  143. selectCurrentLayers,
  144. (layerId, currentLayersOperationInfo, selectedLayerIds, currentLayers) => {
  145. if (layerId && !currentLayersOperationInfo[layerId].selected) {
  146. return [currentLayers[layerId]]
  147. } else {
  148. return Object.entries(currentLayers)
  149. .filter(([id]) => !selectedLayerIds.includes(+id))
  150. .map(([_, layer]) => layer)
  151. }
  152. }
  153. )
  154. const makeSelectCurrentOperateItemParams = () => (state: {
  155. display: IDisplayState
  156. }) => (state.display ? state.display.operateItemParams : [])
  157. const makeSelectCurrentDisplayWidgets = () =>
  158. createSelector(
  159. selectDisplay,
  160. (displayState) => displayState.currentDisplayWidgets
  161. )
  162. const makeSelectClipboardLayers = () =>
  163. createSelector(selectDisplay, (displayState) => displayState.clipboardLayers)
  164. const makeSelectCurrentDisplayShareToken = () =>
  165. createSelector(
  166. selectDisplay,
  167. (displayState) => displayState.currentDisplayShareToken
  168. )
  169. const makeSelectCurrentDisplayPasswordShareToken = () =>
  170. createSelector(
  171. selectDisplay,
  172. (dashboardState) => dashboardState.currentDisplayPasswordShareToken
  173. )
  174. const makeSelectCurrentDisplayPasswordSharePassword = () =>
  175. createSelector(
  176. selectDisplay,
  177. (dashboardState) => dashboardState.currentDisplayPasswordPassword
  178. )
  179. const makeSelectCurrentDisplayAuthorizedShareToken = () =>
  180. createSelector(
  181. selectDisplay,
  182. (displayState) => displayState.currentDisplayAuthorizedShareToken
  183. )
  184. const makeSelectSharePanel = () =>
  185. createSelector(selectDisplay, (displayState) => displayState.sharePanel)
  186. const makeSelectDisplayLoading = () =>
  187. createSelector(selectDisplay, (displayState) => displayState.loading)
  188. const makeSelectEditorBaselines = () =>
  189. createSelector(selectDisplay, (displayState) => displayState.editorBaselines)
  190. export {
  191. selectDisplay,
  192. //
  193. makeSelectLayersBySlide,
  194. makeSelectLayerIdsBySlide,
  195. //
  196. makeSelectCurrentLayerList,
  197. makeSelectCurrentLayerIds,
  198. makeSelectSlideLayerContextValue,
  199. makeSelectCurrentLayersMaxIndex,
  200. makeSelectCurrentLayersOperationInfo,
  201. makeSelectCurrentSelectedLayerList,
  202. makeSelectCurrentEditLayerOperationInfo,
  203. makeSelectCurrentSelectedLayerIds,
  204. //
  205. makeSelectCurrentOperatingLayerList,
  206. makeSelectCurrentOtherLayerList,
  207. makeSelectCurrentOperateItemParams,
  208. //
  209. makeSelectCurrentDisplayWidgets,
  210. makeSelectClipboardLayers,
  211. makeSelectCurrentDisplayShareToken,
  212. makeSelectCurrentDisplayAuthorizedShareToken,
  213. makeSelectSharePanel,
  214. makeSelectDisplayLoading,
  215. makeSelectEditorBaselines,
  216. makeSelectCurrentDisplayPasswordShareToken,
  217. makeSelectCurrentDisplayPasswordSharePassword,
  218. selectCurrentLayers
  219. }