@pranaysahith/decap-cms-core 3.9.1

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 (299) hide show
  1. package/README.md +9 -0
  2. package/dist/@pranaysahith/decap-cms-core.js +52 -0
  3. package/dist/@pranaysahith/decap-cms-core.js.LICENSE.txt +141 -0
  4. package/dist/@pranaysahith/decap-cms-core.js.map +1 -0
  5. package/dist/decap-cms-core.js +47 -0
  6. package/dist/decap-cms-core.js.LICENSE.txt +116 -0
  7. package/dist/decap-cms-core.js.map +1 -0
  8. package/dist/esm/actions/auth.js +97 -0
  9. package/dist/esm/actions/collections.js +15 -0
  10. package/dist/esm/actions/config.js +493 -0
  11. package/dist/esm/actions/deploys.js +79 -0
  12. package/dist/esm/actions/editorialWorkflow.js +480 -0
  13. package/dist/esm/actions/entries.js +865 -0
  14. package/dist/esm/actions/media.js +147 -0
  15. package/dist/esm/actions/mediaLibrary.js +552 -0
  16. package/dist/esm/actions/notifications.js +21 -0
  17. package/dist/esm/actions/search.js +149 -0
  18. package/dist/esm/actions/status.js +74 -0
  19. package/dist/esm/actions/waitUntil.js +32 -0
  20. package/dist/esm/backend.js +1082 -0
  21. package/dist/esm/bootstrap.js +101 -0
  22. package/dist/esm/components/App/App.js +289 -0
  23. package/dist/esm/components/App/Header.js +172 -0
  24. package/dist/esm/components/App/NotFoundPage.js +19 -0
  25. package/dist/esm/components/Collection/Collection.js +198 -0
  26. package/dist/esm/components/Collection/CollectionControls.js +46 -0
  27. package/dist/esm/components/Collection/CollectionSearch.js +222 -0
  28. package/dist/esm/components/Collection/CollectionTop.js +68 -0
  29. package/dist/esm/components/Collection/ControlButton.js +17 -0
  30. package/dist/esm/components/Collection/Entries/Entries.js +73 -0
  31. package/dist/esm/components/Collection/Entries/EntriesCollection.js +241 -0
  32. package/dist/esm/components/Collection/Entries/EntriesSearch.js +113 -0
  33. package/dist/esm/components/Collection/Entries/EntryCard.js +177 -0
  34. package/dist/esm/components/Collection/Entries/EntryListing.js +143 -0
  35. package/dist/esm/components/Collection/FilterControl.js +33 -0
  36. package/dist/esm/components/Collection/FolderRenameControl.js +403 -0
  37. package/dist/esm/components/Collection/GroupControl.js +33 -0
  38. package/dist/esm/components/Collection/NestedCollection.js +308 -0
  39. package/dist/esm/components/Collection/Sidebar.js +91 -0
  40. package/dist/esm/components/Collection/SortControl.js +59 -0
  41. package/dist/esm/components/Collection/ViewStyleControl.js +38 -0
  42. package/dist/esm/components/Editor/Editor.js +466 -0
  43. package/dist/esm/components/Editor/EditorControlPane/EditorControl.js +395 -0
  44. package/dist/esm/components/Editor/EditorControlPane/EditorControlPane.js +254 -0
  45. package/dist/esm/components/Editor/EditorControlPane/Widget.js +374 -0
  46. package/dist/esm/components/Editor/EditorInterface.js +386 -0
  47. package/dist/esm/components/Editor/EditorPreviewPane/EditorPreview.js +47 -0
  48. package/dist/esm/components/Editor/EditorPreviewPane/EditorPreviewContent.js +66 -0
  49. package/dist/esm/components/Editor/EditorPreviewPane/EditorPreviewPane.js +288 -0
  50. package/dist/esm/components/Editor/EditorPreviewPane/PreviewHOC.js +27 -0
  51. package/dist/esm/components/Editor/EditorToolbar.js +536 -0
  52. package/dist/esm/components/Editor/EntryPathEditor.js +272 -0
  53. package/dist/esm/components/Editor/withWorkflow.js +56 -0
  54. package/dist/esm/components/EditorWidgets/Unknown/UnknownControl.js +18 -0
  55. package/dist/esm/components/EditorWidgets/Unknown/UnknownPreview.js +20 -0
  56. package/dist/esm/components/EditorWidgets/index.js +4 -0
  57. package/dist/esm/components/MediaLibrary/EmptyMessage.js +22 -0
  58. package/dist/esm/components/MediaLibrary/MediaLibrary.js +446 -0
  59. package/dist/esm/components/MediaLibrary/MediaLibraryButtons.js +93 -0
  60. package/dist/esm/components/MediaLibrary/MediaLibraryCard.js +99 -0
  61. package/dist/esm/components/MediaLibrary/MediaLibraryCardGrid.js +198 -0
  62. package/dist/esm/components/MediaLibrary/MediaLibraryHeader.js +32 -0
  63. package/dist/esm/components/MediaLibrary/MediaLibraryModal.js +156 -0
  64. package/dist/esm/components/MediaLibrary/MediaLibrarySearch.js +51 -0
  65. package/dist/esm/components/MediaLibrary/MediaLibraryTop.js +123 -0
  66. package/dist/esm/components/UI/DragDrop.js +67 -0
  67. package/dist/esm/components/UI/ErrorBoundary.js +173 -0
  68. package/dist/esm/components/UI/FileUploadButton.js +27 -0
  69. package/dist/esm/components/UI/Modal.js +104 -0
  70. package/dist/esm/components/UI/Notifications.js +62 -0
  71. package/dist/esm/components/UI/SettingsDropdown.js +107 -0
  72. package/dist/esm/components/UI/index.js +6 -0
  73. package/dist/esm/components/Workflow/Workflow.js +133 -0
  74. package/dist/esm/components/Workflow/WorkflowCard.js +128 -0
  75. package/dist/esm/components/Workflow/WorkflowList.js +204 -0
  76. package/dist/esm/constants/collectionTypes.js +2 -0
  77. package/dist/esm/constants/collectionViews.js +2 -0
  78. package/dist/esm/constants/commitProps.js +2 -0
  79. package/dist/esm/constants/configSchema.js +644 -0
  80. package/dist/esm/constants/fieldInference.js +57 -0
  81. package/dist/esm/constants/publishModes.js +18 -0
  82. package/dist/esm/constants/validationErrorTypes.js +6 -0
  83. package/dist/esm/formats/formats.js +83 -0
  84. package/dist/esm/formats/frontmatter.js +146 -0
  85. package/dist/esm/formats/helpers.js +12 -0
  86. package/dist/esm/formats/json.js +8 -0
  87. package/dist/esm/formats/toml.js +32 -0
  88. package/dist/esm/formats/yaml.js +51 -0
  89. package/dist/esm/index.js +7 -0
  90. package/dist/esm/integrations/index.js +28 -0
  91. package/dist/esm/integrations/providers/algolia/implementation.js +174 -0
  92. package/dist/esm/integrations/providers/assetStore/implementation.js +165 -0
  93. package/dist/esm/lib/consoleError.js +3 -0
  94. package/dist/esm/lib/formatters.js +191 -0
  95. package/dist/esm/lib/i18n.js +367 -0
  96. package/dist/esm/lib/phrases.js +6 -0
  97. package/dist/esm/lib/polyfill.js +8 -0
  98. package/dist/esm/lib/registry.js +329 -0
  99. package/dist/esm/lib/serializeEntryValues.js +67 -0
  100. package/dist/esm/lib/stega.js +142 -0
  101. package/dist/esm/lib/textHelper.js +9 -0
  102. package/dist/esm/lib/urlHelper.js +111 -0
  103. package/dist/esm/mediaLibrary.js +37 -0
  104. package/dist/esm/reducers/auth.js +27 -0
  105. package/dist/esm/reducers/collections.js +428 -0
  106. package/dist/esm/reducers/combinedReducer.js +8 -0
  107. package/dist/esm/reducers/config.js +29 -0
  108. package/dist/esm/reducers/cursors.js +31 -0
  109. package/dist/esm/reducers/deploys.js +45 -0
  110. package/dist/esm/reducers/editorialWorkflow.js +83 -0
  111. package/dist/esm/reducers/entries.js +568 -0
  112. package/dist/esm/reducers/entryDraft.js +212 -0
  113. package/dist/esm/reducers/globalUI.js +25 -0
  114. package/dist/esm/reducers/index.js +66 -0
  115. package/dist/esm/reducers/integrations.js +53 -0
  116. package/dist/esm/reducers/mediaLibrary.js +252 -0
  117. package/dist/esm/reducers/medias.js +68 -0
  118. package/dist/esm/reducers/notifications.js +23 -0
  119. package/dist/esm/reducers/search.js +92 -0
  120. package/dist/esm/reducers/status.js +30 -0
  121. package/dist/esm/redux/index.js +7 -0
  122. package/dist/esm/redux/middleware/waitUntilAction.js +48 -0
  123. package/dist/esm/routing/history.js +12 -0
  124. package/dist/esm/types/diacritics.d.js +0 -0
  125. package/dist/esm/types/global.d.js +1 -0
  126. package/dist/esm/types/immutable.js +7 -0
  127. package/dist/esm/types/redux.js +14 -0
  128. package/dist/esm/types/tomlify-j0.4.d.js +0 -0
  129. package/dist/esm/valueObjects/AssetProxy.js +44 -0
  130. package/dist/esm/valueObjects/EditorComponent.js +34 -0
  131. package/dist/esm/valueObjects/Entry.js +20 -0
  132. package/index.d.ts +618 -0
  133. package/package.json +106 -0
  134. package/src/__tests__/backend.spec.js +1161 -0
  135. package/src/actions/__tests__/config.spec.js +1009 -0
  136. package/src/actions/__tests__/editorialWorkflow.spec.js +216 -0
  137. package/src/actions/__tests__/entries.spec.js +596 -0
  138. package/src/actions/__tests__/media.spec.ts +171 -0
  139. package/src/actions/__tests__/mediaLibrary.spec.js +327 -0
  140. package/src/actions/__tests__/search.spec.js +209 -0
  141. package/src/actions/auth.ts +127 -0
  142. package/src/actions/collections.ts +18 -0
  143. package/src/actions/config.ts +565 -0
  144. package/src/actions/deploys.ts +104 -0
  145. package/src/actions/editorialWorkflow.ts +567 -0
  146. package/src/actions/entries.ts +1055 -0
  147. package/src/actions/media.ts +139 -0
  148. package/src/actions/mediaLibrary.ts +574 -0
  149. package/src/actions/notifications.ts +36 -0
  150. package/src/actions/search.ts +221 -0
  151. package/src/actions/status.ts +99 -0
  152. package/src/actions/waitUntil.ts +49 -0
  153. package/src/backend.ts +1400 -0
  154. package/src/bootstrap.js +104 -0
  155. package/src/components/App/App.js +286 -0
  156. package/src/components/App/Header.js +266 -0
  157. package/src/components/App/NotFoundPage.js +23 -0
  158. package/src/components/Collection/Collection.js +210 -0
  159. package/src/components/Collection/CollectionControls.js +58 -0
  160. package/src/components/Collection/CollectionSearch.js +243 -0
  161. package/src/components/Collection/CollectionTop.js +81 -0
  162. package/src/components/Collection/ControlButton.js +27 -0
  163. package/src/components/Collection/Entries/Entries.js +82 -0
  164. package/src/components/Collection/Entries/EntriesCollection.js +277 -0
  165. package/src/components/Collection/Entries/EntriesSearch.js +102 -0
  166. package/src/components/Collection/Entries/EntryCard.js +246 -0
  167. package/src/components/Collection/Entries/EntryListing.js +151 -0
  168. package/src/components/Collection/Entries/__tests__/EntriesCollection.spec.js +163 -0
  169. package/src/components/Collection/Entries/__tests__/__snapshots__/EntriesCollection.spec.js.snap +46 -0
  170. package/src/components/Collection/FilterControl.js +39 -0
  171. package/src/components/Collection/GroupControl.js +39 -0
  172. package/src/components/Collection/NestedCollection.js +330 -0
  173. package/src/components/Collection/Sidebar.js +136 -0
  174. package/src/components/Collection/SortControl.js +68 -0
  175. package/src/components/Collection/ViewStyleControl.js +50 -0
  176. package/src/components/Collection/__tests__/Collection.spec.js +75 -0
  177. package/src/components/Collection/__tests__/NestedCollection.spec.js +445 -0
  178. package/src/components/Collection/__tests__/Sidebar.spec.js +87 -0
  179. package/src/components/Collection/__tests__/__snapshots__/Collection.spec.js.snap +144 -0
  180. package/src/components/Collection/__tests__/__snapshots__/NestedCollection.spec.js.snap +550 -0
  181. package/src/components/Collection/__tests__/__snapshots__/Sidebar.spec.js.snap +312 -0
  182. package/src/components/Editor/Editor.js +497 -0
  183. package/src/components/Editor/EditorControlPane/EditorControl.js +452 -0
  184. package/src/components/Editor/EditorControlPane/EditorControlPane.js +269 -0
  185. package/src/components/Editor/EditorControlPane/Widget.js +384 -0
  186. package/src/components/Editor/EditorInterface.js +444 -0
  187. package/src/components/Editor/EditorPreviewPane/EditorPreview.js +40 -0
  188. package/src/components/Editor/EditorPreviewPane/EditorPreviewContent.js +74 -0
  189. package/src/components/Editor/EditorPreviewPane/EditorPreviewPane.js +333 -0
  190. package/src/components/Editor/EditorPreviewPane/PreviewHOC.js +33 -0
  191. package/src/components/Editor/EditorToolbar.js +691 -0
  192. package/src/components/Editor/__tests__/Editor.spec.js +221 -0
  193. package/src/components/Editor/__tests__/EditorToolbar.spec.js +120 -0
  194. package/src/components/Editor/__tests__/__snapshots__/Editor.spec.js.snap +45 -0
  195. package/src/components/Editor/__tests__/__snapshots__/EditorToolbar.spec.js.snap +4233 -0
  196. package/src/components/Editor/withWorkflow.js +61 -0
  197. package/src/components/EditorWidgets/Unknown/UnknownControl.js +17 -0
  198. package/src/components/EditorWidgets/Unknown/UnknownPreview.js +19 -0
  199. package/src/components/EditorWidgets/index.js +5 -0
  200. package/src/components/MediaLibrary/EmptyMessage.js +28 -0
  201. package/src/components/MediaLibrary/MediaLibrary.js +411 -0
  202. package/src/components/MediaLibrary/MediaLibraryButtons.js +136 -0
  203. package/src/components/MediaLibrary/MediaLibraryCard.js +128 -0
  204. package/src/components/MediaLibrary/MediaLibraryCardGrid.js +199 -0
  205. package/src/components/MediaLibrary/MediaLibraryHeader.js +48 -0
  206. package/src/components/MediaLibrary/MediaLibraryModal.js +200 -0
  207. package/src/components/MediaLibrary/MediaLibrarySearch.js +61 -0
  208. package/src/components/MediaLibrary/MediaLibraryTop.js +143 -0
  209. package/src/components/MediaLibrary/__tests__/MediaLibraryButtons.spec.js +45 -0
  210. package/src/components/MediaLibrary/__tests__/MediaLibraryCard.spec.js +49 -0
  211. package/src/components/MediaLibrary/__tests__/__snapshots__/MediaLibraryCard.spec.js.snap +264 -0
  212. package/src/components/UI/DragDrop.js +66 -0
  213. package/src/components/UI/ErrorBoundary.js +214 -0
  214. package/src/components/UI/FileUploadButton.js +24 -0
  215. package/src/components/UI/Modal.js +112 -0
  216. package/src/components/UI/Notifications.tsx +83 -0
  217. package/src/components/UI/SettingsDropdown.js +103 -0
  218. package/src/components/UI/__tests__/ErrorBoundary.spec.js +57 -0
  219. package/src/components/UI/index.js +6 -0
  220. package/src/components/Workflow/Workflow.js +169 -0
  221. package/src/components/Workflow/WorkflowCard.js +177 -0
  222. package/src/components/Workflow/WorkflowList.js +272 -0
  223. package/src/constants/__tests__/configSchema.spec.js +611 -0
  224. package/src/constants/collectionTypes.ts +2 -0
  225. package/src/constants/collectionViews.js +2 -0
  226. package/src/constants/commitProps.ts +2 -0
  227. package/src/constants/configSchema.js +441 -0
  228. package/src/constants/fieldInference.tsx +78 -0
  229. package/src/constants/publishModes.ts +22 -0
  230. package/src/constants/validationErrorTypes.js +6 -0
  231. package/src/formats/__tests__/formats.spec.js +87 -0
  232. package/src/formats/__tests__/frontmatter.spec.js +429 -0
  233. package/src/formats/__tests__/toml.spec.js +9 -0
  234. package/src/formats/__tests__/yaml.spec.js +162 -0
  235. package/src/formats/formats.ts +97 -0
  236. package/src/formats/frontmatter.ts +150 -0
  237. package/src/formats/helpers.ts +14 -0
  238. package/src/formats/json.ts +9 -0
  239. package/src/formats/toml.ts +33 -0
  240. package/src/formats/yaml.ts +58 -0
  241. package/src/index.js +8 -0
  242. package/src/integrations/index.js +35 -0
  243. package/src/integrations/providers/algolia/implementation.js +176 -0
  244. package/src/integrations/providers/assetStore/implementation.js +148 -0
  245. package/src/lib/__tests__/formatters.spec.js +751 -0
  246. package/src/lib/__tests__/i18n.spec.js +792 -0
  247. package/src/lib/__tests__/phrases.spec.js +119 -0
  248. package/src/lib/__tests__/registry.spec.js +261 -0
  249. package/src/lib/__tests__/serializeEntryValues.spec.js +22 -0
  250. package/src/lib/__tests__/urlHelper.spec.js +138 -0
  251. package/src/lib/consoleError.js +7 -0
  252. package/src/lib/formatters.ts +286 -0
  253. package/src/lib/i18n.ts +454 -0
  254. package/src/lib/phrases.js +8 -0
  255. package/src/lib/polyfill.js +9 -0
  256. package/src/lib/registry.js +312 -0
  257. package/src/lib/serializeEntryValues.js +75 -0
  258. package/src/lib/stega.ts +145 -0
  259. package/src/lib/textHelper.js +11 -0
  260. package/src/lib/urlHelper.ts +128 -0
  261. package/src/mediaLibrary.ts +51 -0
  262. package/src/reducers/__tests__/auth.spec.ts +38 -0
  263. package/src/reducers/__tests__/collections.spec.js +610 -0
  264. package/src/reducers/__tests__/config.spec.js +38 -0
  265. package/src/reducers/__tests__/entries.spec.js +694 -0
  266. package/src/reducers/__tests__/entryDraft.spec.js +297 -0
  267. package/src/reducers/__tests__/globalUI.js +43 -0
  268. package/src/reducers/__tests__/integrations.spec.ts +76 -0
  269. package/src/reducers/__tests__/mediaLibrary.spec.js +154 -0
  270. package/src/reducers/__tests__/medias.spec.ts +49 -0
  271. package/src/reducers/auth.ts +46 -0
  272. package/src/reducers/collections.ts +535 -0
  273. package/src/reducers/combinedReducer.ts +11 -0
  274. package/src/reducers/config.ts +38 -0
  275. package/src/reducers/cursors.js +36 -0
  276. package/src/reducers/deploys.ts +52 -0
  277. package/src/reducers/editorialWorkflow.ts +163 -0
  278. package/src/reducers/entries.ts +819 -0
  279. package/src/reducers/entryDraft.js +260 -0
  280. package/src/reducers/globalUI.ts +45 -0
  281. package/src/reducers/index.ts +82 -0
  282. package/src/reducers/integrations.ts +59 -0
  283. package/src/reducers/mediaLibrary.ts +296 -0
  284. package/src/reducers/medias.ts +66 -0
  285. package/src/reducers/notifications.ts +52 -0
  286. package/src/reducers/search.ts +111 -0
  287. package/src/reducers/status.ts +40 -0
  288. package/src/redux/index.ts +18 -0
  289. package/src/redux/middleware/waitUntilAction.ts +64 -0
  290. package/src/routing/__tests__/history.spec.ts +49 -0
  291. package/src/routing/history.ts +17 -0
  292. package/src/types/diacritics.d.ts +1 -0
  293. package/src/types/global.d.ts +8 -0
  294. package/src/types/immutable.ts +49 -0
  295. package/src/types/redux.ts +827 -0
  296. package/src/types/tomlify-j0.4.d.ts +13 -0
  297. package/src/valueObjects/AssetProxy.ts +48 -0
  298. package/src/valueObjects/EditorComponent.js +38 -0
  299. package/src/valueObjects/Entry.ts +63 -0
