sanity-plugin-media 4.3.5 → 5.0.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 (166) hide show
  1. package/dist/index.d.ts +190 -413
  2. package/dist/index.d.ts.map +1 -0
  3. package/dist/index.js +2532 -3564
  4. package/dist/index.js.map +1 -1
  5. package/package.json +29 -35
  6. package/dist/index.cjs +0 -5753
  7. package/dist/index.cjs.map +0 -1
  8. package/dist/index.d.cts +0 -462
  9. package/sanity.json +0 -8
  10. package/src/__tests__/fixtures/createEpicTestStore.ts +0 -28
  11. package/src/__tests__/fixtures/listenMock.ts +0 -9
  12. package/src/__tests__/fixtures/mockSanityClient.ts +0 -84
  13. package/src/__tests__/fixtures/renderWithProviders.tsx +0 -55
  14. package/src/__tests__/fixtures/rootState.ts +0 -27
  15. package/src/__tests__/fixtures/withinDialog.ts +0 -28
  16. package/src/components/AssetGridVirtualized/index.tsx +0 -94
  17. package/src/components/AssetMetadata/index.tsx +0 -122
  18. package/src/components/AssetTableVirtualized/index.tsx +0 -73
  19. package/src/components/AutoTagInputWrapper/index.tsx +0 -87
  20. package/src/components/Browser/Browser.test.tsx +0 -45
  21. package/src/components/Browser/index.tsx +0 -90
  22. package/src/components/Browser/useBrowserInit.ts +0 -126
  23. package/src/components/ButtonAssetCopy/index.tsx +0 -65
  24. package/src/components/ButtonViewGroup/index.tsx +0 -39
  25. package/src/components/CardAsset/CardAsset.test.tsx +0 -323
  26. package/src/components/CardAsset/index.tsx +0 -290
  27. package/src/components/CardUpload/index.tsx +0 -161
  28. package/src/components/Controls/index.tsx +0 -136
  29. package/src/components/DebugControls/index.tsx +0 -80
  30. package/src/components/Dialog/index.tsx +0 -11
  31. package/src/components/DialogAssetEdit/Details.tsx +0 -181
  32. package/src/components/DialogAssetEdit/DialogAssetEdit.test.tsx +0 -216
  33. package/src/components/DialogAssetEdit/index.tsx +0 -492
  34. package/src/components/DialogConfirm/index.tsx +0 -88
  35. package/src/components/DialogSearchFacets/index.tsx +0 -42
  36. package/src/components/DialogTagCreate/DialogTagCreate.test.tsx +0 -121
  37. package/src/components/DialogTagCreate/index.tsx +0 -103
  38. package/src/components/DialogTagEdit/DialogTagEdit.test.tsx +0 -165
  39. package/src/components/DialogTagEdit/index.tsx +0 -190
  40. package/src/components/DialogTags/index.tsx +0 -45
  41. package/src/components/Dialogs/index.tsx +0 -76
  42. package/src/components/DocumentList/index.tsx +0 -62
  43. package/src/components/FileAssetPreview/index.tsx +0 -37
  44. package/src/components/FileIcon/index.tsx +0 -43
  45. package/src/components/FormBuilderTool/FormBuilderTool.test.tsx +0 -63
  46. package/src/components/FormBuilderTool/index.tsx +0 -69
  47. package/src/components/FormFieldInputLabel/index.tsx +0 -66
  48. package/src/components/FormFieldInputTags/index.tsx +0 -98
  49. package/src/components/FormFieldInputText/index.tsx +0 -41
  50. package/src/components/FormFieldInputTextarea/index.tsx +0 -43
  51. package/src/components/FormSubmitButton/index.tsx +0 -59
  52. package/src/components/Header/index.tsx +0 -80
  53. package/src/components/Image/index.tsx +0 -41
  54. package/src/components/Items/index.tsx +0 -68
  55. package/src/components/Notifications/index.tsx +0 -24
  56. package/src/components/OrderSelect/index.tsx +0 -66
  57. package/src/components/PickedBar/index.tsx +0 -77
  58. package/src/components/Progress/index.tsx +0 -38
  59. package/src/components/ReduxProvider/index.tsx +0 -96
  60. package/src/components/SearchFacet/index.tsx +0 -66
  61. package/src/components/SearchFacetNumber/index.tsx +0 -133
  62. package/src/components/SearchFacetSelect/index.tsx +0 -110
  63. package/src/components/SearchFacetString/index.tsx +0 -88
  64. package/src/components/SearchFacetTags/index.tsx +0 -121
  65. package/src/components/SearchFacets/index.tsx +0 -72
  66. package/src/components/SearchFacetsControl/index.tsx +0 -140
  67. package/src/components/TableHeader/index.tsx +0 -110
  68. package/src/components/TableHeaderItem/index.tsx +0 -61
  69. package/src/components/TableRowAsset/index.tsx +0 -420
  70. package/src/components/TableRowUpload/index.tsx +0 -164
  71. package/src/components/Tag/index.tsx +0 -200
  72. package/src/components/TagIcon/index.tsx +0 -22
  73. package/src/components/TagView/index.tsx +0 -39
  74. package/src/components/TagViewHeader/index.tsx +0 -70
  75. package/src/components/TagsPanel/index.tsx +0 -40
  76. package/src/components/TagsVirtualized/index.tsx +0 -160
  77. package/src/components/TextInputNumber/index.tsx +0 -32
  78. package/src/components/TextInputSearch/index.tsx +0 -60
  79. package/src/components/Tool/index.tsx +0 -13
  80. package/src/components/UploadDropzone/UploadDropzone.test.tsx +0 -40
  81. package/src/components/UploadDropzone/index.tsx +0 -173
  82. package/src/config/orders.ts +0 -28
  83. package/src/config/searchFacets.ts +0 -312
  84. package/src/constants.ts +0 -87
  85. package/src/contexts/AssetSourceDispatchContext.tsx +0 -37
  86. package/src/contexts/DropzoneDispatchContext.tsx +0 -34
  87. package/src/contexts/ToolOptionsContext.tsx +0 -65
  88. package/src/formSchema/index.test.ts +0 -56
  89. package/src/formSchema/index.ts +0 -39
  90. package/src/hooks/useBreakpointIndex.ts +0 -49
  91. package/src/hooks/useKeyPress.ts +0 -39
  92. package/src/hooks/useOnScreen.ts +0 -34
  93. package/src/hooks/usePortalPopoverProps.ts +0 -13
  94. package/src/hooks/useTypedSelector.ts +0 -7
  95. package/src/hooks/useVersionedClient.ts +0 -6
  96. package/src/index.ts +0 -5
  97. package/src/modules/assets/actions.ts +0 -42
  98. package/src/modules/assets/deleteAndUpdateEpics.test.ts +0 -87
  99. package/src/modules/assets/fetchEpic.test.ts +0 -73
  100. package/src/modules/assets/index.ts +0 -825
  101. package/src/modules/assets/reducer.test.ts +0 -91
  102. package/src/modules/assets/tagsAndListenerEpics.test.ts +0 -206
  103. package/src/modules/debug/index.ts +0 -28
  104. package/src/modules/dialog/actions.ts +0 -10
  105. package/src/modules/dialog/epics.test.ts +0 -168
  106. package/src/modules/dialog/index.ts +0 -238
  107. package/src/modules/dialog/reducer.test.ts +0 -185
  108. package/src/modules/index.ts +0 -124
  109. package/src/modules/notifications/epics.test.ts +0 -374
  110. package/src/modules/notifications/index.ts +0 -199
  111. package/src/modules/notifications/reducer.test.ts +0 -54
  112. package/src/modules/search/index.test.ts +0 -36
  113. package/src/modules/search/index.ts +0 -167
  114. package/src/modules/selected/index.ts +0 -22
  115. package/src/modules/selectors.test.ts +0 -21
  116. package/src/modules/selectors.ts +0 -17
  117. package/src/modules/tags/epics.test.ts +0 -96
  118. package/src/modules/tags/index.test.ts +0 -42
  119. package/src/modules/tags/index.ts +0 -540
  120. package/src/modules/types.ts +0 -3
  121. package/src/modules/uploads/actions.ts +0 -13
  122. package/src/modules/uploads/epics.test.ts +0 -109
  123. package/src/modules/uploads/index.test.ts +0 -59
  124. package/src/modules/uploads/index.ts +0 -282
  125. package/src/operators/checkTagName.test.ts +0 -29
  126. package/src/operators/checkTagName.ts +0 -33
  127. package/src/operators/debugThrottle.ts +0 -25
  128. package/src/plugin.tsx +0 -54
  129. package/src/schemas/tag.ts +0 -28
  130. package/src/styled/GlobalStyles/index.tsx +0 -40
  131. package/src/styled/react-select/creatable.tsx +0 -184
  132. package/src/styled/react-select/single.tsx +0 -184
  133. package/src/types/index.ts +0 -379
  134. package/src/types/sanity-ui.d.ts +0 -6
  135. package/src/utils/applyMediaTags.ts +0 -87
  136. package/src/utils/blocksToText.test.ts +0 -43
  137. package/src/utils/blocksToText.ts +0 -27
  138. package/src/utils/constructFilter.test.ts +0 -120
  139. package/src/utils/constructFilter.ts +0 -98
  140. package/src/utils/generatePreviewBlobUrl.test.ts +0 -70
  141. package/src/utils/generatePreviewBlobUrl.ts +0 -53
  142. package/src/utils/getAssetResolution.test.ts +0 -13
  143. package/src/utils/getAssetResolution.ts +0 -7
  144. package/src/utils/getDocumentAssetIds.test.ts +0 -50
  145. package/src/utils/getDocumentAssetIds.ts +0 -35
  146. package/src/utils/getSchemeColor.test.ts +0 -12
  147. package/src/utils/getSchemeColor.ts +0 -43
  148. package/src/utils/getTagSelectOptions.test.ts +0 -44
  149. package/src/utils/getTagSelectOptions.ts +0 -16
  150. package/src/utils/getUniqueDocuments.test.ts +0 -26
  151. package/src/utils/getUniqueDocuments.ts +0 -15
  152. package/src/utils/imageDprUrl.test.ts +0 -46
  153. package/src/utils/imageDprUrl.ts +0 -27
  154. package/src/utils/isSupportedAssetType.test.ts +0 -16
  155. package/src/utils/isSupportedAssetType.ts +0 -15
  156. package/src/utils/mediaField.ts +0 -73
  157. package/src/utils/sanitizeFormData.test.ts +0 -59
  158. package/src/utils/sanitizeFormData.ts +0 -26
  159. package/src/utils/typeGuards.test.ts +0 -18
  160. package/src/utils/typeGuards.ts +0 -9
  161. package/src/utils/uploadSanityAsset.test.ts +0 -29
  162. package/src/utils/uploadSanityAsset.ts +0 -97
  163. package/src/utils/withMaxConcurrency.test.ts +0 -43
  164. package/src/utils/withMaxConcurrency.ts +0 -55
  165. package/src/utils/zodFormResolver.ts +0 -17
  166. package/v2-incompatible.js +0 -11
