@capillarytech/creatives-library 8.0.136-alpha.4 → 8.0.136-beta.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (292) hide show
  1. package/components/BreadCrumbs/index.js +65 -0
  2. package/components/BreadCrumbs/messages.js +13 -0
  3. package/components/CapTagList/index.js +235 -0
  4. package/components/CapTagList/messages.js +45 -0
  5. package/components/Card/_customCard.scss +40 -0
  6. package/components/Card/index.js +78 -0
  7. package/components/Card/tests/__snapshots__/index.test.js.snap +22 -0
  8. package/components/Card/tests/index.test.js +20 -0
  9. package/components/CardGrid/index.js +71 -0
  10. package/components/Ckeditor/index.js +238 -0
  11. package/components/Ckeditor/messages.js +13 -0
  12. package/components/Ckeditor/style.scss +3 -0
  13. package/components/Component/index.js +29 -0
  14. package/components/CustomPopOver/index.js +81 -0
  15. package/components/CustomPopOver/messages.js +17 -0
  16. package/components/DateFilter/index.js +349 -0
  17. package/components/DateFilter/messages.js +57 -0
  18. package/components/DateRange/index.js +114 -0
  19. package/components/DateRange/messages.js +25 -0
  20. package/components/Edmeditor/index.js +65 -0
  21. package/components/Edmeditor/messages.js +13 -0
  22. package/components/EmailPreview/_emailPreview.scss +119 -0
  23. package/components/EmailPreview/assets/images/iPad.svg +10 -0
  24. package/components/EmailPreview/assets/images/mobile.png +0 -0
  25. package/components/EmailPreview/index.js +107 -0
  26. package/components/EmailPreview/messages.js +33 -0
  27. package/components/Footer/index.js +27 -0
  28. package/components/Footer/messages.js +13 -0
  29. package/components/FormBuilder/_formBuilder.scss +83 -0
  30. package/components/FormBuilder/index.js +3279 -0
  31. package/components/FormBuilder/messages.js +61 -0
  32. package/components/Header/index.js +44 -0
  33. package/components/Header/messages.js +29 -0
  34. package/components/ImagePreview/_imagePreview.scss +63 -0
  35. package/components/ImagePreview/index.js +52 -0
  36. package/components/ImagePreview/messages.js +17 -0
  37. package/components/PageHeader/_pageHeader.scss +22 -0
  38. package/components/PageHeader/index.js +37 -0
  39. package/components/PageHeader/messages.js +13 -0
  40. package/components/Pagination/_pagination.scss +5 -0
  41. package/components/Pagination/index.js +49 -0
  42. package/components/PreviewSideBar/_previewsidebar.scss +28 -0
  43. package/components/PreviewSideBar/index.js +152 -0
  44. package/components/PreviewSideBar/messages.js +41 -0
  45. package/components/Sidebar/_sidebar.scss +115 -0
  46. package/components/Sidebar/index.js +214 -0
  47. package/components/Sidebar/messages.js +21 -0
  48. package/components/SlideBox/_slideBox.scss +63 -0
  49. package/components/SlideBox/index.js +47 -0
  50. package/components/SlideBox/tests/index.test.js +103 -0
  51. package/components/SmsEditor/index.js +55 -0
  52. package/components/SmsTest/index.js +117 -0
  53. package/components/SmsTest/messages.js +21 -0
  54. package/components/TemplatePreview/WechatRichmediaTemplatePreview/_wechatRichmediaTemplatePrev.scss +42 -0
  55. package/components/TemplatePreview/WechatRichmediaTemplatePreview/index.js +141 -0
  56. package/components/TemplatePreview/WechatRichmediaTemplatePreview/messages.js +21 -0
  57. package/components/TemplatePreview/_templatePreview.scss +642 -0
  58. package/components/TemplatePreview/assets/images/WECHAT_5x.png +0 -0
  59. package/components/TemplatePreview/assets/images/androidPushMessage.svg +45 -0
  60. package/components/TemplatePreview/assets/images/home-screen-android.svg +21 -0
  61. package/components/TemplatePreview/assets/images/home-screen-ios.svg +16 -0
  62. package/components/TemplatePreview/assets/images/iPhonePushMessage.svg +135 -0
  63. package/components/TemplatePreview/assets/images/mobile.svg +24 -0
  64. package/components/TemplatePreview/assets/images/sms-body.png +0 -0
  65. package/components/TemplatePreview/assets/images/sms-icon.png +0 -0
  66. package/components/TemplatePreview/assets/images/sms_mobile.png +0 -0
  67. package/components/TemplatePreview/assets/images/sms_mobile_android.svg +22 -0
  68. package/components/TemplatePreview/assets/images/sms_mobile_ios.svg +16 -0
  69. package/components/TemplatePreview/assets/images/user-icon.svg +19 -0
  70. package/components/TemplatePreview/assets/images/wechat-mobile.svg +78 -0
  71. package/components/TemplatePreview/assets/images/wechat_mobile_android.svg +20 -0
  72. package/components/TemplatePreview/index.js +617 -0
  73. package/components/TemplatePreview/messages.js +78 -0
  74. package/components/Toastr/index.js +60 -0
  75. package/components/Toastr/messages.js +13 -0
  76. package/components/ToastrMessage/index.js +113 -0
  77. package/components/ToastrMessage/messages.js +17 -0
  78. package/components/TopBar/_topbar.scss +46 -0
  79. package/components/TopBar/assets/images/capillary_logo.png +0 -0
  80. package/components/TopBar/assets/images/old_capillary_logo.png +0 -0
  81. package/components/TopBar/index.js +113 -0
  82. package/components/TopBar/messages.js +29 -0
  83. package/containers/App/actions.js +7 -0
  84. package/containers/App/constants.js +114 -0
  85. package/containers/App/index.js +52 -0
  86. package/containers/App/reducer.js +19 -0
  87. package/containers/App/sagas.js +31 -0
  88. package/containers/App/selectors.js +25 -0
  89. package/containers/App/test/saga.test.js +11 -0
  90. package/containers/Assets/Gallery/_gallery.scss +126 -0
  91. package/containers/Assets/Gallery/actions.js +37 -0
  92. package/containers/Assets/Gallery/constants.js +23 -0
  93. package/containers/Assets/Gallery/index.js +473 -0
  94. package/containers/Assets/Gallery/messages.js +93 -0
  95. package/containers/Assets/Gallery/reducer.js +81 -0
  96. package/containers/Assets/Gallery/sagas.js +80 -0
  97. package/containers/Assets/Gallery/selectors.js +25 -0
  98. package/containers/Assets/Gallery/tests/__snapshots__/reducer.test.js.snap +9 -0
  99. package/containers/Assets/Gallery/tests/actions.test.js +25 -0
  100. package/containers/Assets/Gallery/tests/reducer.test.js +96 -0
  101. package/containers/Assets/Gallery/tests/saga.test.js +157 -0
  102. package/containers/Cap/actions.js +66 -0
  103. package/containers/Cap/constants.js +25 -0
  104. package/containers/Cap/index.js +402 -0
  105. package/containers/Cap/messages.js +75 -0
  106. package/containers/Cap/reducer.js +113 -0
  107. package/containers/Cap/sagas.js +159 -0
  108. package/containers/Cap/selectors.js +75 -0
  109. package/containers/Cap/tests/__snapshots__/index.test.js.snap +2269 -0
  110. package/containers/Cap/tests/index.test.js +22 -0
  111. package/containers/Cap/tests/saga.test.js +284 -0
  112. package/containers/Dashboard/actions.js +15 -0
  113. package/containers/Dashboard/constants.js +7 -0
  114. package/containers/Dashboard/index.js +76 -0
  115. package/containers/Dashboard/messages.js +13 -0
  116. package/containers/Dashboard/reducer.js +21 -0
  117. package/containers/Dashboard/sagas.js +17 -0
  118. package/containers/Dashboard/selectors.js +25 -0
  119. package/containers/Dashboard/test/saga.test.js +9 -0
  120. package/containers/Ebill/_ebill.scss +5 -0
  121. package/containers/Ebill/actions.js +43 -0
  122. package/containers/Ebill/constants.js +20 -0
  123. package/containers/Ebill/index.js +1278 -0
  124. package/containers/Ebill/messages.js +77 -0
  125. package/containers/Ebill/reducer.js +72 -0
  126. package/containers/Ebill/sagas.js +74 -0
  127. package/containers/Ebill/selectors.js +25 -0
  128. package/containers/Ebill/test/saga.test.js +11 -0
  129. package/containers/Email/_email.scss +141 -0
  130. package/containers/Email/actions.js +81 -0
  131. package/containers/Email/constants.js +36 -0
  132. package/containers/Email/index.js +3325 -0
  133. package/containers/Email/messages.js +289 -0
  134. package/containers/Email/reducer.js +142 -0
  135. package/containers/Email/sagas.js +135 -0
  136. package/containers/Email/selectors.js +31 -0
  137. package/containers/Email/test/saga.test.js +671 -0
  138. package/containers/LanguageProvider/actions.js +17 -0
  139. package/containers/LanguageProvider/constants.js +8 -0
  140. package/containers/LanguageProvider/index.js +80 -0
  141. package/containers/LanguageProvider/reducer.js +30 -0
  142. package/containers/LanguageProvider/selectors.js +20 -0
  143. package/containers/LanguageProvider/tests/actions.test.js +19 -0
  144. package/containers/LanguageProvider/tests/index.test.js +78 -0
  145. package/containers/LanguageProvider/tests/reducer.test.js +20 -0
  146. package/containers/LanguageProvider/tests/selectors.test.js +15 -0
  147. package/containers/Line/Create/_lineCreate.scss +54 -0
  148. package/containers/Line/Create/actions.js +90 -0
  149. package/containers/Line/Create/constants.js +39 -0
  150. package/containers/Line/Create/index.js +836 -0
  151. package/containers/Line/Create/messages.js +189 -0
  152. package/containers/Line/Create/reducer.js +99 -0
  153. package/containers/Line/Create/sagas.js +121 -0
  154. package/containers/Line/Create/selectors.js +36 -0
  155. package/containers/Line/Create/tests/saga.test.js +202 -0
  156. package/containers/Line/Edit/_lineEdit.scss +35 -0
  157. package/containers/Line/Edit/actions.js +79 -0
  158. package/containers/Line/Edit/constants.js +27 -0
  159. package/containers/Line/Edit/index.js +1050 -0
  160. package/containers/Line/Edit/messages.js +177 -0
  161. package/containers/Line/Edit/reducer.js +83 -0
  162. package/containers/Line/Edit/sagas.js +80 -0
  163. package/containers/Line/Edit/selectors.js +29 -0
  164. package/containers/Line/Edit/test/saga.test.js +160 -0
  165. package/containers/Login/assets/images/capillary_logo.png +0 -0
  166. package/containers/Login/components/LoginForm/index.js +62 -0
  167. package/containers/Login/components/LoginForm/messages.js +33 -0
  168. package/containers/Login/index.js +130 -0
  169. package/containers/Login/messages.js +25 -0
  170. package/containers/Login/selectors.js +25 -0
  171. package/containers/MobilePush/Create/_mobilePushCreate.scss +39 -0
  172. package/containers/MobilePush/Create/actions.js +46 -0
  173. package/containers/MobilePush/Create/constants.js +23 -0
  174. package/containers/MobilePush/Create/index.js +2303 -0
  175. package/containers/MobilePush/Create/messages.js +269 -0
  176. package/containers/MobilePush/Create/reducer.js +70 -0
  177. package/containers/MobilePush/Create/sagas.js +74 -0
  178. package/containers/MobilePush/Create/selectors.js +28 -0
  179. package/containers/MobilePush/Create/test/saga.test.js +19 -0
  180. package/containers/MobilePush/Edit/_mobilePushCreate.scss +39 -0
  181. package/containers/MobilePush/Edit/actions.js +91 -0
  182. package/containers/MobilePush/Edit/constants.js +35 -0
  183. package/containers/MobilePush/Edit/index.js +2601 -0
  184. package/containers/MobilePush/Edit/messages.js +266 -0
  185. package/containers/MobilePush/Edit/reducer.js +112 -0
  186. package/containers/MobilePush/Edit/sagas.js +126 -0
  187. package/containers/MobilePush/Edit/selectors.js +29 -0
  188. package/containers/MobilePush/Edit/tests/saga.test.js +255 -0
  189. package/containers/NotFoundPage/index.js +25 -0
  190. package/containers/NotFoundPage/messages.js +13 -0
  191. package/containers/NotFoundPage/tests/index.test.js +17 -0
  192. package/containers/Sms/Create/_smsCreate.scss +42 -0
  193. package/containers/Sms/Create/actions.js +27 -0
  194. package/containers/Sms/Create/constants.js +16 -0
  195. package/containers/Sms/Create/index.js +1488 -0
  196. package/containers/Sms/Create/messages.js +109 -0
  197. package/containers/Sms/Create/reducer.js +41 -0
  198. package/containers/Sms/Create/sagas.js +40 -0
  199. package/containers/Sms/Create/selectors.js +28 -0
  200. package/containers/Sms/Create/test/saga.test.js +11 -0
  201. package/containers/Sms/Edit/actions.js +40 -0
  202. package/containers/Sms/Edit/constants.js +17 -0
  203. package/containers/Sms/Edit/index.js +1472 -0
  204. package/containers/Sms/Edit/messages.js +105 -0
  205. package/containers/Sms/Edit/reducer.js +50 -0
  206. package/containers/Sms/Edit/sagas.js +60 -0
  207. package/containers/Sms/Edit/selectors.js +32 -0
  208. package/containers/Sms/Edit/test/saga.test.js +13 -0
  209. package/containers/TagList/_tagList.scss +8 -0
  210. package/containers/TagList/actions.js +15 -0
  211. package/containers/TagList/constants.js +32 -0
  212. package/containers/TagList/index.js +236 -0
  213. package/containers/TagList/messages.js +13 -0
  214. package/containers/TagList/reducer.js +23 -0
  215. package/containers/TagList/sagas.js +11 -0
  216. package/containers/TagList/selectors.js +25 -0
  217. package/containers/Templates/_templates.scss +333 -0
  218. package/containers/Templates/actions.js +103 -0
  219. package/containers/Templates/constants.js +60 -0
  220. package/containers/Templates/index.js +1756 -0
  221. package/containers/Templates/messages.js +337 -0
  222. package/containers/Templates/reducer.js +142 -0
  223. package/containers/Templates/sagas.js +163 -0
  224. package/containers/Templates/selectors.js +28 -0
  225. package/containers/Templates/test/saga.test.js +241 -0
  226. package/containers/WeChat/MapTemplates/_mapTemplates.scss +8 -0
  227. package/containers/WeChat/MapTemplates/actions.js +52 -0
  228. package/containers/WeChat/MapTemplates/constants.js +28 -0
  229. package/containers/WeChat/MapTemplates/index.js +1610 -0
  230. package/containers/WeChat/MapTemplates/messages.js +157 -0
  231. package/containers/WeChat/MapTemplates/reducer.js +74 -0
  232. package/containers/WeChat/MapTemplates/sagas.js +84 -0
  233. package/containers/WeChat/MapTemplates/selectors.js +25 -0
  234. package/containers/WeChat/MapTemplates/test/saga.test.js +155 -0
  235. package/containers/WeChat/RichmediaTemplates/Create/_createRichmedia.scss +57 -0
  236. package/containers/WeChat/RichmediaTemplates/Create/actions.js +36 -0
  237. package/containers/WeChat/RichmediaTemplates/Create/constants.js +15 -0
  238. package/containers/WeChat/RichmediaTemplates/Create/index.js +1071 -0
  239. package/containers/WeChat/RichmediaTemplates/Create/messages.js +165 -0
  240. package/containers/WeChat/RichmediaTemplates/Create/reducer.js +60 -0
  241. package/containers/WeChat/RichmediaTemplates/Create/richmediaschema.js +497 -0
  242. package/containers/WeChat/RichmediaTemplates/Create/sagas.js +51 -0
  243. package/containers/WeChat/RichmediaTemplates/Create/selectors.js +37 -0
  244. package/containers/WeChat/RichmediaTemplates/Create/test/saga.test.js +13 -0
  245. package/containers/WeChat/RichmediaTemplates/Edit/actions.js +20 -0
  246. package/containers/WeChat/RichmediaTemplates/Edit/constants.js +10 -0
  247. package/containers/WeChat/RichmediaTemplates/Edit/index.js +136 -0
  248. package/containers/WeChat/RichmediaTemplates/Edit/messages.js +13 -0
  249. package/containers/WeChat/RichmediaTemplates/Edit/reducer.js +28 -0
  250. package/containers/WeChat/RichmediaTemplates/Edit/sagas.js +36 -0
  251. package/containers/WeChat/RichmediaTemplates/Edit/selectors.js +30 -0
  252. package/containers/WeChat/RichmediaTemplates/Edit/test/saga.test.js +12 -0
  253. package/containers/WeChat/RichmediaTemplates/View/actions.js +15 -0
  254. package/containers/WeChat/RichmediaTemplates/View/constants.js +7 -0
  255. package/containers/WeChat/RichmediaTemplates/View/index.js +47 -0
  256. package/containers/WeChat/RichmediaTemplates/View/messages.js +21 -0
  257. package/containers/WeChat/RichmediaTemplates/View/reducer.js +23 -0
  258. package/containers/WeChat/RichmediaTemplates/View/sagas.js +11 -0
  259. package/containers/WeChat/RichmediaTemplates/View/selectors.js +25 -0
  260. package/index.js +2 -4
  261. package/package.json +1 -1
  262. package/routes.js +202 -136
  263. package/services/getSchema.js +1 -1
  264. package/services/localStorageApi.js +0 -1
  265. package/tests/i18n.test.js +1 -1
  266. package/utils/asyncInjectors.js +78 -0
  267. package/utils/authWrapper.js +1 -1
  268. package/utils/callNativeEvent.js +16 -0
  269. package/utils/checkStore.js +21 -0
  270. package/utils/common.js +2 -2
  271. package/utils/customAuthWrapper.js +62 -0
  272. package/utils/customConnectedAuthWrapper.js +26 -0
  273. package/utils/tagValidations.js +1 -1
  274. package/utils/tests/checkStore.test.js +1 -1
  275. package/utils/tests/customAuth.test.js +1 -1
  276. package/utils/transformerUtils.js +195 -1
  277. package/v2Components/CapTagList/index.js +14 -9
  278. package/v2Components/Carousel/style.scss +1 -1
  279. package/v2Components/EmailMobilePreview/index.js +2 -2
  280. package/v2Components/FormBuilder/index.js +2 -2
  281. package/v2Components/TemplatePreview/index.js +1 -2
  282. package/v2Containers/Cap/tests/saga.test.js +1 -1
  283. package/v2Containers/Email/index.js +1 -1
  284. package/v2Containers/FTP/index.js +1 -1
  285. package/v2Containers/Line/Container/Text/index.js +6 -6
  286. package/v2Containers/Sms/Create/index.js +2 -2
  287. package/v2Containers/Sms/Edit/index.js +1 -1
  288. package/v2Containers/TagList/index.js +1 -1
  289. package/v2Containers/TagList/utils.js +1 -1
  290. package/v2Containers/Templates/index.js +1 -1
  291. package/v2Containers/Templates/sagas.js +1 -1
  292. package/constants/unified.js +0 -189