@@ -0,0 +1,36 @@
1
+ import type { TypeOptions } from 'react-toastify';
2
+
3
+ export interface NotificationMessage {
4
+ details?: unknown;
5
+ key: string;
6
+ }
7
+
8
+ export interface NotificationPayload {
9
+ message: string | NotificationMessage;
10
+ dismissAfter?: number;
11
+ type: TypeOptions | undefined;
12
+ }
13
+
14
+ export const NOTIFICATION_SEND = 'NOTIFICATION_SEND';
15
+ export const NOTIFICATION_DISMISS = 'NOTIFICATION_DISMISS';
16
+ export const NOTIFICATIONS_CLEAR = 'NOTIFICATION_CLEAR';
17
+
18
+ function addNotification(notification: NotificationPayload) {
19
+ return { type: NOTIFICATION_SEND, payload: notification };
20
+ }
21
+
22
+ function dismissNotification(id: string) {
23
+ return { type: NOTIFICATION_DISMISS, id };
24
+ }
25
+
26
+ function clearNotifications() {
27
+ return { type: NOTIFICATIONS_CLEAR };
28
+ }
29
+
30
+ export type NotificationsAction = {
31
+ type: typeof NOTIFICATION_DISMISS | typeof NOTIFICATION_SEND | typeof NOTIFICATIONS_CLEAR;
32
+ payload?: NotificationPayload;
33
+ id?: string;
34
+ };
35
+
36
+ export { addNotification, dismissNotification, clearNotifications };
@@ -0,0 +1,221 @@
1
+ import isEqual from 'lodash/isEqual';
2
+
3
+ import { currentBackend } from '../backend';
4
+ import { getIntegrationProvider } from '../integrations';
5
+ import { selectIntegration } from '../reducers';
6
+
7
+ import type { QueryRequest } from '../reducers/search';
8
+ import type { State } from '../types/redux';
9
+ import type { AnyAction } from 'redux';
10
+ import type { ThunkDispatch } from 'redux-thunk';
11
+ import type { EntryValue } from '../valueObjects/Entry';
12
+
13
+ /*
14
+ * Constant Declarations
15
+ */
16
+ export const SEARCH_ENTRIES_REQUEST = 'SEARCH_ENTRIES_REQUEST';
17
+ export const SEARCH_ENTRIES_SUCCESS = 'SEARCH_ENTRIES_SUCCESS';
18
+ export const SEARCH_ENTRIES_FAILURE = 'SEARCH_ENTRIES_FAILURE';
19
+
20
+ export const QUERY_REQUEST = 'QUERY_REQUEST';
21
+ export const QUERY_SUCCESS = 'QUERY_SUCCESS';
22
+ export const QUERY_FAILURE = 'QUERY_FAILURE';
23
+
24
+ export const SEARCH_CLEAR = 'SEARCH_CLEAR';
25
+ export const CLEAR_REQUESTS = 'CLEAR_REQUESTS';
26
+
27
+ /*
28
+ * Simple Action Creators (Internal)
29
+ * We still need to export them for tests
30
+ */
31
+ export function searchingEntries(searchTerm: string, searchCollections: string[], page: number) {
32
+ return {
33
+ type: SEARCH_ENTRIES_REQUEST,
34
+ payload: { searchTerm, searchCollections, page },
35
+ } as const;
36
+ }
37
+
38
+ export function searchSuccess(entries: EntryValue[], page: number) {
39
+ return {
40
+ type: SEARCH_ENTRIES_SUCCESS,
41
+ payload: {
42
+ entries,
43
+ page,
44
+ },
45
+ } as const;
46
+ }
47
+
48
+ export function searchFailure(error: Error) {
49
+ return {
50
+ type: SEARCH_ENTRIES_FAILURE,
51
+ payload: { error },
52
+ } as const;
53
+ }
54
+
55
+ export function querying(searchTerm: string, request?: QueryRequest) {
56
+ return {
57
+ type: QUERY_REQUEST,
58
+ payload: {
59
+ searchTerm,
60
+ request,
61
+ },
62
+ } as const;
63
+ }
64
+
65
+ type SearchResponse = {
66
+ entries: EntryValue[];
67
+ pagination: number;
68
+ };
69
+
70
+ type QueryResponse = {
71
+ hits: EntryValue[];
72
+ query: string;
73
+ };
74
+
75
+ export function querySuccess(namespace: string, hits: EntryValue[]) {
76
+ return {
77
+ type: QUERY_SUCCESS,
78
+ payload: {
79
+ namespace,
80
+ hits,
81
+ },
82
+ } as const;
83
+ }
84
+
85
+ export function queryFailure(error: Error) {
86
+ return {
87
+ type: QUERY_FAILURE,
88
+ payload: { error },
89
+ } as const;
90
+ }
91
+
92
+ /*
93
+ * Exported simple Action Creators
94
+ */
95
+
96
+ export function clearSearch() {
97
+ return { type: SEARCH_CLEAR } as const;
98
+ }
99
+
100
+ export function clearRequests() {
101
+ return { type: CLEAR_REQUESTS } as const;
102
+ }
103
+
104
+ /*
105
+ * Exported Thunk Action Creators
106
+ */
107
+
108
+ // SearchEntries will search for complete entries in all collections.
109
+ export function searchEntries(searchTerm: string, searchCollections: string[], page = 0) {
110
+ return async (dispatch: ThunkDispatch<State, undefined, AnyAction>, getState: () => State) => {
111
+ const state = getState();
112
+ const { search } = state;
113
+ const backend = currentBackend(state.config);
114
+ const allCollections = searchCollections || state.collections.keySeq().toArray();
115
+ const collections = allCollections.filter(collection =>
116
+ selectIntegration(state, collection, 'search'),
117
+ );
118
+ const integration = selectIntegration(state, collections[0], 'search');
119
+
120
+ // avoid duplicate searches
121
+ if (
122
+ search.isFetching &&
123
+ search.term === searchTerm &&
124
+ isEqual(allCollections, search.collections) &&
125
+ // if an integration doesn't exist, 'page' is not used
126
+ (search.page === page || !integration)
127
+ ) {
128
+ return;
129
+ }
130
+
131
+ dispatch(searchingEntries(searchTerm, allCollections, page));
132
+
133
+ const searchPromise = integration
134
+ ? getIntegrationProvider(state.integrations, backend.getToken, integration).search(
135
+ collections,
136
+ searchTerm,
137
+ page,
138
+ )
139
+ : backend.search(
140
+ state.collections
141
+ .filter((_, key: string) => allCollections.indexOf(key) !== -1)
142
+ .valueSeq()
143
+ .toArray(),
144
+ searchTerm,
145
+ );
146
+
147
+ try {
148
+ const response: SearchResponse = await searchPromise;
149
+ return dispatch(searchSuccess(response.entries, response.pagination));
150
+ } catch (error) {
151
+ return dispatch(searchFailure(error));
152
+ }
153
+ };
154
+ }
155
+
156
+ // Instead of searching for complete entries, query will search for specific fields
157
+ // in specific collections and return raw data (no entries).
158
+ export function query(
159
+ namespace: string,
160
+ collectionName: string,
161
+ searchFields: string[],
162
+ searchTerm: string,
163
+ file?: string,
164
+ limit?: number,
165
+ ) {
166
+ return async (dispatch: ThunkDispatch<State, {}, AnyAction>, getState: () => State) => {
167
+ const state = getState();
168
+ const backend = currentBackend(state.config);
169
+ const integration = selectIntegration(state, collectionName, 'search');
170
+ const collection = state.collections.find(
171
+ collection => collection.get('name') === collectionName,
172
+ );
173
+
174
+ dispatch(clearRequests());
175
+
176
+ const queryIdentifier = `${collectionName}-${searchFields.join()}-${searchTerm}-${file}-${limit}`;
177
+
178
+ const queuedQueryPromise = state.search.requests.find(({ id }) => id == queryIdentifier);
179
+
180
+ const queryPromise = queuedQueryPromise
181
+ ? queuedQueryPromise.queryResponse
182
+ : integration
183
+ ? getIntegrationProvider(state.integrations, backend.getToken, integration).searchBy(
184
+ searchFields.map(f => `data.${f}`),
185
+ collectionName,
186
+ searchTerm,
187
+ )
188
+ : backend.query(collection, searchFields, searchTerm, file, limit);
189
+
190
+ dispatch(
191
+ querying(
192
+ searchTerm,
193
+ queuedQueryPromise
194
+ ? undefined
195
+ : {
196
+ id: queryIdentifier,
197
+ expires: new Date(new Date().getTime() + 10 * 1000),
198
+ queryResponse: queryPromise,
199
+ },
200
+ ),
201
+ );
202
+
203
+ try {
204
+ const response: QueryResponse = await queryPromise;
205
+ return dispatch(querySuccess(namespace, response.hits));
206
+ } catch (error) {
207
+ return dispatch(queryFailure(error));
208
+ }
209
+ };
210
+ }
211
+
212
+ export type SearchAction = ReturnType<
213
+ | typeof searchingEntries
214
+ | typeof searchSuccess
215
+ | typeof searchFailure
216
+ | typeof querying
217
+ | typeof querySuccess
218
+ | typeof queryFailure
219
+ | typeof clearSearch
220
+ | typeof clearRequests
221
+ >;
@@ -0,0 +1,99 @@
1
+ import { currentBackend } from '../backend';
2
+ import { addNotification, dismissNotification } from './notifications';
3
+
4
+ import type { ThunkDispatch } from 'redux-thunk';
5
+ import type { AnyAction } from 'redux';
6
+ import type { State } from '../types/redux';
7
+
8
+ export const STATUS_REQUEST = 'STATUS_REQUEST';
9
+ export const STATUS_SUCCESS = 'STATUS_SUCCESS';
10
+ export const STATUS_FAILURE = 'STATUS_FAILURE';
11
+
12
+ export function statusRequest() {
13
+ return {
14
+ type: STATUS_REQUEST,
15
+ } as const;
16
+ }
17
+
18
+ export function statusSuccess(status: {
19
+ auth: { status: boolean };
20
+ api: { status: boolean; statusPage: string };
21
+ }) {
22
+ return {
23
+ type: STATUS_SUCCESS,
24
+ payload: { status },
25
+ } as const;
26
+ }
27
+
28
+ export function statusFailure(error: Error) {
29
+ return {
30
+ type: STATUS_FAILURE,
31
+ payload: { error },
32
+ } as const;
33
+ }
34
+
35
+ export function checkBackendStatus() {
36
+ return async (dispatch: ThunkDispatch<State, {}, AnyAction>, getState: () => State) => {
37
+ try {
38
+ const state = getState();
39
+ if (state.status.isFetching) {
40
+ return;
41
+ }
42
+
43
+ dispatch(statusRequest());
44
+ const backend = currentBackend(state.config);
45
+ const status = await backend.status();
46
+
47
+ const backendDownKey = 'ui.toast.onBackendDown';
48
+ const previousBackendDownNotifications = state.notifications.notifications.filter(
49
+ n => typeof n.message != 'string' && n.message?.key === backendDownKey,
50
+ );
51
+
52
+ if (status.api.status === false) {
53
+ if (previousBackendDownNotifications.length === 0) {
54
+ dispatch(
55
+ addNotification({
56
+ message: {
57
+ details: status.api.statusPage,
58
+ key: 'ui.toast.onBackendDown',
59
+ },
60
+ type: 'error',
61
+ }),
62
+ );
63
+ }
64
+ return dispatch(statusSuccess(status));
65
+ } else if (status.api.status === true && previousBackendDownNotifications.length > 0) {
66
+ // If backend is up, clear all the danger messages
67
+ previousBackendDownNotifications.forEach(notification => {
68
+ dispatch(dismissNotification(notification.id));
69
+ });
70
+ }
71
+
72
+ const authError = status.auth.status === false;
73
+ if (authError) {
74
+ const key = 'ui.toast.onLoggedOut';
75
+ const existingNotification = state.notifications.notifications.find(
76
+ n => typeof n.message != 'string' && n.message?.key === key,
77
+ );
78
+ if (!existingNotification) {
79
+ dispatch(
80
+ addNotification({
81
+ message: {
82
+ key: 'ui.toast.onLoggedOut',
83
+ },
84
+ type: 'error',
85
+ }),
86
+ );
87
+ }
88
+ }
89
+
90
+ dispatch(statusSuccess(status));
91
+ } catch (error) {
92
+ dispatch(statusFailure(error));
93
+ }
94
+ };
95
+ }
96
+
97
+ export type StatusAction = ReturnType<
98
+ typeof statusRequest | typeof statusSuccess | typeof statusFailure
99
+ >;
@@ -0,0 +1,49 @@
1
+ import { WAIT_UNTIL_ACTION } from '../redux/middleware/waitUntilAction';
2
+
3
+ import type { WaitActionArgs } from '../redux/middleware/waitUntilAction';
4
+ import type { ThunkDispatch } from 'redux-thunk';
5
+ import type { AnyAction } from 'redux';
6
+ import type { State } from '../types/redux';
7
+
8
+ export function waitUntil({ predicate, run }: WaitActionArgs) {
9
+ return {
10
+ type: WAIT_UNTIL_ACTION,
11
+ predicate,
12
+ run,
13
+ };
14
+ }
15
+
16
+ export async function waitUntilWithTimeout<T>(
17
+ dispatch: ThunkDispatch<State, {}, AnyAction>,
18
+ waitActionArgs: (resolve: (value?: T) => void) => WaitActionArgs,
19
+ timeout = 30000,
20
+ ): Promise<T | null | void> {
21
+ let waitDone = false;
22
+
23
+ const waitPromise = new Promise<T>(resolve => {
24
+ dispatch(waitUntil(waitActionArgs(resolve as (value?: T | undefined) => void)));
25
+ });
26
+
27
+ const timeoutPromise = new Promise<T | null | void>(resolve => {
28
+ setTimeout(() => {
29
+ if (waitDone) {
30
+ resolve();
31
+ } else {
32
+ console.warn('Wait Action timed out');
33
+ resolve(null);
34
+ }
35
+ }, timeout);
36
+ });
37
+
38
+ const result = await Promise.race([
39
+ waitPromise
40
+ .then(result => {
41
+ waitDone = true;
42
+ return result;
43
+ })
44
+ .catch(null),
45
+ timeoutPromise,
46
+ ]);
47
+
48
+ return result;
49
+ }