@akemona-org/strapi-plugin-upload 3.7.0

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 (246) hide show
  1. package/LICENSE +22 -0
  2. package/README.md +19 -0
  3. package/admin/src/assets/images/logo.svg +1 -0
  4. package/admin/src/components/BrowseAssets/Wrapper.js +8 -0
  5. package/admin/src/components/BrowseAssets/index.js +182 -0
  6. package/admin/src/components/Card/index.js +146 -0
  7. package/admin/src/components/CardBorder/index.js +28 -0
  8. package/admin/src/components/CardControl/Wrapper.js +89 -0
  9. package/admin/src/components/CardControl/index.js +61 -0
  10. package/admin/src/components/CardControlsWrapper/index.js +22 -0
  11. package/admin/src/components/CardEmpty/Bar.js +19 -0
  12. package/admin/src/components/CardEmpty/Wrapper.js +7 -0
  13. package/admin/src/components/CardEmpty/index.js +16 -0
  14. package/admin/src/components/CardErrorMessage/index.js +9 -0
  15. package/admin/src/components/CardImgWrapper/index.js +52 -0
  16. package/admin/src/components/CardPreview/Image.js +12 -0
  17. package/admin/src/components/CardPreview/Wrapper.js +25 -0
  18. package/admin/src/components/CardPreview/index.js +66 -0
  19. package/admin/src/components/CardTitle/index.js +14 -0
  20. package/admin/src/components/CardWrapper/index.js +23 -0
  21. package/admin/src/components/CheckControl/Button.js +49 -0
  22. package/admin/src/components/CheckControl/CustomDropdownSection.js +9 -0
  23. package/admin/src/components/CheckControl/Spacer.js +7 -0
  24. package/admin/src/components/CheckControl/index.js +74 -0
  25. package/admin/src/components/Container/index.js +7 -0
  26. package/admin/src/components/ContainerFluid/index.js +12 -0
  27. package/admin/src/components/ControlsWrapper/index.js +9 -0
  28. package/admin/src/components/DragLayer/Wrapper.js +13 -0
  29. package/admin/src/components/DragLayer/index.js +68 -0
  30. package/admin/src/components/DropdownButton/index.js +63 -0
  31. package/admin/src/components/DropdownSection/index.js +27 -0
  32. package/admin/src/components/Duration/index.js +25 -0
  33. package/admin/src/components/Duration/utils/formatDuration.js +13 -0
  34. package/admin/src/components/EditForm/CropWrapper.js +21 -0
  35. package/admin/src/components/EditForm/ErrorMessage.js +10 -0
  36. package/admin/src/components/EditForm/FileDetailsBox.js +95 -0
  37. package/admin/src/components/EditForm/FileDetailsBoxWrapper.js +14 -0
  38. package/admin/src/components/EditForm/FileWrapper.js +41 -0
  39. package/admin/src/components/EditForm/FormWrapper.js +7 -0
  40. package/admin/src/components/EditForm/SizeBox.js +13 -0
  41. package/admin/src/components/EditForm/Wrapper.js +8 -0
  42. package/admin/src/components/EditForm/index.js +425 -0
  43. package/admin/src/components/EditForm/utils/form.js +34 -0
  44. package/admin/src/components/EditForm/utils/isImageType.js +3 -0
  45. package/admin/src/components/EditForm/utils/isVideoType.js +3 -0
  46. package/admin/src/components/FileIcon/Wrapper.js +20 -0
  47. package/admin/src/components/FileIcon/index.js +33 -0
  48. package/admin/src/components/FileIcon/utils/extensions.json +4 -0
  49. package/admin/src/components/FileInfos/index.js +32 -0
  50. package/admin/src/components/Filters/index.js +30 -0
  51. package/admin/src/components/FiltersList/index.js +34 -0
  52. package/admin/src/components/FiltersList/utils/formatFilter.js +36 -0
  53. package/admin/src/components/FiltersPicker/FiltersCard/FilterButton.js +8 -0
  54. package/admin/src/components/FiltersPicker/FiltersCard/FilterInput.js +35 -0
  55. package/admin/src/components/FiltersPicker/FiltersCard/InputWrapper.js +10 -0
  56. package/admin/src/components/FiltersPicker/FiltersCard/SizeInput.js +57 -0
  57. package/admin/src/components/FiltersPicker/FiltersCard/Wrapper.js +8 -0
  58. package/admin/src/components/FiltersPicker/FiltersCard/index.js +97 -0
  59. package/admin/src/components/FiltersPicker/FiltersCard/init.js +21 -0
  60. package/admin/src/components/FiltersPicker/FiltersCard/reducer.js +47 -0
  61. package/admin/src/components/FiltersPicker/FiltersCard/utils/filtersForm.js +27 -0
  62. package/admin/src/components/FiltersPicker/index.js +43 -0
  63. package/admin/src/components/FiltersPicker/utils/formatFilter.js +18 -0
  64. package/admin/src/components/InfiniteLoadingIndicator/Button.js +20 -0
  65. package/admin/src/components/InfiniteLoadingIndicator/Container.js +12 -0
  66. package/admin/src/components/InfiniteLoadingIndicator/Wrapper.js +18 -0
  67. package/admin/src/components/InfiniteLoadingIndicator/index.js +39 -0
  68. package/admin/src/components/Input/index.js +7 -0
  69. package/admin/src/components/InputFileModal/Label.js +47 -0
  70. package/admin/src/components/InputFileModal/P.js +15 -0
  71. package/admin/src/components/InputFileModal/index.js +73 -0
  72. package/admin/src/components/InputMedia/CardControlWrapper.js +12 -0
  73. package/admin/src/components/InputMedia/CardPreviewWrapper.js +13 -0
  74. package/admin/src/components/InputMedia/Chevron/Wrapper.js +10 -0
  75. package/admin/src/components/InputMedia/Chevron/index.js +21 -0
  76. package/admin/src/components/InputMedia/EmptyInputMedia.js +60 -0
  77. package/admin/src/components/InputMedia/EmptyText.js +13 -0
  78. package/admin/src/components/InputMedia/ErrorMessage.js +12 -0
  79. package/admin/src/components/InputMedia/IconUpload.js +48 -0
  80. package/admin/src/components/InputMedia/InputFilePreview.js +37 -0
  81. package/admin/src/components/InputMedia/Name.js +10 -0
  82. package/admin/src/components/InputMedia/Wrapper.js +11 -0
  83. package/admin/src/components/InputMedia/index.js +238 -0
  84. package/admin/src/components/InputUploadURL/Wrapper.js +13 -0
  85. package/admin/src/components/InputUploadURL/index.js +46 -0
  86. package/admin/src/components/IntlText/index.js +26 -0
  87. package/admin/src/components/List/ListCell.js +19 -0
  88. package/admin/src/components/List/ListRow.js +8 -0
  89. package/admin/src/components/List/index.js +114 -0
  90. package/admin/src/components/ListEmpty/Wrapper.js +15 -0
  91. package/admin/src/components/ListEmpty/index.js +70 -0
  92. package/admin/src/components/ListEmpty/utils/generateRows.js +12 -0
  93. package/admin/src/components/ListModal/BaselineAlignmentWrapper.js +12 -0
  94. package/admin/src/components/ListModal/index.js +66 -0
  95. package/admin/src/components/ListWrapper/index.js +16 -0
  96. package/admin/src/components/LoadingIndicator/index.js +44 -0
  97. package/admin/src/components/ModalHeader/BackButton.js +33 -0
  98. package/admin/src/components/ModalHeader/Wrapper.js +24 -0
  99. package/admin/src/components/ModalHeader/index.js +47 -0
  100. package/admin/src/components/ModalNavWrapper/BaselineAlignment.js +12 -0
  101. package/admin/src/components/ModalNavWrapper/Hr.js +14 -0
  102. package/admin/src/components/ModalNavWrapper/Wrapper.js +8 -0
  103. package/admin/src/components/ModalNavWrapper/index.js +70 -0
  104. package/admin/src/components/ModalSection/index.js +20 -0
  105. package/admin/src/components/ModalTab/Count/Wrapper.js +16 -0
  106. package/admin/src/components/ModalTab/Count/index.js +30 -0
  107. package/admin/src/components/ModalTab/Wrapper.js +37 -0
  108. package/admin/src/components/ModalTab/index.js +60 -0
  109. package/admin/src/components/PlayIcon/Play.js +65 -0
  110. package/admin/src/components/PlayIcon/Wrapper.js +24 -0
  111. package/admin/src/components/PlayIcon/index.js +23 -0
  112. package/admin/src/components/SelectAll/Wrapper.js +19 -0
  113. package/admin/src/components/SelectAll/index.js +26 -0
  114. package/admin/src/components/SelectedAssets/DraggableCard.js +149 -0
  115. package/admin/src/components/SelectedAssets/ListTitleWrapper.js +7 -0
  116. package/admin/src/components/SelectedAssets/ListWrapper.js +7 -0
  117. package/admin/src/components/SelectedAssets/SortableList.js +102 -0
  118. package/admin/src/components/SelectedAssets/Wrapper.js +7 -0
  119. package/admin/src/components/SelectedAssets/index.js +56 -0
  120. package/admin/src/components/SortList/Wrapper.js +19 -0
  121. package/admin/src/components/SortList/index.js +37 -0
  122. package/admin/src/components/SortListItem/Wrapper.js +28 -0
  123. package/admin/src/components/SortListItem/index.js +35 -0
  124. package/admin/src/components/SortPicker/index.js +54 -0
  125. package/admin/src/components/Tag/Wrapper.js +16 -0
  126. package/admin/src/components/Tag/index.js +25 -0
  127. package/admin/src/components/UploadForm/index.js +61 -0
  128. package/admin/src/components/UploadList/ButtonWrapper.js +7 -0
  129. package/admin/src/components/UploadList/Container.js +10 -0
  130. package/admin/src/components/UploadList/CustomModalSection.js +9 -0
  131. package/admin/src/components/UploadList/ListTitle.js +10 -0
  132. package/admin/src/components/UploadList/ListTitleWrapper.js +7 -0
  133. package/admin/src/components/UploadList/RowItem.js +98 -0
  134. package/admin/src/components/UploadList/index.js +90 -0
  135. package/admin/src/components/VideoPlayer/Wrapper.js +24 -0
  136. package/admin/src/components/VideoPlayer/index.js +57 -0
  137. package/admin/src/components/VideoPreview/CanvasWrapper.js +22 -0
  138. package/admin/src/components/VideoPreview/Thumbnail.js +12 -0
  139. package/admin/src/components/VideoPreview/Wrapper.js +15 -0
  140. package/admin/src/components/VideoPreview/index.js +165 -0
  141. package/admin/src/components/VideoPreview/reducer.js +33 -0
  142. package/admin/src/containers/App/index.js +31 -0
  143. package/admin/src/containers/HomePage/HomePageContent/HomePageList.js +98 -0
  144. package/admin/src/containers/HomePage/HomePageContent/HomePageSettings.js +103 -0
  145. package/admin/src/containers/HomePage/HomePageContent/index.js +90 -0
  146. package/admin/src/containers/HomePage/components.js +18 -0
  147. package/admin/src/containers/HomePage/index.js +373 -0
  148. package/admin/src/containers/HomePage/init.js +5 -0
  149. package/admin/src/containers/HomePage/reducer.js +88 -0
  150. package/admin/src/containers/HomePage/utils/generateParamsFromQuery.js +14 -0
  151. package/admin/src/containers/HomePage/utils/generateStringFromParams.js +27 -0
  152. package/admin/src/containers/HomePage/utils/getHeaderLabel.js +13 -0
  153. package/admin/src/containers/HomePage/utils/index.js +2 -0
  154. package/admin/src/containers/Initializer/index.js +44 -0
  155. package/admin/src/containers/InputModalStepper/HeaderSearch.js +12 -0
  156. package/admin/src/containers/InputModalStepper/InputModalStepper.js +480 -0
  157. package/admin/src/containers/InputModalStepper/Search.js +48 -0
  158. package/admin/src/containers/InputModalStepper/index.js +86 -0
  159. package/admin/src/containers/InputModalStepper/stepper.js +52 -0
  160. package/admin/src/containers/InputModalStepperProvider/index.js +564 -0
  161. package/admin/src/containers/InputModalStepperProvider/init.js +5 -0
  162. package/admin/src/containers/InputModalStepperProvider/reducer.js +301 -0
  163. package/admin/src/containers/ModalStepper/index.js +629 -0
  164. package/admin/src/containers/ModalStepper/init.js +5 -0
  165. package/admin/src/containers/ModalStepper/reducer.js +132 -0
  166. package/admin/src/containers/ModalStepper/stepper.js +46 -0
  167. package/admin/src/containers/SettingsPage/Divider.js +11 -0
  168. package/admin/src/containers/SettingsPage/SectionTitleWrapper.js +7 -0
  169. package/admin/src/containers/SettingsPage/Wrapper.js +17 -0
  170. package/admin/src/containers/SettingsPage/index.js +198 -0
  171. package/admin/src/containers/SettingsPage/init.js +5 -0
  172. package/admin/src/containers/SettingsPage/reducer.js +38 -0
  173. package/admin/src/contexts/AppContext/index.js +5 -0
  174. package/admin/src/contexts/InputModal/InputModalDataManager.js +5 -0
  175. package/admin/src/contexts/index.js +2 -0
  176. package/admin/src/hooks/index.js +2 -0
  177. package/admin/src/hooks/useAppContext/index.js +6 -0
  178. package/admin/src/hooks/useModalContext.js +6 -0
  179. package/admin/src/icons/BrokenFile/index.js +91 -0
  180. package/admin/src/icons/Cloud/index.js +35 -0
  181. package/admin/src/icons/DoubleFile/index.js +35 -0
  182. package/admin/src/icons/Download/index.js +36 -0
  183. package/admin/src/icons/File/index.js +35 -0
  184. package/admin/src/index.js +85 -0
  185. package/admin/src/lifecycles.js +13 -0
  186. package/admin/src/permissions.js +40 -0
  187. package/admin/src/pluginId.js +5 -0
  188. package/admin/src/translations/de.json +81 -0
  189. package/admin/src/translations/dk.json +81 -0
  190. package/admin/src/translations/en.json +86 -0
  191. package/admin/src/translations/es.json +81 -0
  192. package/admin/src/translations/fr.json +85 -0
  193. package/admin/src/translations/he.json +81 -0
  194. package/admin/src/translations/index.js +39 -0
  195. package/admin/src/translations/it.json +82 -0
  196. package/admin/src/translations/ja.json +81 -0
  197. package/admin/src/translations/ms.json +73 -0
  198. package/admin/src/translations/pl.json +81 -0
  199. package/admin/src/translations/pt-BR.json +81 -0
  200. package/admin/src/translations/ru.json +81 -0
  201. package/admin/src/translations/sk.json +81 -0
  202. package/admin/src/translations/th.json +81 -0
  203. package/admin/src/translations/uk.json +78 -0
  204. package/admin/src/translations/zh-Hans.json +86 -0
  205. package/admin/src/translations/zh.json +81 -0
  206. package/admin/src/utils/ItemTypes.js +3 -0
  207. package/admin/src/utils/canDownloadFile.js +3 -0
  208. package/admin/src/utils/compactParams.js +13 -0
  209. package/admin/src/utils/createFileToDownloadName.js +9 -0
  210. package/admin/src/utils/createMatrix.js +32 -0
  211. package/admin/src/utils/createNewFilesToDownloadArray.js +57 -0
  212. package/admin/src/utils/createNewFilesToUploadArray.js +25 -0
  213. package/admin/src/utils/formatBytes.js +13 -0
  214. package/admin/src/utils/formatFileForEditing.js +20 -0
  215. package/admin/src/utils/formatFilters.js +23 -0
  216. package/admin/src/utils/generatePageFromStart.js +5 -0
  217. package/admin/src/utils/generateStartFromPage.js +5 -0
  218. package/admin/src/utils/getFileModelTimestamps.js +15 -0
  219. package/admin/src/utils/getFilesToDownload.js +5 -0
  220. package/admin/src/utils/getRequestUrl.js +5 -0
  221. package/admin/src/utils/getTrad.js +5 -0
  222. package/admin/src/utils/getType.js +15 -0
  223. package/admin/src/utils/getYupError.js +17 -0
  224. package/admin/src/utils/index.js +20 -0
  225. package/admin/src/utils/unformatBytes.js +16 -0
  226. package/admin/src/utils/urlYupSchema.js +49 -0
  227. package/config/config.json +8 -0
  228. package/config/functions/bootstrap.js +143 -0
  229. package/config/routes.json +98 -0
  230. package/config/schema.graphql.js +96 -0
  231. package/controllers/Upload.js +103 -0
  232. package/controllers/upload/admin.js +213 -0
  233. package/controllers/upload/api.js +125 -0
  234. package/controllers/validation/settings.js +22 -0
  235. package/controllers/validation/upload.js +27 -0
  236. package/documentation/1.0.0/overrides/upload-File.json +263 -0
  237. package/errors.js +48 -0
  238. package/index.js +7 -0
  239. package/middlewares/upload/defaults.json +5 -0
  240. package/middlewares/upload/index.js +35 -0
  241. package/models/File.js +7 -0
  242. package/models/File.settings.json +86 -0
  243. package/package.json +71 -0
  244. package/services/Upload.js +397 -0
  245. package/services/image-manipulation.js +167 -0
  246. package/utils/file.js +23 -0