@@ -0,0 +1,473 @@
1
+ /*
2
+ *
3
+ * Gallery
4
+ *
5
+ */
6
+
7
+ import PropTypes from 'prop-types';
8
+
9
+ import React from 'react';
10
+ import { connect } from 'react-redux';
11
+ import { bindActionCreators, compose } from 'redux';
12
+ import Helmet from 'react-helmet';
13
+ import { FormattedMessage, injectIntl, intlShape } from 'react-intl';
14
+ import { createStructuredSelector } from 'reselect';
15
+ import moment from "moment";
16
+ import _ from "lodash";
17
+ import { CapInput, CapButton } from '@capillarytech/cap-react-ui-library';
18
+ import { Spin, Popover, Select } from 'antd';
19
+ import makeSelectGallery from './selectors';
20
+ import messages from './messages';
21
+ import * as actions from './actions';
22
+ import { UserIsAuthenticated } from '../../../utils/authWrapper';
23
+ import CardGrid from '../../../components/CardGrid';
24
+ import * as globalActions from '../../../containers/Cap/actions';
25
+ import {getMessageObject} from '../../../utils/messageUtils';
26
+ import SlideBox from '../../../components/SlideBox';
27
+ import PageHeader from '../../../components/PageHeader';
28
+ import Pagination from '../../../components/Pagination';
29
+ import * as commonUtil from '../../../utils/common';
30
+ import './_gallery.scss';
31
+ import injectSaga from '../../../utils/injectSaga';
32
+ import injectReducer from '../../../utils/injectReducer';
33
+ import reducer from './reducer';
34
+ import { gallerySaga } from './sagas';
35
+
36
+ const Option = Select.Option;
37
+
38
+ export class Gallery extends React.Component { // eslint-disable-line react/prefer-stateless-function
39
+ constructor(props) {
40
+ super(props);
41
+ this.state = {
42
+ searchText: '',
43
+ selectedAsset: {},
44
+ showImagePreviewModal: false,
45
+ hoveredItem: '',
46
+ showEmbeddedPreview: false,
47
+ page: 1,
48
+ perPageLimit: 25,
49
+ totalCount: 0,
50
+ };
51
+ this.uploadImages = this.uploadImages.bind(this);
52
+ this.openFileDialog = this.openFileDialog.bind(this);
53
+ this.searchAsset = this.searchAsset.bind(this);
54
+ this.openPreviewMode = this.openPreviewMode.bind(this);
55
+ this.renderAssetPreviewModal = this.renderAssetPreviewModal.bind(this);
56
+ this.toggleImagePreview = this.toggleImagePreview.bind(this);
57
+ this.selectAsset = this.selectAsset.bind(this);
58
+ this.handleGallery = this.handleGallery.bind(this);
59
+ this.deleteAsset = this.deleteAsset.bind(this);
60
+ this.handleOnHoverItem = this.handleOnHoverItem.bind(this);
61
+ this.unmountEvent = this.unmountEvent.bind(this);
62
+ this.handleSortingChange = this.handleSortingChange.bind(this);
63
+ this.openEmbeddedPreviewMode = this.openEmbeddedPreviewMode.bind(this);
64
+ this.hideEmbeddedPreviewMode = this.hideEmbeddedPreviewMode.bind(this);
65
+ this.delayTimer = 0;
66
+ }
67
+
68
+ componentDidMount() {
69
+ const params = {
70
+ name: this.state.searchText,
71
+ sortBy: 'Most Recent',
72
+ };
73
+ this.getAllAssets({params});
74
+ this.props.actions.getUserList();
75
+ window.addEventListener("message", this.handleGallery, false);
76
+ }
77
+
78
+ componentWillReceiveProps(nextProps) {
79
+
80
+ if ( !_.isEqual(nextProps.Gallery.uploadAssetSuccess, this.props.Gallery.uploadAssetSuccess) && nextProps.Gallery.uploadAssetSuccess) {
81
+ if (this.props.location.query.type === 'embedded' && nextProps.Gallery.uploadedAssetData) {
82
+
83
+ const response = {
84
+ action: "selectAsset",
85
+ value: JSON.stringify(nextProps.Gallery.uploadedAssetData),
86
+ };
87
+ parent.postMessage(JSON.stringify(response), '*');
88
+ }
89
+ const message = getMessageObject('success', this.props.intl.formatMessage(messages.assetUploadSuccess), true);
90
+ this.props.globalActions.addMessageToQueue(message);
91
+ const params = {
92
+ name: this.state.searchText,
93
+ };
94
+ this.getAllAssets({params});
95
+ }
96
+ if (!this.props.Gallery.fetchingAllAssets && !_.isEmpty(this.props.Gallery.assetList) && this.props.Gallery.assetList[0] && this.props.Gallery.assetList[0].totalCount && this.state.totalCount === 0) {
97
+ this.setState({totalCount: this.props.Gallery.assetList[0].totalCount});
98
+ }
99
+ if ( !_.isEqual(nextProps.Gallery.assetUploading, this.props.Gallery.assetUploading) && !nextProps.Gallery.uploadAssetSuccess && !nextProps.Gallery.assetUploading) {
100
+ const message = getMessageObject('error', this.props.intl.formatMessage(messages.assetUploadFailed), true);
101
+ this.props.globalActions.addMessageToQueue(message);
102
+ }
103
+
104
+ if (!nextProps.Gallery.deletingAsset && !nextProps.Gallery.assetDeleteError && !_.isEqual(nextProps.Gallery.deletingAsset, this.props.Gallery.deletingAsset)) {
105
+ const message = getMessageObject('success', this.props.intl.formatMessage(messages.assetDeleteSuccess), true);
106
+ this.props.globalActions.addMessageToQueue(message);
107
+ const params = {
108
+ name: this.state.searchText,
109
+ sortBy: 'Most Recent',
110
+ };
111
+ this.getAllAssets({params});
112
+ }
113
+ if (!nextProps.Gallery.deletingAsset && nextProps.Gallery.assetDeleteError && !_.isEqual(nextProps.Gallery.deletingAsset, this.props.Gallery.deletingAsset)) {
114
+ const message = getMessageObject('error', this.props.intl.formatMessage(messages.assetDeleteFailed), true);
115
+ this.props.globalActions.addMessageToQueue(message);
116
+ }
117
+ }
118
+
119
+ componentWillUnmount() {
120
+ window.removeEventListener("message", this.handleGallery, false);
121
+ }
122
+
123
+ getAllAssets = ({params, getNextPage, resetPage}, isReRender = false) => {
124
+ let queryParams = params;
125
+ let page = this.state.page;
126
+ if (!this.props.Gallery.fetchingAllAssets && ((resetPage || (page === 1 && this.state.totalCount === 0) || page <= (this.state.totalCount / this.state.perPageLimit)) || isReRender )) {
127
+ if (getNextPage) {
128
+ page += 1;
129
+ }
130
+
131
+ let totalCount = this.state.totalCount;
132
+ if (resetPage) {
133
+ page = 1;
134
+ totalCount = 0;
135
+ }
136
+ if ((!params || _.isEmpty(params))) {
137
+ queryParams = {
138
+ sortBy: this.state.sortBy,
139
+ };
140
+ }
141
+ if (this.state.searchText !== "") {
142
+ queryParams = {...queryParams, name: this.state.searchText};
143
+ }
144
+ this.setState({page, totalCount}, () => {
145
+ queryParams.page = page;
146
+ queryParams.perPage = this.state.perPageLimit;
147
+ this.props.actions.getAllAssets('image', queryParams);
148
+ });
149
+ }
150
+ };
151
+
152
+ deleteAsset(asset) {
153
+ this.props.actions.deleteAssetById(asset._id, asset.type);
154
+ }
155
+
156
+ handleGallery = (e) => {
157
+ const type = e.data;
158
+ switch (type) {
159
+ case 'unmount':
160
+ this.unmountEvent();
161
+ break;
162
+ default:
163
+ break;
164
+ }
165
+ };
166
+
167
+ handleSortingChange(value) {
168
+ const params = {
169
+ name: this.state.searchText,
170
+ sortBy: value,
171
+ };
172
+ this.getAllAssets({params, resetPage: true});
173
+ }
174
+ unmountEvent() {
175
+ window.removeEventListener("message", this.handleGallery, false);
176
+ }
177
+
178
+ handleOnHoverItem(isHovering, id) {
179
+ if (isHovering) {
180
+ this.setState({hoveredItem: id});
181
+ } else {
182
+ this.setState({hoveredItem: ''});
183
+ }
184
+ }
185
+
186
+ toggleImagePreview() {
187
+ this.setState({ showImagePreviewModal: !this.state.showImagePreviewModal });
188
+ }
189
+
190
+ selectAsset() {
191
+ const response = {
192
+ action: "selectAsset",
193
+ value: JSON.stringify(this.state.selectedAsset),
194
+ };
195
+ parent.postMessage(JSON.stringify(response), '*');
196
+ }
197
+
198
+ openPreviewMode(selectedAsset) {
199
+ const asset = selectedAsset;
200
+ if (this.props.location.query.type !== 'embedded') {
201
+ this.toggleImagePreview();
202
+ } else {
203
+ asset.showButtons = asset.showButtons ? !asset.showButtons : true;
204
+ }
205
+ this.setState({selectedAsset: asset});
206
+ }
207
+
208
+ hideEmbeddedPreviewMode() {
209
+ this.setState({selectedAsset: {}, showEmbeddedPreview: false});
210
+ }
211
+
212
+ openEmbeddedPreviewMode(selectAsset) {
213
+ this.setState({selectedAsset: selectAsset, showEmbeddedPreview: true});
214
+ }
215
+
216
+ searchAsset(value) {
217
+ this.setState({searchText: value}, () => {
218
+ this.delay(() => {
219
+ const params = {
220
+ name: this.state.searchText,
221
+ };
222
+ if (this.state.sortBy) {
223
+ params.sortBy = this.state.sortBy;
224
+ }
225
+ this.getAllAssets({params, resetPage: true});
226
+ }, 1000);
227
+ });
228
+ }
229
+
230
+ delay(callback, ms) {
231
+ clearTimeout(this.delayTimer);
232
+ this.delayTimer = setTimeout(callback, ms);
233
+ }
234
+
235
+ uploadImages(e, {files}) {
236
+ e.preventDefault();
237
+ const _URL = window.URL || window.webkitURL;
238
+ for (const file in files) {
239
+ if (files.hasOwnProperty(file)) {
240
+ const img = new Image();
241
+ const that = this;
242
+ img.src = _URL.createObjectURL(files[file]);
243
+ img.onload = function () {
244
+ const fileParams = {
245
+ width: this.width,
246
+ height: this.height,
247
+ };
248
+ that.props.actions.uploadAsset(files[file], 'image', fileParams);
249
+ };
250
+ }
251
+ }
252
+ }
253
+
254
+ prepareData() {
255
+ const data = [];
256
+ const assetList = this.props.Gallery.assetList;
257
+ _.forEach(assetList, (asset) => {
258
+ const tmpData = {};
259
+ tmpData.id = asset._id;
260
+ const updateDateTime = (moment().format('DD-MM-YYYY') === moment(asset.updatedAt).format('DD-MM-YYYY')) ? moment(asset.updatedAt).format('hh:mma') : moment(asset.updatedAt).format('DD-MM-YYYY');
261
+ tmpData.content = (
262
+ <div className="image-container" onClick={() => this.openPreviewMode(asset)}>
263
+ <img style={{width: '100%'}} src={asset.metaInfo.secure_file_path ? asset.metaInfo.secure_file_path : asset.metaInfo.public_url} alt={asset.name} />
264
+ <div className={asset.showButtons ? 'overlay show-overlay' : 'overlay hide'}>
265
+ <div>
266
+ <CapButton type="secondary" className="select-button" onClick={(e) => this.selectAsset(e)}>
267
+ <FormattedMessage {...messages.select} />
268
+ </CapButton>
269
+ </div>
270
+ <div>
271
+ <CapButton type="cancel" className="preview-button" onClick={() => this.openEmbeddedPreviewMode(asset)}>
272
+ <FormattedMessage {...messages.preview} />
273
+ </CapButton>
274
+ </div>
275
+ </div>
276
+ </div>
277
+ );
278
+ tmpData.footer = (
279
+ <div className="card-footer-wrapper">
280
+ <div className="card-title-container">
281
+ <div className="card-title-wrapper">
282
+ <p className="card-title" onClick={() => this.openPreviewMode(asset)}>{asset.name}</p>
283
+ </div>
284
+ <div className="more-icon-wrapper">
285
+ <Popover
286
+ placement="leftTop"
287
+ content={<div style={{ cursor: 'pointer'}}><p onClick={() => this.deleteAsset(asset)}>
288
+ <FormattedMessage {...messages.delete} />
289
+ </p></div>} trigger="click">
290
+ <i className="material-icons creative-icons">more_vert</i>
291
+ </Popover>
292
+ </div>
293
+ </div>
294
+ <p className="card-detail"><FormattedMessage {...messages.uploadedAt} />: {updateDateTime}</p>
295
+ </div>
296
+ );
297
+ data.push(tmpData);
298
+ });
299
+ return data;
300
+ }
301
+
302
+ openFileDialog() {
303
+ document.getElementById("fileName").click();
304
+ }
305
+
306
+ renderAssetPreviewModal() {
307
+ const slideboxContent = (
308
+ <div style={{height: "75vh", width: '55vw'}}>
309
+ <div style={{overflow: 'hidden', textAlign: 'center'}}>
310
+ <div style={{ display: 'table', height: '75vh', width: '55vw', background: 'url(https://s3.amazonaws.com/test_files_cache_bkp/intouch_creative_assets/1720b7f7e78860c1f905.svg)' }}>
311
+ <div style={{ display: 'table-cell', height: "75vh", verticalAlign: 'middle' }}>
312
+ <img style={{maxWidth: '100%', maxHeight: '100%'}} src={this.state.selectedAsset.metaInfo.secure_file_path ? this.state.selectedAsset.metaInfo.secure_file_path : this.state.selectedAsset.metaInfo.public_url} alt={this.state.selectedAsset.name} />
313
+ </div>
314
+ </div>
315
+ <a href={this.state.selectedAsset.metaInfo.public_url} target="_blank" style={{ position: 'fixed', right: '55px', bottom: '18vh' }} ><i className="material-icons" style={{ color: '#2E89DF', cursor: 'pointer' }}>fullscreen</i></a>
316
+ </div>
317
+ <div style={{ fontSize: '14px', color: '#333333', lineHeight: '24px', fontFamily: 'OpenSans', textAlign: 'center', paddingTop: '10px'}}>
318
+ <p style={{marginBottom: '0px'}}><span><FormattedMessage {...messages.dimensions} />: </span> <span>{`${this.state.selectedAsset.metaInfo.width}X${this.state.selectedAsset.metaInfo.height} px`}</span></p>
319
+ <p style={{marginBottom: '0px'}}><span><FormattedMessage {...messages.size} />: </span> <span>{(!isNaN(this.state.selectedAsset.metaInfo.file_size) ? `${(parseFloat(this.state.selectedAsset.metaInfo.file_size) / 1024).toFixed(2)} KB` : this.state.selectedAsset.metaInfo.file_size )}</span></p>
320
+ <p style={{marginBottom: '0px'}}><span><FormattedMessage {...messages.uploadedOn} />: </span> <span>{moment(this.state.selectedAsset.updatedAt).format('DD MMM YYYY hh:mm A')}</span></p>
321
+ <p><span><FormattedMessage {...messages.uploadedBy} />: </span> <span>{commonUtil.getUserNameById(parseInt(this.state.selectedAsset.updatedBy, 10), commonUtil.getMergedUserList(this.props.Gallery.userList))}</span></p>
322
+ {/* <p><span>URL: </span> <span>{this.state.selectedAsset.metaInfo.publicUrl}</span></p> */}
323
+ </div>
324
+ </div>
325
+ );
326
+
327
+ return (
328
+ <SlideBox
329
+ header={this.state.selectedAsset.name}
330
+ content={slideboxContent}
331
+ show={this.state.showImagePreviewModal}
332
+ handleClose={this.toggleImagePreview}
333
+ />
334
+ );
335
+ }
336
+
337
+ render() {
338
+ const filterContent = (
339
+ <div className="action-container" style={{ display: 'inline-flex', width: '100%'}}>
340
+ <div style={{ marginTop: '8px', width: '50%'}}>
341
+ <CapInput
342
+ className="search-text"
343
+ style={{width: '210px'}}
344
+ placeholder={this.props.intl.formatMessage(messages.searchText)}
345
+ prefix={<i className="material-icons" style={{color: '#707070', fontSize: '16px'}}>search</i>}
346
+ value={this.state.searchText}
347
+ onChange={(e) => this.searchAsset(e.target.value)}
348
+ />
349
+ </div>
350
+ <div style={{ textAlign: 'right', marginTop: '16px', width: '50%'}}>
351
+ <span className="select-font">
352
+ <FormattedMessage {...messages.sortby} />
353
+ </span>
354
+ <Select
355
+ style={{marginLeft: '8px', width: 120, borderLeft: 'none', borderRight: 'none', borderTop: 'none'}}
356
+ className="select-font"
357
+ defaultValue="Most Recent"
358
+ onChange={this.handleSortingChange}
359
+ >
360
+ <Option className="select-font" value="Most Recent">
361
+ <FormattedMessage {...messages.mostRecent} />
362
+ </Option>
363
+ <Option className="select-font" value="Alphabetically">
364
+ <FormattedMessage {...messages.alphabetically} />
365
+ </Option>
366
+ </Select>
367
+ </div>
368
+ </div>
369
+ );
370
+ const actionComponents = (
371
+ <form encType="multipart/form-data" id="myForm">
372
+ <input style={{ display: 'none'}} id="fileName" type="file" onClick={(e) => {e.target.value=null}} onChange={(e) => this.uploadImages(e, {files: e.target.files})} accept="image/*" multiple/>
373
+ <CapButton type={this.props.location.query.type !== 'embedded' ? 'primary' : 'secondary'} onClick={(e) => this.openFileDialog(e)} style={{float: 'right'}}>
374
+ <FormattedMessage {...messages.upload} />
375
+ </CapButton>
376
+ </form>
377
+ );
378
+ const pageHeading = (this.props.location.query.type === 'embedded') ? '' : (<FormattedMessage {...messages.gallery} />);
379
+
380
+ return (
381
+ <div>
382
+ {/*<Spin spinning={this.props.Gallery.assetUploading || this.props.Gallery.fetchingAllAssets}>*/}
383
+ <Helmet
384
+ title={this.props.intl.formatMessage(messages.gallery)}
385
+ />
386
+ {/* this.props.location.query.type !== 'embedded' && <Row style={{marginBottom: '16px'}}>
387
+ <Col>
388
+ <Breadcrumb>
389
+ <Breadcrumb.Item>Campaigns</Breadcrumb.Item>
390
+ <Breadcrumb.Item>Creatives</Breadcrumb.Item>
391
+ <Breadcrumb.Item>Images Gallery</Breadcrumb.Item>
392
+ </Breadcrumb>
393
+ </Col>
394
+ </Row> */}
395
+
396
+ {!this.state.showEmbeddedPreview && <PageHeader pageHeading={pageHeading} actionComponents={actionComponents} />}
397
+
398
+ {this.state.showEmbeddedPreview ?
399
+ <div className="embedded-preview-wrapper">
400
+ <div className="embedded-preview-header" onClick={this.hideEmbeddedPreviewMode}>
401
+ <p className="embedded-preview-header-wrapper" style={{display: 'inline-flex'}}>
402
+ <i className="material-icons">arrow_back</i>
403
+ <span className="embedded-preview-header-text">
404
+ <FormattedMessage {...messages.backToGallery} />
405
+ </span>
406
+ </p>
407
+ </div>
408
+ <div style={{height: "75vh", width: '100%'}}>
409
+ <div style={{overflow: 'hidden', textAlign: 'center'}}>
410
+ <div style={{ display: 'table', height: '75vh', width: '85vw', background: 'url(https://s3.amazonaws.com/test_files_cache_bkp/intouch_creative_assets/1720b7f7e78860c1f905.svg)' }}>
411
+ <div style={{ height: "75vh", display: 'table-cell', verticalAlign: 'middle' }}>
412
+ <img style={{maxWidth: '100%', maxHeight: '100%'}} src={this.state.selectedAsset.metaInfo.secure_file_path ? this.state.selectedAsset.metaInfo.secure_file_path : this.state.selectedAsset.metaInfo.public_url} alt={this.state.selectedAsset.name} />
413
+ </div>
414
+ </div>
415
+ <a href={this.state.selectedAsset.metaInfo.public_url} target="_blank" style={{ position: 'fixed', right: '24px', bottom: '17vh' }} ><i className="material-icons" style={{ color: '#2E89DF', cursor: 'pointer' }}>fullscreen</i></a>
416
+ </div>
417
+ <div style={{ fontSize: '14px', color: '#333333', lineHeight: '24px', fontFamily: 'OpenSans', textAlign: 'center', paddingTop: '10px'}}>
418
+ <p><span><FormattedMessage {...messages.dimensions} />: </span> <span>{`${this.state.selectedAsset.metaInfo.width}X${this.state.selectedAsset.metaInfo.height} px`}</span></p>
419
+ <p><span><FormattedMessage {...messages.size} />: </span> <span>{this.state.selectedAsset.metaInfo.file_size}</span></p>
420
+ <p><span><FormattedMessage {...messages.uploadedOn} />: </span> <span>{moment(this.state.selectedAsset.updatedAt).format('DD MMM YYYY hh:mm A')}</span></p>
421
+ {/* <p><span>URL: </span> <span>{this.state.selectedAsset.metaInfo.publicUrl}</span></p> */}
422
+ </div>
423
+ </div>
424
+ </div> :
425
+ <Spin spinning={this.props.Gallery.assetUploading || this.props.Gallery.fetchingAllAssets}>
426
+ <Pagination onPageChange={() => { this.getAllAssets({getNextPage: true}); }} paginationSelector="pagination-container">
427
+ <CardGrid
428
+ listItem={this.prepareData()}
429
+ filterContent={filterContent}
430
+ onHoverItem={this.handleOnHoverItem}
431
+ onItemClick={this.handleOnHoverItem}
432
+ colNumber={this.props.location.query.type === 'embedded' ? 2 : 4}
433
+ enablePagination
434
+ />
435
+ </Pagination>
436
+ </Spin>
437
+ }
438
+ {this.state.showImagePreviewModal && this.renderAssetPreviewModal()}
439
+ {/*</Spin>*/}
440
+ </div>
441
+ );
442
+ }
443
+ }
444
+
445
+ Gallery.propTypes = {
446
+ actions: PropTypes.object.isRequired,
447
+ Gallery: PropTypes.object,
448
+ globalActions: PropTypes.object,
449
+ location: PropTypes.object,
450
+ intl: intlShape.isRequired,
451
+ };
452
+
453
+ const mapStateToProps = createStructuredSelector({
454
+ Gallery: makeSelectGallery(),
455
+ });
456
+
457
+ function mapDispatchToProps(dispatch) {
458
+ return {
459
+ actions: bindActionCreators(actions, dispatch),
460
+ globalActions: bindActionCreators(globalActions, dispatch),
461
+ };
462
+ }
463
+
464
+ const withConnect = connect(mapStateToProps, mapDispatchToProps);
465
+ const withSaga = injectSaga({ key: 'gallery', saga: gallerySaga });
466
+ const withReducer = injectReducer({ key: 'gallery', reducer });
467
+
468
+ export default compose(
469
+ UserIsAuthenticated,
470
+ withSaga,
471
+ withReducer,
472
+ withConnect,
473
+ )(injectIntl(Gallery));
@@ -0,0 +1,93 @@
1
+ /*
2
+ * Gallery Messages
3
+ *
4
+ * This contains all the text for the Gallery component.
5
+ */
6
+ import { defineMessages } from 'react-intl';
7
+
8
+ export default defineMessages({
9
+ uploadedAt: {
10
+ id: 'creatives.containers.Assets.Gallery.uploadedAt',
11
+ defaultMessage: 'Uploaded at ',
12
+ },
13
+ uploadedOn: {
14
+ id: 'creatives.containers.Assets.Gallery.uploadedOn',
15
+ defaultMessage: 'Uploaded on ',
16
+ },
17
+ uploadedBy: {
18
+ id: 'creatives.containers.Assets.Gallery.uploadedBy',
19
+ defaultMessage: 'Uploaded by ',
20
+ },
21
+ upload: {
22
+ id: 'creatives.containers.Assets.Gallery.upload',
23
+ defaultMessage: 'Upload image',
24
+ },
25
+ imagePreview: {
26
+ id: 'creatives.containers.Assets.Gallery.imagePreview',
27
+ defaultMessage: 'Image preview',
28
+ },
29
+ size: {
30
+ id: 'creatives.containers.Assets.Gallery.size',
31
+ defaultMessage: 'Size',
32
+ },
33
+ dimensions: {
34
+ id: 'creatives.containers.Assets.Gallery.dimensions',
35
+ defaultMessage: 'Dimensions',
36
+ },
37
+ gallery: {
38
+ id: 'creatives.containers.Assets.Gallery.gallery',
39
+ defaultMessage: 'Gallery',
40
+ },
41
+ backToGallery: {
42
+ id: 'creatives.containers.Assets.Gallery.backToGallery',
43
+ defaultMessage: 'Back to image gallery',
44
+ },
45
+ mostRecent: {
46
+ id: 'creatives.containers.Assets.Gallery.mostRecent',
47
+ defaultMessage: 'Most recent',
48
+ },
49
+ alphabetically: {
50
+ id: 'creatives.containers.Assets.Gallery.alphabetically',
51
+ defaultMessage: 'Alphabetically',
52
+ },
53
+ sortby: {
54
+ id: 'creatives.containers.Assets.Gallery.sortby',
55
+ defaultMessage: 'Sort by',
56
+ },
57
+ delete: {
58
+ id: 'creatives.containers.Assets.Gallery.delete',
59
+ defaultMessage: 'Delete',
60
+ },
61
+ search: {
62
+ id: 'creatives.containers.Assets.Gallery.search',
63
+ defaultMessage: 'Search',
64
+ },
65
+ select: {
66
+ id: 'creatives.containers.Assets.Gallery.select',
67
+ defaultMessage: 'Select',
68
+ },
69
+ preview: {
70
+ id: 'creatives.containers.Assets.Gallery.preview',
71
+ defaultMessage: 'Preview',
72
+ },
73
+ assetUploadSuccess: {
74
+ id: 'creatives.containers.Assets.Gallery.assetUploadSuccess',
75
+ defaultMessage: 'Image uploaded successfully',
76
+ },
77
+ assetUploadFailed: {
78
+ id: 'creatives.containers.Assets.Gallery.assetUploadFailed',
79
+ defaultMessage: 'Image uploaded failed',
80
+ },
81
+ assetDeleteSuccess: {
82
+ id: 'creatives.containers.Assets.Gallery.assetDeleteSuccess',
83
+ defaultMessage: 'Image deleted successfully.',
84
+ },
85
+ assetDeleteFailed: {
86
+ id: 'creatives.containers.Assets.Gallery.assetDeleteFailed',
87
+ defaultMessage: 'Image deletion failed.',
88
+ },
89
+ searchText: {
90
+ id: 'creatives.components.CapTagList.searchText',
91
+ defaultMessage: 'Search',
92
+ },
93
+ });
@@ -0,0 +1,81 @@
1
+ /*
2
+ *
3
+ * Gallery reducer
4
+ *
5
+ */
6
+
7
+ import { fromJS } from 'immutable';
8
+ import * as types from './constants';
9
+
10
+ const initialState = fromJS({
11
+ assetList: [],
12
+ assetUploading: false,
13
+ fetchingAllAssets: false,
14
+ });
15
+
16
+ function galleryReducer(state = initialState, action) {
17
+ switch (action.type) {
18
+ case types.GET_ALL_ASSETS_REQUEST:
19
+ return state
20
+ .set('fetchingAllAssets', true)
21
+ .set('fetchAllAssetSuccess', false);
22
+ case types.GET_ALL_ASSETS_SUCCESS:
23
+ if (action.isReset) {
24
+ return state
25
+ .set('assetList', fromJS(action.data.assets))
26
+ .set('fetchingAllAssets', false)
27
+ .set('fetchAllAssetSuccess', true);
28
+ }
29
+ return state
30
+ .set('assetList', fromJS(state.get('assetList').toJS().concat(action.data.assets)))
31
+ .set('fetchingAllAssets', false)
32
+ .set('fetchAllAssetSuccess', true);
33
+ case types.GET_ALL_ASSETS_FAILURE:
34
+ return state
35
+ .set('fetchingAllAssets', false)
36
+ .set('fetchAllAssetSuccess', false);
37
+ case types.UPLOAD_ASSET_REQUEST:
38
+ return state
39
+ .set('uploadAssetSuccess', false)
40
+ .set('assetUploading', true);
41
+ case types.UPLOAD_ASSET_SUCCESS:
42
+ return state
43
+ .set('uploadAssetSuccess', (action.statusCode !== undefined && action.statusCode !== '' && action.statusCode < 300))
44
+ .set('assetUploading', false)
45
+ .set('uploadedAssetData', action.data);
46
+ case types.UPLOAD_ASSET_FAILURE:
47
+ return state
48
+ .set('uploadAssetSuccess', false)
49
+ .set('assetUploading', false);
50
+ case types.DELETE_ASSET_REQUEST:
51
+ return state
52
+ .set('deletingAsset', true)
53
+ .set('assetDeleteError', false).set("itemDeleted", false);
54
+ case types.DELETE_ASSET_SUCCESS:
55
+ return state
56
+ .set('deletingAsset', false).set("itemDeleted", true);
57
+ case types.DELETE_ASSET_FAILURE:
58
+ return state
59
+ .set('deletingAsset', false)
60
+ .set('assetDeleteError', true).set("itemDeleted", false);
61
+ case types.GET_USER_LIST_REQUEST:
62
+ return state
63
+ .set('fetchingUserList', true)
64
+ .set('userList', fromJS({}))
65
+ .set('userListFetchError', false);
66
+ case types.GET_USER_LIST_SUCCESS:
67
+ return state
68
+ .set('fetchingUserList', false)
69
+ .set('userList', fromJS(action.data))
70
+ .set('userListFetchError', false);
71
+ case types.GET_USER_LIST_FAILURE:
72
+ return state
73
+ .set('fetchingUserList', false)
74
+ .set('userList', fromJS({}))
75
+ .set('userListFetchError', true);
76
+ default:
77
+ return state;
78
+ }
79
+ }
80
+
81
+ export default galleryReducer;