@@ -1,238 +0,0 @@
1
- import {createSlice, type PayloadAction} from '@reduxjs/toolkit'
2
- import pluralize from 'pluralize'
3
- import {ofType} from 'redux-observable'
4
- import {EMPTY, of} from 'rxjs'
5
- import {filter, mergeMap} from 'rxjs/operators'
6
-
7
- import type {AssetItem, Dialog, MyEpic, Tag} from '../../types'
8
- import {assetsActions} from '../assets'
9
- import {ASSETS_ACTIONS} from '../assets/actions'
10
- import {tagsActions} from '../tags'
11
- import {DIALOG_ACTIONS} from './actions'
12
-
13
- type DialogReducerState = {
14
- items: Dialog[]
15
- }
16
-
17
- const initialState = {
18
- items: [],
19
- } as DialogReducerState
20
-
21
- const dialogSlice = createSlice({
22
- name: 'dialog',
23
- initialState,
24
- extraReducers: (builder) => {
25
- builder.addCase(DIALOG_ACTIONS.showTagCreate, (state) => {
26
- state.items.push({
27
- id: 'tagCreate',
28
- type: 'tagCreate',
29
- })
30
- })
31
- builder.addCase(DIALOG_ACTIONS.showTagEdit, (state, action) => {
32
- const {tagId} = action.payload
33
- state.items.push({
34
- id: tagId,
35
- tagId,
36
- type: 'tagEdit',
37
- })
38
- })
39
- },
40
- reducers: {
41
- // Clear all dialogs
42
- clear(state) {
43
- state.items = []
44
- },
45
- // Add newly created inline tag to assetEdit dialog
46
- inlineTagCreate(state, action: PayloadAction<{assetId: string; tag: Tag}>) {
47
- const {assetId, tag} = action.payload
48
-
49
- state.items.forEach((item) => {
50
- if (item.type === 'assetEdit' && item.assetId === assetId) {
51
- item.lastCreatedTag = {
52
- label: tag.name.current,
53
- value: tag._id,
54
- }
55
- }
56
- })
57
- },
58
- // Remove inline tags from assetEdit dialog
59
- inlineTagRemove(state, action: PayloadAction<{tagIds: string[]}>) {
60
- const {tagIds} = action.payload
61
-
62
- state.items.forEach((item) => {
63
- if (item.type === 'assetEdit') {
64
- item.lastRemovedTagIds = tagIds
65
- }
66
- })
67
- },
68
- // Remove dialog by id
69
- remove(state, action: PayloadAction<{id: string}>) {
70
- const id = action.payload?.id
71
- state.items = state.items.filter((item) => item.id !== id)
72
- },
73
- showConfirmAssetsTagAdd(
74
- state,
75
- action: PayloadAction<{
76
- assetsPicked: AssetItem[]
77
- closeDialogId?: string
78
- tag: Tag
79
- }>,
80
- ) {
81
- const {assetsPicked, closeDialogId, tag} = action.payload
82
-
83
- const suffix = `${assetsPicked.length} ${pluralize('asset', assetsPicked.length)}`
84
-
85
- state.items.push({
86
- closeDialogId,
87
- confirmCallbackAction: ASSETS_ACTIONS.tagsAddRequest({
88
- assets: assetsPicked,
89
- tag,
90
- }),
91
- confirmText: `Yes, add tag to ${suffix}`,
92
- title: `Add tag ${tag.name.current} to ${suffix}?`,
93
- id: 'confirm',
94
- headerTitle: 'Confirm tag addition',
95
- tone: 'primary',
96
- type: 'confirm',
97
- })
98
- },
99
- showConfirmAssetsTagRemove(
100
- state,
101
- action: PayloadAction<{
102
- assetsPicked: AssetItem[]
103
- closeDialogId?: string
104
- tag: Tag
105
- }>,
106
- ) {
107
- const {assetsPicked, closeDialogId, tag} = action.payload
108
-
109
- const suffix = `${assetsPicked.length} ${pluralize('asset', assetsPicked.length)}`
110
-
111
- state.items.push({
112
- closeDialogId,
113
- confirmCallbackAction: ASSETS_ACTIONS.tagsRemoveRequest({assets: assetsPicked, tag}),
114
- confirmText: `Yes, remove tag from ${suffix}`,
115
- headerTitle: 'Confirm tag removal',
116
- id: 'confirm',
117
- title: `Remove tag ${tag.name.current} from ${suffix}?`,
118
- tone: 'critical',
119
- type: 'confirm',
120
- })
121
- },
122
- showConfirmDeleteAssets(
123
- state,
124
- action: PayloadAction<{assets: AssetItem[]; closeDialogId?: string}>,
125
- ) {
126
- const {assets, closeDialogId} = action.payload
127
-
128
- const suffix = `${assets.length} ${pluralize('asset', assets.length)}`
129
-
130
- state.items.push({
131
- closeDialogId,
132
- confirmCallbackAction: assetsActions.deleteRequest({
133
- assets: assets.map((assetItem) => assetItem.asset),
134
- }),
135
- confirmText: `Yes, delete ${suffix}`,
136
- description: 'This operation cannot be reversed. Are you sure you want to continue?',
137
- title: `Permanently delete ${suffix}?`,
138
- id: 'confirm',
139
- headerTitle: 'Confirm deletion',
140
- tone: 'critical',
141
- type: 'confirm',
142
- })
143
- },
144
- showConfirmDeleteTag(state, action: PayloadAction<{closeDialogId?: string; tag: Tag}>) {
145
- const {closeDialogId, tag} = action.payload
146
-
147
- const suffix = 'tag'
148
-
149
- state.items.push({
150
- closeDialogId,
151
- confirmCallbackAction: tagsActions.deleteRequest({tag}),
152
- confirmText: `Yes, delete ${suffix}`,
153
- description: 'This operation cannot be reversed. Are you sure you want to continue?',
154
- title: `Permanently delete ${suffix}?`,
155
- id: 'confirm',
156
- headerTitle: 'Confirm deletion',
157
- tone: 'critical',
158
- type: 'confirm',
159
- })
160
- },
161
- showAssetEdit(state, action: PayloadAction<{assetId: string}>) {
162
- const {assetId} = action.payload
163
- state.items.push({
164
- assetId,
165
- id: assetId,
166
- type: 'assetEdit',
167
- })
168
- },
169
- showSearchFacets(state) {
170
- state.items.push({
171
- id: 'searchFacets',
172
- type: 'searchFacets',
173
- })
174
- },
175
- showTags(state) {
176
- state.items.push({
177
- id: 'tags',
178
- type: 'tags',
179
- })
180
- },
181
- },
182
- })
183
-
184
- // Epics
185
-
186
- export const dialogClearOnAssetUpdateEpic: MyEpic = (action$) =>
187
- action$.pipe(
188
- ofType(
189
- assetsActions.deleteComplete.type,
190
- assetsActions.updateComplete.type,
191
- tagsActions.deleteComplete.type,
192
- tagsActions.updateComplete.type,
193
- ),
194
- filter(
195
- (action: {
196
- payload: {closeDialogId?: string}
197
- }): action is PayloadAction<{closeDialogId?: string}> => !!action?.payload?.closeDialogId,
198
- ),
199
- mergeMap((action) => {
200
- const dialogId = action?.payload?.closeDialogId
201
- if (dialogId) {
202
- return of(dialogSlice.actions.remove({id: dialogId}))
203
- }
204
- return EMPTY
205
- }),
206
- )
207
-
208
- export const dialogTagCreateEpic: MyEpic = (action$) =>
209
- action$.pipe(
210
- filter(tagsActions.createComplete.match),
211
- mergeMap((action) => {
212
- const {assetId, tag} = action?.payload
213
-
214
- if (assetId) {
215
- return of(dialogSlice.actions.inlineTagCreate({tag, assetId}))
216
- }
217
-
218
- if (tag._id) {
219
- return of(dialogSlice.actions.remove({id: 'tagCreate'}))
220
- }
221
-
222
- return EMPTY
223
- }),
224
- )
225
-
226
- export const dialogTagDeleteEpic: MyEpic = (action$) =>
227
- action$.pipe(
228
- filter(tagsActions.listenerDeleteQueueComplete.match),
229
- mergeMap((action) => {
230
- const {tagIds} = action?.payload
231
-
232
- return of(dialogSlice.actions.inlineTagRemove({tagIds}))
233
- }),
234
- )
235
-
236
- export const dialogActions = {...dialogSlice.actions}
237
-
238
- export default dialogSlice.reducer
@@ -1,185 +0,0 @@
1
- // @vitest-environment node
2
-
3
- import {describe, expect, it} from 'vitest'
4
-
5
- import {createTestRootState} from '../../__tests__/fixtures/rootState'
6
- import type {AssetItem, ImageAsset, Tag} from '../../types'
7
- import {assetsActions} from '../assets'
8
- import {ASSETS_ACTIONS} from '../assets/actions'
9
- import {tagsActions} from '../tags'
10
- import {DIALOG_ACTIONS} from './actions'
11
- import dialogReducer, {dialogActions} from './index'
12
-
13
- const sampleAsset = {
14
- _id: 'a1',
15
- _type: 'sanity.imageAsset',
16
- _createdAt: '',
17
- _updatedAt: '',
18
- _rev: 'r1',
19
- originalFilename: 'x.png',
20
- size: 1,
21
- mimeType: 'image/png',
22
- url: 'https://example.com/x.png',
23
- } as ImageAsset
24
-
25
- const sampleTag: Tag = {
26
- _id: 't1',
27
- _type: 'media.tag',
28
- _createdAt: '',
29
- _updatedAt: '',
30
- _rev: 'tr',
31
- name: {_type: 'slug', current: 'alpha'},
32
- }
33
-
34
- const assetItem = (asset: ImageAsset = sampleAsset): AssetItem => ({
35
- _type: 'asset',
36
- asset,
37
- picked: false,
38
- updating: false,
39
- })
40
-
41
- function dialogState() {
42
- return createTestRootState().dialog
43
- }
44
-
45
- describe('dialog slice reducers', () => {
46
- it('clear removes all items', () => {
47
- const state = dialogReducer(
48
- {...dialogState(), items: [{id: 'x', type: 'tags'}]},
49
- dialogActions.clear(),
50
- )
51
- expect(state.items).toEqual([])
52
- })
53
-
54
- it('remove filters out the dialog with the given id', () => {
55
- const state = dialogReducer(
56
- {
57
- ...dialogState(),
58
- items: [
59
- {id: 'a', type: 'tags'},
60
- {id: 'b', type: 'searchFacets'},
61
- ],
62
- },
63
- dialogActions.remove({id: 'a'}),
64
- )
65
- expect(state.items).toEqual([{id: 'b', type: 'searchFacets'}])
66
- })
67
-
68
- it('showAssetEdit appends an asset edit dialog', () => {
69
- const state = dialogReducer(dialogState(), dialogActions.showAssetEdit({assetId: 'a1'}))
70
- expect(state.items).toEqual([{assetId: 'a1', id: 'a1', type: 'assetEdit'}])
71
- })
72
-
73
- it('showSearchFacets and showTags append the expected dialogs', () => {
74
- let state = dialogReducer(dialogState(), dialogActions.showSearchFacets())
75
- state = dialogReducer(state, dialogActions.showTags())
76
- expect(state.items).toEqual([
77
- {id: 'searchFacets', type: 'searchFacets'},
78
- {id: 'tags', type: 'tags'},
79
- ])
80
- })
81
-
82
- it('inlineTagCreate sets lastCreatedTag on matching assetEdit items', () => {
83
- const state = dialogReducer(
84
- {
85
- ...dialogState(),
86
- items: [
87
- {id: 'a1', type: 'assetEdit', assetId: 'a1'},
88
- {id: 'a2', type: 'assetEdit', assetId: 'a2'},
89
- ],
90
- },
91
- dialogActions.inlineTagCreate({assetId: 'a1', tag: sampleTag}),
92
- )
93
- const a1 = state.items.find((i) => i.type === 'assetEdit' && i.assetId === 'a1')
94
- const a2 = state.items.find((i) => i.type === 'assetEdit' && i.assetId === 'a2')
95
- expect(a1 && 'lastCreatedTag' in a1 && a1.lastCreatedTag).toEqual({
96
- label: 'alpha',
97
- value: 't1',
98
- })
99
- expect(a2).toBeDefined()
100
- expect(Object.prototype.hasOwnProperty.call(a2, 'lastCreatedTag')).toBe(false)
101
- })
102
-
103
- it('inlineTagRemove sets lastRemovedTagIds on all assetEdit items', () => {
104
- const state = dialogReducer(
105
- {
106
- ...dialogState(),
107
- items: [
108
- {id: 'a1', type: 'assetEdit', assetId: 'a1'},
109
- {id: 'tags', type: 'tags'},
110
- ],
111
- },
112
- dialogActions.inlineTagRemove({tagIds: ['x', 'y']}),
113
- )
114
- const edit = state.items.find((i) => i.type === 'assetEdit')
115
- expect(edit && 'lastRemovedTagIds' in edit && edit.lastRemovedTagIds).toEqual(['x', 'y'])
116
- const tagsPanel = state.items.find((i) => i.type === 'tags')
117
- expect(tagsPanel && 'lastRemovedTagIds' in tagsPanel).toBeFalsy()
118
- })
119
-
120
- it('showConfirmDeleteAssets pushes a confirm dialog wired to assets deleteRequest', () => {
121
- const item = assetItem()
122
- const state = dialogReducer(
123
- dialogState(),
124
- dialogActions.showConfirmDeleteAssets({assets: [item], closeDialogId: 'a1'}),
125
- )
126
- const confirm = state.items[0]
127
- expect(confirm?.type).toBe('confirm')
128
- expect(confirm && 'title' in confirm && confirm.title).toBe('Permanently delete 1 asset?')
129
- const cb = confirm && 'confirmCallbackAction' in confirm ? confirm.confirmCallbackAction : null
130
- expect(cb).toEqual(assetsActions.deleteRequest({assets: [sampleAsset]}))
131
- })
132
-
133
- it('showConfirmDeleteTag pushes a confirm dialog wired to tags deleteRequest', () => {
134
- const state = dialogReducer(
135
- dialogState(),
136
- dialogActions.showConfirmDeleteTag({closeDialogId: 't1', tag: sampleTag}),
137
- )
138
- const confirm = state.items[0]
139
- expect(confirm?.type).toBe('confirm')
140
- expect(confirm && 'title' in confirm && confirm.title).toMatch(/permanently delete/i)
141
- const cb = confirm && 'confirmCallbackAction' in confirm ? confirm.confirmCallbackAction : null
142
- expect(cb).toEqual(tagsActions.deleteRequest({tag: sampleTag}))
143
- })
144
-
145
- it('showConfirmAssetsTagAdd uses plural copy for multiple assets', () => {
146
- const a2 = {...sampleAsset, _id: 'a2', originalFilename: 'y.png'} as ImageAsset
147
- const state = dialogReducer(
148
- dialogState(),
149
- dialogActions.showConfirmAssetsTagAdd({
150
- assetsPicked: [assetItem(), assetItem(a2)],
151
- tag: sampleTag,
152
- }),
153
- )
154
- const confirm = state.items[0]
155
- expect(confirm && 'title' in confirm && confirm.title).toContain('2 assets')
156
- const cb = confirm && 'confirmCallbackAction' in confirm ? confirm.confirmCallbackAction : null
157
- expect(cb).toEqual(
158
- ASSETS_ACTIONS.tagsAddRequest({assets: [assetItem(), assetItem(a2)], tag: sampleTag}),
159
- )
160
- })
161
-
162
- it('showConfirmAssetsTagRemove pushes removal confirm with tagsRemoveRequest', () => {
163
- const state = dialogReducer(
164
- dialogState(),
165
- dialogActions.showConfirmAssetsTagRemove({
166
- assetsPicked: [assetItem()],
167
- tag: sampleTag,
168
- }),
169
- )
170
- const confirm = state.items[0]
171
- expect(confirm && 'tone' in confirm && confirm.tone).toBe('critical')
172
- const cb = confirm && 'confirmCallbackAction' in confirm ? confirm.confirmCallbackAction : null
173
- expect(cb).toEqual(ASSETS_ACTIONS.tagsRemoveRequest({assets: [assetItem()], tag: sampleTag}))
174
- })
175
-
176
- it('DIALOG_ACTIONS.showTagCreate appends tag create dialog', () => {
177
- const state = dialogReducer(dialogState(), DIALOG_ACTIONS.showTagCreate())
178
- expect(state.items).toEqual([{id: 'tagCreate', type: 'tagCreate'}])
179
- })
180
-
181
- it('DIALOG_ACTIONS.showTagEdit appends tag edit dialog with tag id', () => {
182
- const state = dialogReducer(dialogState(), DIALOG_ACTIONS.showTagEdit({tagId: 't9'}))
183
- expect(state.items).toEqual([{id: 't9', tagId: 't9', type: 'tagEdit'}])
184
- })
185
- })
@@ -1,124 +0,0 @@
1
- import {
2
- type ActionFromReducersMapObject,
3
- type Reducer,
4
- type StateFromReducersMapObject,
5
- combineReducers,
6
- } from '@reduxjs/toolkit'
7
- import {combineEpics} from 'redux-observable'
8
-
9
- import assetsReducer, {
10
- assetsDeleteEpic,
11
- assetsFetchAfterDeleteAllEpic,
12
- assetsFetchEpic,
13
- assetsFetchNextPageEpic,
14
- assetsFetchPageIndexEpic,
15
- assetsListenerCreateQueueEpic,
16
- assetsListenerDeleteQueueEpic,
17
- assetsListenerUpdateQueueEpic,
18
- assetsOrderSetEpic,
19
- assetsSearchEpic,
20
- assetsSortEpic,
21
- assetsTagsAddEpic,
22
- assetsTagsRemoveEpic,
23
- assetsUnpickEpic,
24
- assetsUpdateEpic,
25
- } from './assets'
26
- import debugReducer from './debug'
27
- import dialogReducer, {
28
- dialogClearOnAssetUpdateEpic,
29
- dialogTagCreateEpic,
30
- dialogTagDeleteEpic,
31
- } from './dialog'
32
- import notificationsReducer, {
33
- notificationsAssetsDeleteErrorEpic,
34
- notificationsAssetsDeleteCompleteEpic,
35
- notificationsAssetsTagsAddCompleteEpic,
36
- notificationsAssetsTagsRemoveCompleteEpic,
37
- notificationsAssetsUpdateCompleteEpic,
38
- notificationsGenericErrorEpic,
39
- notificationsTagCreateCompleteEpic,
40
- notificationsTagDeleteCompleteEpic,
41
- notificationsTagUpdateCompleteEpic,
42
- } from './notifications'
43
- import searchReducer, {searchFacetTagUpdateEpic} from './search'
44
- import selectedReducer from './selected'
45
- import tagsReducer, {
46
- tagsCreateEpic,
47
- tagsDeleteEpic,
48
- tagsFetchEpic,
49
- tagsListenerCreateQueueEpic,
50
- tagsListenerDeleteQueueEpic,
51
- tagsListenerUpdateQueueEpic,
52
- tagsSortEpic,
53
- tagsUpdateEpic,
54
- } from './tags'
55
- import uploadsReducer, {
56
- uploadsAssetStartEpic,
57
- uploadsAssetUploadEpic,
58
- uploadsCheckRequestEpic,
59
- uploadsCompleteQueueEpic,
60
- } from './uploads'
61
-
62
- export const rootEpic = combineEpics(
63
- assetsDeleteEpic,
64
- assetsFetchEpic,
65
- assetsFetchAfterDeleteAllEpic,
66
- assetsFetchNextPageEpic,
67
- assetsFetchPageIndexEpic,
68
- assetsListenerCreateQueueEpic,
69
- assetsListenerDeleteQueueEpic,
70
- assetsListenerUpdateQueueEpic,
71
- assetsOrderSetEpic,
72
- assetsSearchEpic,
73
- assetsSortEpic,
74
- assetsTagsAddEpic,
75
- assetsTagsRemoveEpic,
76
- assetsUnpickEpic,
77
- assetsUpdateEpic,
78
- dialogClearOnAssetUpdateEpic,
79
- dialogTagCreateEpic,
80
- dialogTagDeleteEpic,
81
- notificationsAssetsDeleteErrorEpic,
82
- notificationsAssetsDeleteCompleteEpic,
83
- notificationsAssetsTagsAddCompleteEpic,
84
- notificationsAssetsTagsRemoveCompleteEpic,
85
- notificationsAssetsUpdateCompleteEpic,
86
- notificationsGenericErrorEpic,
87
- notificationsTagCreateCompleteEpic,
88
- notificationsTagDeleteCompleteEpic,
89
- notificationsTagUpdateCompleteEpic,
90
- searchFacetTagUpdateEpic,
91
- tagsCreateEpic,
92
- tagsDeleteEpic,
93
- tagsFetchEpic,
94
- tagsListenerCreateQueueEpic,
95
- tagsListenerDeleteQueueEpic,
96
- tagsListenerUpdateQueueEpic,
97
- tagsSortEpic,
98
- tagsUpdateEpic,
99
- uploadsAssetStartEpic,
100
- uploadsAssetUploadEpic,
101
- uploadsCheckRequestEpic,
102
- uploadsCompleteQueueEpic,
103
- )
104
-
105
- const reducers = {
106
- assets: assetsReducer,
107
- debug: debugReducer,
108
- dialog: dialogReducer,
109
- notifications: notificationsReducer,
110
- search: searchReducer,
111
- selected: selectedReducer,
112
- tags: tagsReducer,
113
- uploads: uploadsReducer,
114
- }
115
-
116
- type ReducersMapObject = typeof reducers
117
-
118
- // Workaround to avoid `$CombinedState` ts errors
119
- // source: https://github.com/reduxjs/redux-toolkit/issues/2068#issuecomment-1130796500
120
- // TODO: remove once we use `redux-toolkit` v2
121
- export const rootReducer: Reducer<
122
- StateFromReducersMapObject<ReducersMapObject>,
123
- ActionFromReducersMapObject<ReducersMapObject>
124
- > = combineReducers(reducers)