@@ -0,0 +1,564 @@
1
+ import React, { useReducer, useEffect, useState } from 'react';
2
+ import PropTypes from 'prop-types';
3
+ import { request, generateSearchFromFilters, useGlobalContext } from 'strapi-helper-plugin';
4
+ import { clone, get, isEmpty, set } from 'lodash';
5
+ import { useIntl } from 'react-intl';
6
+ import axios from 'axios';
7
+ import pluginId from '../../pluginId';
8
+ import {
9
+ getFilesToDownload,
10
+ getRequestUrl,
11
+ getYupError,
12
+ compactParams,
13
+ createNewFilesToUploadArray,
14
+ urlSchema,
15
+ getFileModelTimestamps,
16
+ formatFilters,
17
+ } from '../../utils';
18
+ import InputModalStepperContext from '../../contexts/InputModal/InputModalDataManager';
19
+
20
+ import init from './init';
21
+ import reducer, { initialState } from './reducer';
22
+
23
+ /* eslint-disable indent */
24
+
25
+ const InputModalStepperProvider = ({
26
+ allowedActions,
27
+ allowedTypes,
28
+ children,
29
+ initialFilesToUpload,
30
+ initialFileToEdit,
31
+ isOpen,
32
+ multiple,
33
+ noNavigation,
34
+ onClosed,
35
+ onInputMediaChange,
36
+ selectedFiles,
37
+ step,
38
+ }) => {
39
+ const [formErrors, setFormErrors] = useState(null);
40
+
41
+ const { formatMessage } = useIntl();
42
+ const { emitEvent, plugins } = useGlobalContext();
43
+ const [, updated_at] = getFileModelTimestamps(plugins);
44
+ const [reducerState, dispatch] = useReducer(reducer, initialState, state =>
45
+ init({
46
+ ...state,
47
+ allowedTypes,
48
+ currentStep: step,
49
+ initialFileToEdit,
50
+ fileToEdit: initialFileToEdit,
51
+ initialSelectedFiles: Array.isArray(selectedFiles) ? selectedFiles : [selectedFiles],
52
+ selectedFiles: Array.isArray(selectedFiles) ? selectedFiles : [selectedFiles],
53
+ filesToUpload: initialFilesToUpload
54
+ ? createNewFilesToUploadArray(initialFilesToUpload).map((file, index) => ({
55
+ ...file,
56
+ originalIndex: index,
57
+ }))
58
+ : [],
59
+ params: {
60
+ ...state.params,
61
+ _sort: `${updated_at}:DESC`,
62
+ },
63
+ })
64
+ );
65
+ const { params, filesToDownload, filesToUpload, fileToEdit } = reducerState;
66
+
67
+ useEffect(() => {
68
+ if (isOpen) {
69
+ fetchMediaLib();
70
+ }
71
+ // eslint-disable-next-line react-hooks/exhaustive-deps
72
+ }, [isOpen, params]);
73
+
74
+ const downloadFiles = async () => {
75
+ const files = getFilesToDownload(filesToUpload);
76
+
77
+ // Emit event when the users download files from url
78
+ if (files.length > 0) {
79
+ emitEvent('didSelectFile', { source: 'url', location: 'content-manager' });
80
+ }
81
+
82
+ try {
83
+ await Promise.all(
84
+ files.map(file => {
85
+ const { source } = file;
86
+
87
+ return axios
88
+ .get(file.fileURL, {
89
+ responseType: 'blob',
90
+ cancelToken: source.token,
91
+ timeout: 60000,
92
+ })
93
+ .then(({ data }) => {
94
+ const createdFile = new File([data], file.fileURL, {
95
+ type: data.type,
96
+ });
97
+
98
+ dispatch({
99
+ type: 'FILE_DOWNLOADED',
100
+ blob: createdFile,
101
+ originalIndex: file.originalIndex,
102
+ fileTempId: file.tempId,
103
+ });
104
+ })
105
+ .catch(err => {
106
+ console.error('fetch file error', err);
107
+
108
+ dispatch({
109
+ type: 'SET_FILE_TO_DOWNLOAD_ERROR',
110
+ originalIndex: file.originalIndex,
111
+ fileTempId: file.tempId,
112
+ });
113
+ });
114
+ })
115
+ );
116
+ } catch (err) {
117
+ // Silent
118
+ }
119
+ };
120
+
121
+ const handleRemoveFileToUpload = fileIndex => {
122
+ dispatch({
123
+ type: 'REMOVE_FILE_TO_UPLOAD',
124
+ fileIndex,
125
+ });
126
+ };
127
+
128
+ const handleModalTabChange = to => {
129
+ dispatch({
130
+ type: 'ON_CHANGE_MODAL_TAB',
131
+ to,
132
+ });
133
+ };
134
+
135
+ const handleClickNextButton = async () => {
136
+ try {
137
+ await urlSchema.validate(
138
+ { filesToDownload: filesToDownload.filter(url => !isEmpty(url)) },
139
+ { abortEarly: false }
140
+ );
141
+
142
+ setFormErrors(null);
143
+ // Navigate to next step
144
+ dispatch({
145
+ type: 'ADD_URLS_TO_FILES_TO_UPLOAD',
146
+ nextStep: 'upload',
147
+ });
148
+ } catch (err) {
149
+ const formattedErrors = getYupError(err);
150
+
151
+ setFormErrors(formattedErrors.filesToDownload);
152
+ }
153
+ };
154
+
155
+ const handleFileToEditChange = ({ target: { name, value } }) => {
156
+ let val = value;
157
+ let type = 'ON_CHANGE';
158
+
159
+ if (name === 'url') {
160
+ setFormErrors(null);
161
+
162
+ val = value.split('\n');
163
+ type = 'ON_CHANGE_URLS_TO_DOWNLOAD';
164
+ }
165
+
166
+ dispatch({
167
+ type,
168
+ keys: name,
169
+ value: val,
170
+ });
171
+ };
172
+
173
+ const handleMoveAsset = (dragIndex, hoverIndex) => {
174
+ dispatch({
175
+ type: 'MOVE_ASSET',
176
+ dragIndex,
177
+ hoverIndex,
178
+ });
179
+ };
180
+
181
+ const toggleModalWarning = () => {
182
+ dispatch({
183
+ type: 'TOGGLE_MODAL_WARNING',
184
+ });
185
+ };
186
+
187
+ const submitEditNewFile = () => {
188
+ dispatch({
189
+ type: 'ON_SUBMIT_EDIT_NEW_FILE',
190
+ });
191
+ };
192
+
193
+ const submitEditExistingFile = () => {
194
+ dispatch({
195
+ type: 'ON_SUBMIT_EDIT_EXISTING_FILE',
196
+ });
197
+ };
198
+
199
+ const handleEditExistingFile = file => {
200
+ dispatch({
201
+ type: 'EDIT_EXISTING_FILE',
202
+ file,
203
+ });
204
+ };
205
+
206
+ const handleResetFileToEdit = () => {
207
+ dispatch({
208
+ type: 'RESET_FILE_TO_EDIT',
209
+ });
210
+ };
211
+
212
+ const removeFilter = index => {
213
+ dispatch({
214
+ type: 'REMOVE_FILTER',
215
+ filterToRemove: index,
216
+ });
217
+ };
218
+
219
+ const handleClose = () => {
220
+ setFormErrors(null);
221
+
222
+ dispatch({
223
+ type: 'RESET_PROPS',
224
+ defaultSort: `${updated_at}:DESC`,
225
+ });
226
+ onClosed();
227
+ };
228
+
229
+ const handleFileSelection = ({ target: { name } }) => {
230
+ dispatch({
231
+ type: 'ON_FILE_SELECTION',
232
+ id: name,
233
+ });
234
+ };
235
+
236
+ const handleAllFilesSelection = () => {
237
+ dispatch({
238
+ type: 'TOGGLE_SELECT_ALL',
239
+ });
240
+ };
241
+
242
+ const setParam = param => {
243
+ dispatch({
244
+ type: 'SET_PARAM',
245
+ param,
246
+ });
247
+ };
248
+
249
+ const goTo = to => {
250
+ dispatch({
251
+ type: 'GO_TO',
252
+ to,
253
+ });
254
+ };
255
+
256
+ const handleGoToEditNewFile = fileIndex => {
257
+ dispatch({
258
+ type: 'SET_NEW_FILE_TO_EDIT',
259
+ fileIndex,
260
+ });
261
+
262
+ goTo('edit-new');
263
+ };
264
+
265
+ const handleGoToEditFile = fileId => {
266
+ dispatch({
267
+ type: 'SET_FILE_TO_EDIT',
268
+ fileId,
269
+ });
270
+
271
+ goTo('edit');
272
+ };
273
+
274
+ const handleCleanFilesError = () => {
275
+ dispatch({
276
+ type: 'CLEAN_FILES_ERROR',
277
+ });
278
+ };
279
+
280
+ const handleSetCropResult = blob => {
281
+ // Emit event : the user cropped a file that is not uploaded
282
+ emitEvent('didCropFile', { duplicatedFile: null, location: 'content-manager' });
283
+
284
+ dispatch({
285
+ type: 'SET_CROP_RESULT',
286
+ blob,
287
+ });
288
+ };
289
+
290
+ const handleFormDisabled = isFormDisabled => {
291
+ dispatch({
292
+ type: 'SET_FORM_DISABLED',
293
+ isFormDisabled,
294
+ });
295
+ };
296
+
297
+ const handleAbortUpload = () => {
298
+ const { abortController } = fileToEdit;
299
+
300
+ abortController.abort();
301
+
302
+ dispatch({
303
+ type: 'ON_ABORT_UPLOAD',
304
+ });
305
+ };
306
+
307
+ const handleCancelFileToUpload = fileIndex => {
308
+ const fileToCancel = get(filesToUpload, fileIndex, {});
309
+
310
+ const { source } = fileToCancel;
311
+
312
+ // Cancel upload
313
+ if (source) {
314
+ // Cancel dowload file upload with axios
315
+ source.cancel('Operation canceled by the user.');
316
+ } else {
317
+ // Cancel uplodad file with fetch
318
+ fileToCancel.abortController.abort();
319
+ }
320
+
321
+ handleRemoveFileToUpload(fileIndex);
322
+ };
323
+
324
+ const getFilters = (filtersToOmit = []) => {
325
+ const compactedParams = compactParams(params);
326
+ const searchParams = generateSearchFromFilters(compactedParams, filtersToOmit);
327
+
328
+ return formatFilters(searchParams);
329
+ };
330
+
331
+ const fetchMediaLibFilesCount = async () => {
332
+ const requestURL = getRequestUrl('files/count');
333
+ const paramsToSend = getFilters(['_limit', '_sort', '_start']);
334
+
335
+ try {
336
+ return await request(`${requestURL}?${paramsToSend}`, {
337
+ method: 'GET',
338
+ });
339
+ } catch (err) {
340
+ console.error(err);
341
+ strapi.notification.toggle({
342
+ type: 'warning',
343
+ message: { id: 'notification.error' },
344
+ });
345
+
346
+ return 0;
347
+ }
348
+ };
349
+
350
+ const fetchMediaLib = async () => {
351
+ if (allowedActions.canRead) {
352
+ const [files, count] = await Promise.all([fetchMediaLibFiles(), fetchMediaLibFilesCount()]);
353
+ dispatch({
354
+ type: 'GET_DATA_SUCCEEDED',
355
+ files,
356
+ countData: count,
357
+ });
358
+ }
359
+ };
360
+
361
+ const fetchMediaLibFiles = async () => {
362
+ const requestURL = getRequestUrl('files');
363
+ const paramsToSend = getFilters();
364
+
365
+ try {
366
+ return await request(`${requestURL}?${paramsToSend}`, {
367
+ method: 'GET',
368
+ });
369
+ } catch (err) {
370
+ console.error(err);
371
+ strapi.notification.toggle({
372
+ type: 'warning',
373
+ message: { id: 'notification.error' },
374
+ });
375
+
376
+ return [];
377
+ }
378
+ };
379
+
380
+ const addFilesToUpload = ({ target: { value } }) => {
381
+ emitEvent('didSelectFile', { source: 'computer', location: 'content-manager' });
382
+
383
+ dispatch({
384
+ type: 'ADD_FILES_TO_UPLOAD',
385
+ filesToUpload: value,
386
+ });
387
+ };
388
+
389
+ const handleClearFilesToUploadAndDownload = () => {
390
+ dispatch({
391
+ type: 'CLEAR_FILES_TO_UPLOAD_AND_DOWNLOAD',
392
+ });
393
+ };
394
+
395
+ const handleSetFileToEditError = errorMessage => {
396
+ dispatch({
397
+ type: 'SET_FILE_TO_EDIT_ERROR',
398
+ errorMessage,
399
+ });
400
+ };
401
+
402
+ const handleUploadFiles = async () => {
403
+ dispatch({
404
+ type: 'SET_FILES_UPLOADING_STATE',
405
+ });
406
+
407
+ const requests = filesToUpload.map(
408
+ async ({ file, fileInfo, originalIndex, originalName, abortController }) => {
409
+ const formData = new FormData();
410
+ const headers = {};
411
+ const infos = clone(fileInfo);
412
+
413
+ if (originalName === infos.name) {
414
+ set(infos, 'name', null);
415
+ }
416
+
417
+ formData.append('files', file);
418
+ formData.append('fileInfo', JSON.stringify(infos));
419
+
420
+ try {
421
+ const uploadedFile = await request(
422
+ `/${pluginId}`,
423
+ {
424
+ method: 'POST',
425
+ headers,
426
+ body: formData,
427
+ signal: abortController.signal,
428
+ },
429
+ false,
430
+ false
431
+ );
432
+
433
+ const filesToSelect = uploadedFile.filter(file => {
434
+ const fileType = file.mime.split('/')[0];
435
+
436
+ if (allowedTypes.includes('file') && !['video', 'image'].includes(fileType)) {
437
+ return true;
438
+ }
439
+
440
+ return allowedTypes.length === 0 || allowedTypes.includes(fileType);
441
+ });
442
+
443
+ dispatch({
444
+ type: 'REMOVE_FILE_TO_UPLOAD',
445
+ fileIndex: originalIndex,
446
+ addToSelectedFiles: filesToSelect,
447
+ multiple,
448
+ });
449
+ } catch (err) {
450
+ const status = get(err, 'response.status', get(err, 'status', null));
451
+ const statusText = get(err, 'response.statusText', get(err, 'statusText', null));
452
+ let errorMessage = get(
453
+ err,
454
+ ['response', 'payload', 'message', '0', 'messages', '0', 'message'],
455
+ get(err, ['response', 'payload', 'message'], statusText)
456
+ );
457
+
458
+ // TODO fix errors globally when the back-end sends readable one
459
+ if (status === 413) {
460
+ errorMessage = formatMessage({ id: 'app.utils.errors.file-too-big.message' });
461
+ }
462
+
463
+ if (status) {
464
+ dispatch({
465
+ type: 'SET_FILE_ERROR',
466
+ fileIndex: originalIndex,
467
+ errorMessage,
468
+ });
469
+ }
470
+ }
471
+ }
472
+ );
473
+
474
+ await Promise.all(requests);
475
+ };
476
+
477
+ return (
478
+ <InputModalStepperContext.Provider
479
+ value={{
480
+ ...reducerState,
481
+ allowedActions,
482
+ addFilesToUpload,
483
+ downloadFiles,
484
+ fetchMediaLib,
485
+ formErrors,
486
+ goTo,
487
+ handleAbortUpload,
488
+ handleAllFilesSelection,
489
+ handleCancelFileToUpload,
490
+ handleClickNextButton,
491
+ handleCleanFilesError,
492
+ handleClearFilesToUploadAndDownload,
493
+ handleClose,
494
+ handleEditExistingFile,
495
+ handleFileSelection,
496
+ handleFileToEditChange,
497
+ handleFormDisabled,
498
+ handleGoToEditFile,
499
+ handleGoToEditNewFile,
500
+ handleModalTabChange,
501
+ handleRemoveFileToUpload,
502
+ handleResetFileToEdit,
503
+ handleSetCropResult,
504
+ handleUploadFiles,
505
+ handleSetFileToEditError,
506
+ moveAsset: handleMoveAsset,
507
+ multiple,
508
+ noNavigation,
509
+ onInputMediaChange,
510
+ removeFilter,
511
+ setParam,
512
+ submitEditNewFile,
513
+ submitEditExistingFile,
514
+ toggleModalWarning,
515
+ }}
516
+ >
517
+ {children}
518
+ </InputModalStepperContext.Provider>
519
+ );
520
+ };
521
+
522
+ InputModalStepperProvider.propTypes = {
523
+ allowedActions: PropTypes.shape({
524
+ canCopyLink: PropTypes.bool,
525
+ canCreate: PropTypes.bool,
526
+ canDownload: PropTypes.bool,
527
+ canMain: PropTypes.bool,
528
+ canRead: PropTypes.bool,
529
+ canSettings: PropTypes.bool,
530
+ canUpdate: PropTypes.bool,
531
+ }),
532
+ allowedTypes: PropTypes.arrayOf(PropTypes.string),
533
+ children: PropTypes.node.isRequired,
534
+ initialFilesToUpload: PropTypes.object,
535
+ initialFileToEdit: PropTypes.object,
536
+ isOpen: PropTypes.bool,
537
+ multiple: PropTypes.bool.isRequired,
538
+ noNavigation: PropTypes.bool,
539
+ onClosed: PropTypes.func.isRequired,
540
+ onInputMediaChange: PropTypes.func,
541
+ selectedFiles: PropTypes.oneOfType([PropTypes.object, PropTypes.array]),
542
+ step: PropTypes.string.isRequired,
543
+ };
544
+
545
+ InputModalStepperProvider.defaultProps = {
546
+ allowedActions: {
547
+ canCopyLink: true,
548
+ canCreate: true,
549
+ canDownload: true,
550
+ canMain: true,
551
+ canRead: true,
552
+ canSettings: true,
553
+ canUpdate: true,
554
+ },
555
+ initialFileToEdit: null,
556
+ initialFilesToUpload: null,
557
+ isOpen: false,
558
+ noNavigation: false,
559
+ onInputMediaChange: () => {},
560
+ selectedFiles: null,
561
+ allowedTypes: [],
562
+ };
563
+
564
+ export default InputModalStepperProvider;
@@ -0,0 +1,5 @@
1
+ const init = initialState => {
2
+ return initialState;
3
+ };
4
+
5
+ export default init;