1
- import isEmpty from 'lodash.isempty'
2
1
import findIndex from 'lodash.findindex'
3
2
import prepareSearchQueryParams from '~/utils/prepare-search-query-params'
4
3
import decodeMediaData from '~/utils/decode-media-data'
5
4
import {
6
- FETCH_MEDIA ,
7
5
FETCH_AUDIO ,
8
6
FETCH_IMAGE ,
9
- FETCH_COLLECTION_IMAGES ,
10
- HANDLE_NO_MEDIA ,
7
+ FETCH_MEDIA ,
11
8
HANDLE_MEDIA_ERROR ,
12
- UPDATE_SEARCH_TYPE ,
9
+ HANDLE_NO_MEDIA ,
13
10
SET_SEARCH_TYPE_FROM_URL ,
11
+ UPDATE_SEARCH_TYPE ,
14
12
} from '~/constants/action-types'
15
13
import {
16
14
FETCH_END_MEDIA ,
17
15
FETCH_MEDIA_ERROR ,
18
16
FETCH_START_MEDIA ,
19
17
MEDIA_NOT_FOUND ,
18
+ RESET_MEDIA ,
20
19
SET_AUDIO ,
21
20
SET_IMAGE ,
22
21
SET_IMAGE_PAGE ,
@@ -26,8 +25,8 @@ import {
26
25
UPDATE_FILTERS ,
27
26
} from '~/constants/mutation-types'
28
27
import {
29
- SEND_SEARCH_QUERY_EVENT ,
30
28
SEND_RESULT_CLICKED_EVENT ,
29
+ SEND_SEARCH_QUERY_EVENT ,
31
30
} from '~/constants/usage-data-analytics-types'
32
31
import { queryStringToSearchType } from '~/utils/search-query-transform'
33
32
import { ALL_MEDIA , AUDIO , IMAGE } from '~/constants/media'
@@ -38,77 +37,6 @@ import { USAGE_DATA } from '~/constants/store-modules'
38
37
// ? window.location.pathname
39
38
// : '/search'
40
39
41
- /**
42
- * hides the search results in case the user is performing a new search.
43
- * This prevents results from a previous search from showing while the
44
- * new search results are still loading
45
- */
46
- const hideSearchResultsOnNewSearch = ( commit , pageNumber ) => {
47
- if ( ! pageNumber ) {
48
- commit ( SET_MEDIA , { mediaType : IMAGE , media : [ ] } )
49
- commit ( SET_MEDIA , { mediaType : AUDIO , media : [ ] } )
50
- }
51
- }
52
-
53
- const allKeysUndefinedExcept = ( value , keyName ) => {
54
- const keys = Object . keys ( value )
55
- return keys . reduce ( ( matchedUndefinedCriteria , key ) => {
56
- const shouldBeUndefined = key !== keyName
57
- const isUndefined = isEmpty ( value [ key ] )
58
-
59
- return matchedUndefinedCriteria && shouldBeUndefined === isUndefined
60
- } , true )
61
- }
62
-
63
- const fetchCollectionImages = ( commit , params , imageService ) => {
64
- hideSearchResultsOnNewSearch ( commit , params . page )
65
-
66
- const queryParams = {
67
- q : params . q ,
68
- provider : params . provider ,
69
- searchBy : params . searchBy ,
70
- }
71
- // the provider collection API doesn't support the `q` parameter.
72
- // so if the `q`, or any other search filter is provided, and
73
- // since the `provider` parameter is passed, we can just call the search API instead
74
- const searchMethod = allKeysUndefinedExcept ( queryParams , 'provider' )
75
- ? imageService . getProviderCollection
76
- : imageService . search
77
- const newParams = { ...params , source : params . provider }
78
- delete newParams . provider
79
- return searchMethod ( prepareSearchQueryParams ( newParams ) )
80
- }
81
-
82
- /**
83
- * With the API response: set loading to false, set the
84
- * store `images` or `audios` property to the result,
85
- * and handle possible errors
86
- * @param {import('vuex').Commit } commit
87
- * @param {import('vuex').Dispatch } dispatch
88
- * @param {import('../store/types').MediaResult } data
89
- * @param {Object } params
90
- * @param {'image'|'audio' } params.mediaType
91
- * @param {boolean } params.shouldPersistMedia
92
- * @param {number } params.page
93
- */
94
- const handleSearchResponse = async (
95
- commit ,
96
- dispatch ,
97
- data ,
98
- { mediaType, shouldPersistMedia, page }
99
- ) => {
100
- commit ( FETCH_END_MEDIA , { mediaType } )
101
- commit ( SET_MEDIA , {
102
- mediaType,
103
- media : data . results ,
104
- mediaCount : data . result_count ,
105
- pageCount : data . page_count ,
106
- shouldPersistMedia : shouldPersistMedia ,
107
- page : page ,
108
- } )
109
- return dispatch ( HANDLE_NO_MEDIA , mediaType )
110
- }
111
-
112
40
/**
113
41
* @type {{ audios: import('../store/types').AudioDetail[],
114
42
* audiosCount: number, audioPage:number,
@@ -143,12 +71,8 @@ const state = {
143
71
query : { } ,
144
72
}
145
73
146
- /**
147
- * @param {Object } AudioService
148
- * @param {Object } ImageService
149
- */
150
- const actions = ( AudioService , ImageService ) => ( {
151
- [ FETCH_MEDIA ] ( { commit, dispatch, rootState } , params ) {
74
+ const actions = ( services ) => ( {
75
+ async [ FETCH_MEDIA ] ( { commit, dispatch, rootState } , params ) {
152
76
// does not send event if user is paginating for more results
153
77
const { page, mediaType, q } = params
154
78
if ( ! page ) {
@@ -159,40 +83,42 @@ const actions = (AudioService, ImageService) => ({
159
83
}
160
84
161
85
commit ( FETCH_START_MEDIA , { mediaType } )
162
- hideSearchResultsOnNewSearch ( commit , page )
86
+ if ( ! params . page ) {
87
+ commit ( RESET_MEDIA , { mediaType } )
88
+ }
163
89
const queryParams = prepareSearchQueryParams ( params )
164
- let service
165
- if ( mediaType === IMAGE ) {
166
- service = ImageService
167
- } else if ( mediaType === AUDIO ) {
168
- service = AudioService
169
- } else {
90
+ if ( ! Object . keys ( services ) . includes ( mediaType ) ) {
170
91
throw new Error ( `Cannot fetch unknown media type "${ mediaType } "` )
171
92
}
172
- return service
93
+ await services [ mediaType ]
173
94
. search ( queryParams )
174
- . then (
175
- async ( { data } ) =>
176
- await handleSearchResponse ( commit , dispatch , data , params )
177
- )
95
+ . then ( ( { data } ) => {
96
+ commit ( FETCH_END_MEDIA , { mediaType } )
97
+ const mediaCount = data . result_count
98
+ commit ( SET_MEDIA , {
99
+ mediaType,
100
+ media : data . results ,
101
+ mediaCount,
102
+ pageCount : data . page_count ,
103
+ shouldPersistMedia : params . shouldPersistMedia ,
104
+ page : page ,
105
+ } )
106
+ dispatch ( HANDLE_NO_MEDIA , { mediaType, mediaCount } )
107
+ } )
178
108
. catch ( ( error ) => {
179
109
dispatch ( HANDLE_MEDIA_ERROR , { mediaType, error } )
180
110
} )
181
111
} ,
182
- // eslint-disable-next-line no-unused-vars
183
- [ FETCH_AUDIO ] ( { commit, dispatch, state, rootState } , params ) {
112
+ async [ FETCH_AUDIO ] ( { commit, dispatch, state, rootState } , params ) {
184
113
dispatch ( `${ USAGE_DATA } /${ SEND_RESULT_CLICKED_EVENT } ` , {
185
114
query : state . query . q ,
186
115
resultUuid : params . id ,
187
116
resultRank : findIndex ( state . audios , ( img ) => img . id === params . id ) ,
188
- sessionId : rootState . usageSessionId ,
117
+ sessionId : rootState . user . usageSessionId ,
189
118
} )
190
-
191
- commit ( FETCH_START_MEDIA , { mediaType : AUDIO } )
192
119
commit ( SET_AUDIO , { audio : { } } )
193
- return AudioService . getMediaDetail ( params )
120
+ await services [ AUDIO ] . getMediaDetail ( params )
194
121
. then ( ( { data } ) => {
195
- commit ( FETCH_END_MEDIA , { mediaType : AUDIO } )
196
122
commit ( SET_AUDIO , { audio : data } )
197
123
} )
198
124
. catch ( ( error ) => {
@@ -203,8 +129,7 @@ const actions = (AudioService, ImageService) => ({
203
129
}
204
130
} )
205
131
} ,
206
- // eslint-disable-next-line no-unused-vars
207
- [ FETCH_IMAGE ] ( { commit, dispatch, state, rootState } , params ) {
132
+ async [ FETCH_IMAGE ] ( { commit, dispatch, state, rootState } , params ) {
208
133
dispatch ( `${ USAGE_DATA } /${ SEND_RESULT_CLICKED_EVENT } ` , {
209
134
query : state . query . q ,
210
135
resultUuid : params . id ,
@@ -213,30 +138,19 @@ const actions = (AudioService, ImageService) => ({
213
138
} )
214
139
215
140
commit ( SET_IMAGE , { image : { } } )
216
- return ImageService . getMediaDetail ( params )
141
+ await services [ IMAGE ] . getMediaDetail ( params )
217
142
. then ( ( { data } ) => {
218
143
commit ( SET_IMAGE , { image : data } )
219
144
} )
220
145
. catch ( ( error ) => {
221
146
if ( error . response && error . response . status === 404 ) {
222
147
commit ( MEDIA_NOT_FOUND , { mediaType : IMAGE } )
223
148
} else {
224
- throw new Error ( `Error fetching the image: ${ error } ` )
149
+ throw new Error ( `Error fetching the image: ${ error . message } ` )
225
150
}
226
151
} )
227
152
} ,
228
- [ FETCH_COLLECTION_IMAGES ] ( { commit, dispatch } , params ) {
229
- commit ( FETCH_START_MEDIA , { mediaType : IMAGE } )
230
- return fetchCollectionImages ( commit , params , ImageService )
231
- . then (
232
- async ( { data } ) =>
233
- await handleSearchResponse ( commit , dispatch , data , params )
234
- )
235
- . catch ( ( error ) => {
236
- dispatch ( HANDLE_MEDIA_ERROR , { mediaType : IMAGE , error } )
237
- } )
238
- } ,
239
- [ HANDLE_MEDIA_ERROR ] ( { commit } , { mediaType, error } ) {
153
+ async [ HANDLE_MEDIA_ERROR ] ( { commit } , { mediaType, error } ) {
240
154
let errorMessage
241
155
if ( error . response ) {
242
156
errorMessage =
@@ -266,41 +180,21 @@ const actions = (AudioService, ImageService) => ({
266
180
} ,
267
181
} )
268
182
269
- function setQuery ( _state , params ) {
270
- const query = Object . assign ( { } , _state . query , params . query )
271
- _state . query = query
272
- _state . images = [ ]
273
-
274
- // if (params.shouldNavigate === true) {
275
- // redirect({ path, query })
276
- // }
277
- }
278
-
279
- /* eslint no-param-reassign: ["error", { "props": false }] */
280
183
const mutations = {
281
184
[ FETCH_START_MEDIA ] ( _state , { mediaType } ) {
282
- if ( mediaType === IMAGE ) {
283
- _state . isFetching . images = true
284
- _state . isFetchingError . images = false
285
- } else if ( mediaType === AUDIO ) {
286
- _state . isFetching . audios = true
287
- _state . isFetchingError . audios = false
288
- }
185
+ const mediaPlural = `${ mediaType } s`
186
+ _state . isFetching [ mediaPlural ] = true
187
+ _state . isFetchingError [ mediaPlural ] = false
289
188
} ,
290
189
[ FETCH_END_MEDIA ] ( _state , { mediaType } ) {
291
- mediaType === IMAGE
292
- ? ( _state . isFetching . images = false )
293
- : ( _state . isFetching . audios = false )
190
+ const mediaPlural = `${ mediaType } s`
191
+ _state . isFetching [ mediaPlural ] = false
294
192
} ,
295
193
[ FETCH_MEDIA_ERROR ] ( _state , params ) {
296
194
const { mediaType, errorMessage } = params
297
- if ( mediaType === IMAGE ) {
298
- _state . isFetchingError . images = true
299
- _state . isFetching . images = false
300
- } else if ( mediaType === AUDIO ) {
301
- _state . isFetchingError . audios = true
302
- _state . isFetching . audios = false
303
- }
195
+ const mediaPlural = `${ mediaType } s`
196
+ _state . isFetching [ mediaPlural ] = false
197
+ _state . isFetchingError [ mediaPlural ] = true
304
198
_state . errorMessage = errorMessage
305
199
} ,
306
200
[ SET_AUDIO ] ( _state , params ) {
@@ -335,14 +229,22 @@ const mutations = {
335
229
_state . pageCount [ mediaPlural ] = pageCount
336
230
} ,
337
231
[ SET_QUERY ] ( _state , params ) {
338
- setQuery ( _state , params )
232
+ _state . query = Object . assign ( { } , _state . query , params . query )
233
+ _state . images = [ ]
339
234
} ,
340
- [ MEDIA_NOT_FOUND ] ( params ) {
235
+ [ MEDIA_NOT_FOUND ] ( _state , params ) {
341
236
throw new Error ( `Media of type ${ params . mediaType } not found` )
342
237
} ,
343
238
[ SET_SEARCH_TYPE ] ( _state , params ) {
344
239
_state . searchType = params . searchType
345
240
} ,
241
+ [ RESET_MEDIA ] ( _state , params ) {
242
+ const { mediaType } = params
243
+ _state [ `${ mediaType } s` ] = [ ]
244
+ _state [ `${ mediaType } sCount` ] = 0
245
+ _state [ `${ mediaType } Page` ] = undefined
246
+ _state . pageCount [ `${ mediaType } s` ] = 0
247
+ } ,
346
248
}
347
249
348
250
export default {
0 commit comments