@rubixstudios/payload-media 1.2.3 → 2.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 (47) hide show
  1. package/README.md +72 -35
  2. package/dist/components/media-search/index.d.ts.map +1 -1
  3. package/dist/components/media-search/index.js +6 -5
  4. package/dist/components/search-drawer/filters/pexels.d.ts +4 -4
  5. package/dist/components/search-drawer/filters/pexels.d.ts.map +1 -1
  6. package/dist/components/search-drawer/filters/pexels.js +9 -8
  7. package/dist/components/search-drawer/filters/pixabay.d.ts +4 -4
  8. package/dist/components/search-drawer/filters/pixabay.d.ts.map +1 -1
  9. package/dist/components/search-drawer/filters/pixabay.js +11 -11
  10. package/dist/components/search-drawer/filters/unsplash.d.ts +4 -4
  11. package/dist/components/search-drawer/filters/unsplash.d.ts.map +1 -1
  12. package/dist/components/search-drawer/filters/unsplash.js +5 -5
  13. package/dist/components/search-drawer/index.d.ts +2 -2
  14. package/dist/components/search-drawer/index.d.ts.map +1 -1
  15. package/dist/components/search-drawer/index.js +56 -50
  16. package/dist/components/search-drawer/media/image.d.ts +2 -2
  17. package/dist/components/search-drawer/media/image.d.ts.map +1 -1
  18. package/dist/components/search-drawer/media/image.js +2 -2
  19. package/dist/components/search-drawer/media/video.d.ts +2 -2
  20. package/dist/components/search-drawer/media/video.d.ts.map +1 -1
  21. package/dist/components/search-drawer/media/video.js +5 -3
  22. package/dist/components/search-drawer/style.css +1 -1
  23. package/dist/endpoints/handler/Pexels.d.ts.map +1 -1
  24. package/dist/endpoints/handler/Pexels.js +7 -21
  25. package/dist/endpoints/handler/Pixabay.d.ts.map +1 -1
  26. package/dist/endpoints/handler/Pixabay.js +9 -22
  27. package/dist/endpoints/handler/Provider.d.ts +3 -3
  28. package/dist/endpoints/handler/Provider.d.ts.map +1 -1
  29. package/dist/endpoints/handler/Provider.js +11 -11
  30. package/dist/endpoints/handler/Unsplash.d.ts.map +1 -1
  31. package/dist/endpoints/handler/Unsplash.js +2 -6
  32. package/dist/endpoints/index.d.ts.map +1 -1
  33. package/dist/endpoints/index.js +42 -75
  34. package/dist/index.d.ts.map +1 -1
  35. package/dist/index.js +18 -19
  36. package/dist/lib/cache.d.ts.map +1 -1
  37. package/dist/lib/cache.js +12 -9
  38. package/dist/types.d.ts +101 -100
  39. package/dist/types.d.ts.map +1 -1
  40. package/dist/utils/fetchCache.d.ts.map +1 -1
  41. package/dist/utils/fetchCache.js +4 -4
  42. package/dist/utils/getProviders.d.ts +1 -1
  43. package/dist/utils/getProviders.d.ts.map +1 -1
  44. package/dist/utils/getProviders.js +6 -6
  45. package/dist/utils/resolveProvider.d.ts +1 -4
  46. package/dist/utils/resolveProvider.d.ts.map +1 -1
  47. package/package.json +5 -5
@@ -1,6 +1,6 @@
1
1
  'use client';
2
- import React, { useCallback, useEffect, useState } from 'react';
3
- import { Pagination, SearchFilter, Select, toast } from '@payloadcms/ui';
2
+ import React, { Fragment, useCallback, useEffect, useState } from 'react';
3
+ import { ListSearchFilter, Pagination, Select, toast } from '@payloadcms/ui';
4
4
  import { MediaOptions } from '../../types.js';
5
5
  import { fetchCache } from '../../utils/fetchCache.js';
6
6
  import { PexelsFilters } from './filters/pexels.js';
@@ -12,16 +12,17 @@ import './style.css';
12
12
  const baseClass = 'search-media';
13
13
  export const SearchDrawer = (props)=>{
14
14
  const { serverURL, api, onSelect } = props;
15
- const [selectedProvider, setSelectedProvider] = useState(null);
15
+ const [provider, setProvider] = useState(null);
16
16
  const [options, setOptions] = useState([]);
17
- const [mediaType, setMediaType] = useState('image');
18
17
  const [media, setMedia] = useState(null);
18
+ const [mediaType, setMediaType] = useState('image');
19
19
  const [filters, setFilters] = useState(null);
20
20
  const [currentPage, setCurrentPage] = useState(null);
21
21
  const [totalPages, setTotalPages] = useState(null);
22
22
  const [loading, setLoading] = useState(true);
23
23
  const [value, setValue] = useState('');
24
- const defaultError = useCallback(()=>{
24
+ const mediaOptions = MediaOptions.filter((option)=>filters?.provider === 'unsplash' ? option.value === 'image' : true);
25
+ const error = useCallback(()=>{
25
26
  toast.error('Something went wrong.');
26
27
  }, []);
27
28
  const resetMedia = useCallback(()=>{
@@ -51,17 +52,17 @@ export const SearchDrawer = (props)=>{
51
52
  provider: initial.value,
52
53
  options: {}
53
54
  });
54
- setSelectedProvider(initial);
55
+ setProvider(initial);
55
56
  } catch {
56
57
  setLoading(false);
57
- defaultError();
58
+ error();
58
59
  }
59
60
  }, [
60
61
  serverURL,
61
62
  api,
62
- defaultError
63
+ error
63
64
  ]);
64
- const buildFeatured = useCallback(()=>{
65
+ const buildFeatures = useCallback(()=>{
65
66
  if (!filters || !mediaType) return '';
66
67
  const params = new URLSearchParams();
67
68
  switch(filters.provider){
@@ -99,11 +100,11 @@ export const SearchDrawer = (props)=>{
99
100
  filters,
100
101
  mediaType
101
102
  ]);
102
- const getFeatured = useCallback(async ()=>{
103
- if (!selectedProvider || !filters || !mediaType) return;
103
+ const getFeatures = useCallback(async ()=>{
104
+ if (!provider || !filters || !mediaType) return;
104
105
  try {
105
106
  setLoading(true);
106
- const json = await fetchCache(`${serverURL}${api}/providers/${selectedProvider.value}/featured${buildFeatured()}`);
107
+ const json = await fetchCache(`${serverURL}${api}/providers/${provider.value}/featured${buildFeatures()}`);
107
108
  if (!json) return;
108
109
  if (json.error) {
109
110
  toast.error(json.error);
@@ -111,18 +112,18 @@ export const SearchDrawer = (props)=>{
111
112
  }
112
113
  setMedia(json.data.images);
113
114
  } catch {
114
- defaultError();
115
+ error();
115
116
  } finally{
116
117
  setLoading(false);
117
118
  }
118
119
  }, [
119
120
  serverURL,
120
121
  api,
121
- selectedProvider,
122
+ provider,
122
123
  filters,
123
- buildFeatured,
124
+ buildFeatures,
124
125
  mediaType,
125
- defaultError
126
+ error
126
127
  ]);
127
128
  const buildQuery = useCallback((page = 1)=>{
128
129
  if (!filters || !mediaType) return '';
@@ -167,38 +168,39 @@ export const SearchDrawer = (props)=>{
167
168
  const getMedia = useCallback(async (page = 1)=>{
168
169
  try {
169
170
  setLoading(true);
170
- const json = await fetchCache(`${serverURL}${api}/providers/${selectedProvider?.value}/search?${buildQuery(page)}`);
171
+ const json = await fetchCache(`${serverURL}${api}/providers/${provider?.value}/search?${buildQuery(page)}`);
171
172
  if (json.error) return toast.error(json.error);
172
173
  setMedia(json.data.images);
173
174
  setTotalPages(json.data.totalPages);
174
175
  setCurrentPage(page);
175
176
  } catch {
176
- defaultError();
177
+ error();
177
178
  } finally{
178
179
  setLoading(false);
179
180
  }
180
181
  }, [
181
182
  serverURL,
182
183
  api,
183
- selectedProvider?.value,
184
- defaultError,
184
+ provider?.value,
185
+ error,
185
186
  buildQuery
186
187
  ]);
187
188
  const selectMedia = async (url, download)=>{
188
189
  onSelect(url);
189
190
  if (!download) return;
190
191
  try {
191
- await fetch(`${serverURL}${api}/providers/${selectedProvider?.value}/track-download?url=${encodeURIComponent(download)}`);
192
+ await fetch(`${serverURL}${api}/providers/${provider?.value}/track-download?url=${encodeURIComponent(download)}`);
192
193
  } catch {
193
194
  return null;
194
195
  }
195
196
  };
196
- const selectFilter = useCallback((select)=>{
197
+ const selectFilter = useCallback((value)=>{
198
+ const select = value;
197
199
  setFilters({
198
200
  provider: select.value,
199
201
  options: {}
200
202
  });
201
- setSelectedProvider(select);
203
+ setProvider(select);
202
204
  if (select.value === 'unsplash') {
203
205
  setMediaType('image');
204
206
  }
@@ -206,50 +208,64 @@ export const SearchDrawer = (props)=>{
206
208
  }, [
207
209
  resetMedia
208
210
  ]);
211
+ const selectType = useCallback((option)=>{
212
+ const value = option?.value;
213
+ setMediaType(value);
214
+ resetMedia();
215
+ }, [
216
+ resetMedia
217
+ ]);
209
218
  const changeFilters = useCallback((search)=>{
210
219
  setValue(search);
211
220
  resetMedia();
212
221
  }, [
213
222
  resetMedia
214
223
  ]);
224
+ const renderMedia = (data)=>/*#__PURE__*/ React.createElement(Fragment, {
225
+ key: data.id
226
+ }, mediaType === 'video' ? /*#__PURE__*/ React.createElement(VideoCard, {
227
+ baseClass: baseClass,
228
+ data: data,
229
+ onSelect: selectMedia
230
+ }) : /*#__PURE__*/ React.createElement(ImageCard, {
231
+ baseClass: baseClass,
232
+ data: data,
233
+ onSelect: selectMedia
234
+ }));
215
235
  useEffect(()=>{
216
236
  void getOptions();
217
237
  }, [
218
238
  getOptions
219
239
  ]);
220
240
  useEffect(()=>{
221
- if (!selectedProvider?.value || !filters || !mediaType) return;
241
+ if (!provider?.value || !filters || !mediaType) return;
222
242
  if (value.trim().length > 0) {
223
243
  void getMedia(1);
224
244
  } else {
225
- void getFeatured();
245
+ void getFeatures();
226
246
  }
227
247
  }, [
228
- selectedProvider?.value,
248
+ provider?.value,
229
249
  filters,
230
250
  value,
231
251
  mediaType,
232
252
  getMedia,
233
- getFeatured
253
+ getFeatures
234
254
  ]);
235
255
  return /*#__PURE__*/ React.createElement("div", {
236
256
  className: baseClass
237
257
  }, /*#__PURE__*/ React.createElement("div", {
238
258
  className: `${baseClass}__fields`
239
- }, /*#__PURE__*/ React.createElement(SearchFilter, {
240
- handleChange: changeFilters,
241
- label: ""
259
+ }, /*#__PURE__*/ React.createElement(ListSearchFilter, {
260
+ label: "Search media",
261
+ onSearchChange: changeFilters
242
262
  }), /*#__PURE__*/ React.createElement(Select, {
243
263
  className: `${baseClass}__mediaToggle`,
244
264
  isClearable: false,
245
265
  isCreatable: false,
246
266
  isSearchable: false,
247
- onChange: (opt)=>{
248
- const val = opt?.value;
249
- setMediaType(val);
250
- resetMedia();
251
- },
252
- options: MediaOptions.filter((option)=>filters?.provider === 'unsplash' ? option.value === 'image' : true),
267
+ onChange: selectType,
268
+ options: mediaOptions,
253
269
  value: {
254
270
  label: mediaType === 'image' ? 'Images' : 'Videos',
255
271
  value: mediaType
@@ -259,9 +275,9 @@ export const SearchDrawer = (props)=>{
259
275
  isClearable: false,
260
276
  isCreatable: false,
261
277
  isSearchable: false,
262
- onChange: (value)=>selectFilter(value),
278
+ onChange: selectFilter,
263
279
  options: options,
264
- value: selectedProvider
280
+ value: provider
265
281
  })), filters?.provider === 'pexels' && /*#__PURE__*/ React.createElement(PexelsFilters, {
266
282
  baseClass: baseClass,
267
283
  filters: filters,
@@ -282,24 +298,14 @@ export const SearchDrawer = (props)=>{
282
298
  className: `${baseClass}__noResults`
283
299
  }, "No media found"), !loading && media && media?.length > 0 && /*#__PURE__*/ React.createElement(React.Fragment, null, /*#__PURE__*/ React.createElement("div", {
284
300
  className: `${baseClass}__results`
285
- }, media.map((data)=>/*#__PURE__*/ React.createElement(React.Fragment, {
286
- key: data.id
287
- }, mediaType === 'video' ? /*#__PURE__*/ React.createElement(VideoCard, {
288
- baseClass: baseClass,
289
- data: data,
290
- onSelect: selectMedia
291
- }) : /*#__PURE__*/ React.createElement(ImageCard, {
292
- baseClass: baseClass,
293
- data: data,
294
- onSelect: selectMedia
295
- })))), currentPage && totalPages && totalPages > 1 && /*#__PURE__*/ React.createElement("div", {
301
+ }, media.map(renderMedia)), currentPage && totalPages && totalPages > 1 && /*#__PURE__*/ React.createElement("div", {
296
302
  className: `${baseClass}__pagination`
297
303
  }, /*#__PURE__*/ React.createElement(Pagination, {
298
304
  hasNextPage: currentPage < totalPages,
299
305
  hasPrevPage: currentPage > 1,
300
306
  nextPage: currentPage < totalPages ? currentPage + 1 : undefined,
301
307
  numberOfNeighbors: 3,
302
- onChange: (page)=>getMedia(page),
308
+ onChange: getMedia,
303
309
  page: currentPage,
304
310
  prevPage: currentPage > 1 ? currentPage - 1 : undefined,
305
311
  totalPages: totalPages
@@ -1,10 +1,10 @@
1
1
  import React from 'react';
2
2
  import { type ProviderResult } from '../../../types.js';
3
- type ImageCardProps = {
3
+ type Props = {
4
4
  data: ProviderResult;
5
5
  baseClass: string;
6
6
  onSelect: (url: string, download?: string) => void;
7
7
  };
8
- export declare const ImageCard: ({ data, baseClass, onSelect }: ImageCardProps) => React.JSX.Element;
8
+ export declare const ImageCard: ({ data, baseClass, onSelect }: Props) => React.JSX.Element;
9
9
  export {};
10
10
  //# sourceMappingURL=image.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"image.d.ts","sourceRoot":"","sources":["../../../../src/components/search-drawer/media/image.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAmB,MAAM,OAAO,CAAA;AAGvC,OAAO,EAAE,KAAK,cAAc,EAAE,MAAM,mBAAmB,CAAA;AAGvD,KAAK,cAAc,GAAG;IACpB,IAAI,EAAE,cAAc,CAAA;IACpB,SAAS,EAAE,MAAM,CAAA;IACjB,QAAQ,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,KAAK,IAAI,CAAA;CACnD,CAAA;AAED,eAAO,MAAM,SAAS,kCAAmC,cAAc,sBA+DtE,CAAA"}
1
+ {"version":3,"file":"image.d.ts","sourceRoot":"","sources":["../../../../src/components/search-drawer/media/image.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAmB,MAAM,OAAO,CAAA;AAGvC,OAAO,EAAE,KAAK,cAAc,EAAE,MAAM,mBAAmB,CAAA;AAGvD,KAAK,KAAK,GAAG;IACX,IAAI,EAAE,cAAc,CAAA;IACpB,SAAS,EAAE,MAAM,CAAA;IACjB,QAAQ,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,KAAK,IAAI,CAAA;CACnD,CAAA;AAED,eAAO,MAAM,SAAS,kCAAmC,KAAK,sBAqE7D,CAAA"}
@@ -4,8 +4,7 @@ import { HeartIcon } from './heart.js';
4
4
  export const ImageCard = ({ data, baseClass, onSelect })=>{
5
5
  const [show, setShow] = useState(false);
6
6
  return /*#__PURE__*/ React.createElement("div", {
7
- className: `${baseClass}__card`,
8
- key: data.id
7
+ className: `${baseClass}__card`
9
8
  }, /*#__PURE__*/ React.createElement("button", {
10
9
  className: `${baseClass}__button`,
11
10
  onClick: ()=>onSelect(data.urls.original, data.urls?.downloadLocation),
@@ -21,6 +20,7 @@ export const ImageCard = ({ data, baseClass, onSelect })=>{
21
20
  })), /*#__PURE__*/ React.createElement("div", {
22
21
  className: `${baseClass}__topOverlay`
23
22
  }, data.likes !== undefined && /*#__PURE__*/ React.createElement("button", {
23
+ "aria-label": `${data.likes} likes`,
24
24
  className: `${baseClass}__likes`,
25
25
  onBlur: ()=>setShow(false),
26
26
  onFocus: ()=>setShow(true),
@@ -1,10 +1,10 @@
1
1
  import React from 'react';
2
2
  import { type ProviderResult } from '../../../types.js';
3
- type VideoCardProps = {
3
+ type Props = {
4
4
  data: ProviderResult;
5
5
  baseClass: string;
6
6
  onSelect: (url: string, download?: string) => void;
7
7
  };
8
- export declare const VideoCard: ({ data, baseClass, onSelect }: VideoCardProps) => React.JSX.Element;
8
+ export declare const VideoCard: ({ data, baseClass, onSelect }: Props) => React.JSX.Element;
9
9
  export {};
10
10
  //# sourceMappingURL=video.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"video.d.ts","sourceRoot":"","sources":["../../../../src/components/search-drawer/media/video.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAmB,MAAM,OAAO,CAAA;AAGvC,OAAO,EAAE,KAAK,cAAc,EAAE,MAAM,mBAAmB,CAAA;AAIvD,KAAK,cAAc,GAAG;IACpB,IAAI,EAAE,cAAc,CAAA;IACpB,SAAS,EAAE,MAAM,CAAA;IACjB,QAAQ,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,KAAK,IAAI,CAAA;CACnD,CAAA;AAED,eAAO,MAAM,SAAS,kCAAmC,cAAc,sBA0EtE,CAAA"}
1
+ {"version":3,"file":"video.d.ts","sourceRoot":"","sources":["../../../../src/components/search-drawer/media/video.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAmB,MAAM,OAAO,CAAA;AAGvC,OAAO,EAAE,KAAK,cAAc,EAAE,MAAM,mBAAmB,CAAA;AAIvD,KAAK,KAAK,GAAG;IACX,IAAI,EAAE,cAAc,CAAA;IACpB,SAAS,EAAE,MAAM,CAAA;IACjB,QAAQ,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,KAAK,IAAI,CAAA;CACnD,CAAA;AAED,eAAO,MAAM,SAAS,kCAAmC,KAAK,sBAkF7D,CAAA"}
@@ -5,8 +5,7 @@ import { PlusIcon } from './plus.js';
5
5
  export const VideoCard = ({ data, baseClass, onSelect })=>{
6
6
  const [show, setShow] = useState(false);
7
7
  return /*#__PURE__*/ React.createElement("div", {
8
- className: `${baseClass}__video`,
9
- key: data.id
8
+ className: `${baseClass}__video`
10
9
  }, /*#__PURE__*/ React.createElement("video", {
11
10
  controls: true,
12
11
  poster: data.urls.view,
@@ -37,6 +36,7 @@ export const VideoCard = ({ data, baseClass, onSelect })=>{
37
36
  }), data.attribution.name), /*#__PURE__*/ React.createElement("div", {
38
37
  className: `${baseClass}__actions`
39
38
  }, data.likes !== undefined && /*#__PURE__*/ React.createElement("button", {
39
+ "aria-label": `${data.likes} likes`,
40
40
  className: `${baseClass}__likes`,
41
41
  onBlur: ()=>setShow(false),
42
42
  onFocus: ()=>setShow(true),
@@ -48,10 +48,12 @@ export const VideoCard = ({ data, baseClass, onSelect })=>{
48
48
  position: "bottom",
49
49
  show: show
50
50
  }, data.likes, " likes")), /*#__PURE__*/ React.createElement("button", {
51
+ "aria-label": "Select video",
51
52
  className: `${baseClass}__add`,
52
- onClick: ()=>onSelect?.(data.urls.original, data.urls.download),
53
+ onClick: ()=>onSelect(data.urls.original, data.urls.download),
53
54
  type: "button"
54
55
  }, /*#__PURE__*/ React.createElement(PlusIcon, null)), /*#__PURE__*/ React.createElement("a", {
56
+ "aria-label": "Open video download",
55
57
  className: `${baseClass}__download`,
56
58
  href: data.urls.download,
57
59
  rel: "noopener noreferrer",
@@ -1 +1 @@
1
- .drawer__content-children{display:flex;flex-flow:column nowrap}.search-media{width:100%;display:flex;flex-flow:column nowrap;flex:1;padding:2rem 0}.search-media__fields{display:flex;gap:1.5rem}.search-media__fields .search-filter{flex:1}.search-media__fields .search-filter__input{height:100%;padding:0 1rem}.search-media__fields .rs__indicators{margin-left:.5rem}.search-media__filters{display:flex;margin-top:15px;gap:16px}.search-media__filters .react-select{min-width:130px}.search-media__results{margin-top:3rem;column-gap:16px;column-count:5}.search-media__card{break-inside:avoid;margin-bottom:16px}.search-media__video{break-inside:avoid;margin-bottom:16px}.search-media__results>div{width:100%}.search-media__results img{max-width:100%;width:100%}.search-media__pagination{margin-top:auto;padding-top:2rem;display:flex;justify-content:center}.search-media__loading,.search-media__noResults{display:flex;justify-content:center;align-items:center;flex:1}.search-media__card{position:relative;display:block;overflow:hidden}.search-media__video{position:relative;display:block;overflow:hidden}.search-media__card::after{content:"";position:absolute;inset:0;background:rgba(0,0,0,.45);opacity:0;transition:opacity .2s ease;pointer-events:none}.search-media__card:hover::after{opacity:1}.search-media__button{appearance:none;border:none;background-color:transparent;display:block;margin:0;padding:0;cursor:pointer;width:100%}.search-media__button img{display:block;width:100%;height:auto}.search-media__button svg{color:#fff}.search-media__bottomOverlay,.search-media__topOverlay{position:absolute;z-index:1;display:flex;opacity:0;transition:opacity .4s ease;max-width:calc(100% - 20px - 1rem)}.search-media__card .search-media__topOverlay{right:1rem;top:.8rem}.search-media__card .search-media__bottomOverlay{left:1rem;bottom:.8rem}.search-media__card:hover .search-media__bottomOverlay,.search-media__card:hover .search-media__topOverlay{opacity:1;pointer-events:auto}.search-media__video .search-media__topOverlay{top:.8rem;left:1rem;right:1rem;display:flex;align-items:center;justify-content:space-between;gap:1rem}.search-media__video:hover .search-media__bottomOverlay,.search-media__video:hover .search-media__topOverlay{opacity:1;pointer-events:auto}.search-media__actions{display:flex;align-items:stretch;position:relative}.search-media__likes{cursor:pointer;background:#fff;border-radius:6px;border:0;margin-right:10px;padding:7px;font-size:1em;line-height:1}.search-media__likes svg{width:14px}.search-media__likes:hover{background:rgb(255 255 255 / 80%);transition:background-color .4s ease}.search-media__likes .tooltip{left:14px}.search-media__add{cursor:pointer;background:#fff;border-radius:6px;border:0;width:28px;margin-right:10px;padding:2px;font-size:1em;line-height:1}.search-media__add svg{pointer-events:none}.search-media__add:hover{background:rgb(255 255 255 / 80%);transition:background-color .4s ease}.search-media__download{background:#fff;border-radius:6px;padding:4px;font-size:1em;line-height:1;width:28px;text-align:center}.search-media__download svg{pointer-events:none}a.search-media__download:hover{background:rgb(255 255 255 / 80%);transition:background-color .4s ease}.search-media__add,.search-media__download,.search-media__likes{display:flex;align-items:center;justify-content:center}img.search-media__avatar{max-width:24px;max-height:24px;margin-right:10px;border-radius:100%}.search-media__avatarFallback{width:24px;height:24px;margin-right:10px;border-radius:100%;background:rgba(255 255 255 / 25%)}.search-media__attribution{display:flex;align-items:center;white-space:nowrap;text-overflow:ellipsis;color:#fff;font-size:1rem;font-weight:600;line-height:1;text-decoration:none;overflow:hidden}.search-media__attribution:hover{text-decoration:underline}.search-media__image{border-radius:4px;object-fit:cover;width:100%}.search-media__options{min-width:140px}.search-media__provider{display:flex;justify-content:center;padding-top:3rem;margin-top:auto;margin-bottom:30px}@media (max-width:1600px){.search-media__results{column-count:5}}@media (max-width:1400px){.search-media__results{column-count:4}}@media (max-width:1200px){.search-media__results{column-count:3}}@media (max-width:900px){.search-media__results{column-count:2}.search-media__filters{display:grid}}@media (max-width:600px){.search-media__results{column-count:1}.search-media__filters{display:grid}}
1
+ .drawer__content-children{display:flex;flex-flow:column nowrap}.search-media{display:flex;flex-flow:column nowrap;flex:1;width:100%;padding:2rem}.search-media__fields{display:flex;width:100%;align-items:stretch;gap:1.5rem}.search-media__fields .search-filter{flex:1 1 0;min-width:0}.search-media__fields .search-filter__input{width:100%;height:100%;box-sizing:border-box;padding:0 1rem}.search-media__options{min-width:140px}.search-media__fields .search-media__mediaToggle,.search-media__fields .search-media__options{flex:0 0 160px;min-width:0}.search-media__fields .rs__indicators{margin-left:.5rem}.search-media__filters{display:flex;margin-top:15px;gap:16px}.search-media__filters .react-select{min-width:130px}.search-media__results{margin-top:3rem;column-gap:16px;column-count:3}.search-media__results>div{width:100%}.search-media__results img{max-width:100%;width:100%}.search-media__card,.search-media__video{position:relative;display:block;overflow:hidden;break-inside:avoid;margin-bottom:16px}.search-media__image{width:100%;border-radius:4px;object-fit:cover}.search-media__card::after{content:"";position:absolute;inset:0;background:rgba(0,0,0,.45);opacity:0;transition:opacity .2s ease;pointer-events:none}.search-media__card:hover::after{opacity:1}.search-media__bottomOverlay,.search-media__topOverlay{position:absolute;z-index:1;display:flex;opacity:0;transition:opacity .4s ease;max-width:calc(100% - 20px - 1rem)}.search-media__card .search-media__topOverlay{right:1rem;top:.8rem}.search-media__card .search-media__bottomOverlay{left:1rem;bottom:.8rem}.search-media__video .search-media__topOverlay{top:.8rem;left:1rem;right:1rem;display:flex;align-items:center;justify-content:space-between;gap:1rem}.search-media__card:hover .search-media__bottomOverlay,.search-media__card:hover .search-media__topOverlay,.search-media__video:hover .search-media__bottomOverlay,.search-media__video:hover .search-media__topOverlay{opacity:1;pointer-events:auto}.search-media__button{appearance:none;display:block;width:100%;margin:0;padding:0;border:none;background-color:transparent;cursor:pointer}.search-media__button img{display:block;width:100%;height:auto}.search-media__button svg{color:#fff}.search-media__actions{display:flex;align-items:stretch;position:relative}.search-media__add,.search-media__download,.search-media__likes{display:flex;flex:0 0 28px;align-items:center;justify-content:center;width:28px;height:28px;box-sizing:border-box;background:#fff;border-radius:6px;font-size:1em;line-height:1}.search-media__add,.search-media__likes{cursor:pointer;border:0;margin-right:10px}.search-media__likes{padding:7px}.search-media__likes svg{width:14px;height:14px}.search-media__likes .tooltip{left:14px}.search-media__add{padding:2px}.search-media__download{padding:4px;text-align:center}.search-media__add svg,.search-media__download svg{pointer-events:none}.search-media__add:hover,.search-media__likes:hover,a.search-media__download:hover{background:rgb(255 255 255 / 80%);transition:background-color .4s ease}img.search-media__avatar{max-width:24px;max-height:24px;margin-right:10px;border-radius:100%}.search-media__avatarFallback{width:24px;height:24px;margin-right:10px;border-radius:100%;background:rgba(255 255 255 / 25%)}.search-media__attribution{display:flex;align-items:center;white-space:nowrap;text-overflow:ellipsis;color:#fff;font-size:1rem;font-weight:600;line-height:1;text-decoration:none;overflow:hidden}.search-media__attribution:hover{text-decoration:underline}.search-media__pagination{display:flex;justify-content:center;margin-top:auto;padding-top:2rem}.search-media__loading,.search-media__noResults{display:flex;justify-content:center;align-items:center;flex:1}.search-media__provider{display:flex;justify-content:center;padding-top:3rem;margin-top:auto;margin-bottom:30px}@media (max-width:1200px){.search-media__results{column-count:2}}@media (max-width:900px){.search-media__results{column-count:1}.search-media__filters{display:grid}}@media (max-width:767px){.search-media__fields{flex-direction:column;gap:1rem}.search-media__fields .search-input{padding:.5rem 0}.search-media__fields .search-filter,.search-media__fields .search-media__mediaToggle,.search-media__fields .search-media__options{flex:none;width:100%}}
@@ -1 +1 @@
1
- {"version":3,"file":"Pexels.d.ts","sourceRoot":"","sources":["../../../src/endpoints/handler/Pexels.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,aAAa,EAClB,KAAK,YAAY,EACjB,KAAK,WAAW,EAEhB,KAAK,cAAc,EACpB,MAAM,gBAAgB,CAAA;AACvB,OAAO,EAAE,QAAQ,EAAE,KAAK,QAAQ,EAAE,MAAM,eAAe,CAAA;AAEvD,qBAAa,MAAO,SAAQ,QAAQ;IAClC,YAAY,MAAM,EAAE,QAAQ,EAE3B;IAEQ,eAAe,IAAI,MAAM,CAEjC;IAEQ,eAAe,IAAI,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAEjD;IAEc,WAAW,CAAC,OAAO,CAAC,EAAE,aAAa,GAAG,OAAO,CAAC,OAAO,CAAC,CAsBpE;IAEc,SAAS,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,aAAa,GAAG,OAAO,CAAC,OAAO,CAAC,CAyC/F;IAED,kBAAkB,CAAC,IAAI,EAAE,WAAW,EAAE,GAAG,cAAc,EAAE,CAuBxD;IAEQ,aAAa,CAAC,IAAI,EAAE,YAAY,EAAE,GAAG,cAAc,EAAE,CAiB7D;CACF"}
1
+ {"version":3,"file":"Pexels.d.ts","sourceRoot":"","sources":["../../../src/endpoints/handler/Pexels.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,aAAa,EAClB,KAAK,YAAY,EACjB,KAAK,WAAW,EAEhB,KAAK,cAAc,EACpB,MAAM,gBAAgB,CAAA;AACvB,OAAO,EAAE,QAAQ,EAAE,KAAK,QAAQ,EAAE,MAAM,eAAe,CAAA;AAEvD,qBAAa,MAAO,SAAQ,QAAQ;IAClC,YAAY,MAAM,EAAE,QAAQ,EAE3B;IAEQ,eAAe,IAAI,MAAM,CAEjC;IAEQ,eAAe,IAAI,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAEjD;IAEc,WAAW,CAAC,OAAO,CAAC,EAAE,aAAa,GAAG,OAAO,CAAC,OAAO,CAAC,CAsBpE;IAEc,SAAS,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,aAAa,GAAG,OAAO,CAAC,OAAO,CAAC,CAyB/F;IAED,kBAAkB,CAAC,IAAI,EAAE,WAAW,EAAE,GAAG,cAAc,EAAE,CAuBxD;IAEQ,aAAa,CAAC,IAAI,EAAE,YAAY,EAAE,GAAG,cAAc,EAAE,CAiB7D;CACF"}
@@ -8,7 +8,7 @@ export class Pexels extends Provider {
8
8
  }
9
9
  getFetchHeaders() {
10
10
  return {
11
- Authorization: `${this.getApiKey()}`
11
+ Authorization: this.getApiKey()
12
12
  };
13
13
  }
14
14
  async getFeatured(filters) {
@@ -31,41 +31,27 @@ export class Pexels extends Provider {
31
31
  };
32
32
  }
33
33
  async getSearch(query, page, filters) {
34
- if (filters?.media === 'video') {
35
- const params = new URLSearchParams({
36
- query: query || 'featured',
37
- page: String(page),
38
- per_page: String(this.getFetchLimit())
39
- });
40
- if (filters?.size) params.set('size', filters.size);
41
- if (filters?.orientation) params.set('orientation', filters.orientation);
42
- const data = await this.fetch('GET', `/videos/search?${params.toString()}`);
43
- const totalResults = data.total_results;
44
- return {
45
- images: this.formatVideoResults(data.videos),
46
- totalImages: totalResults,
47
- totalPages: Math.min(Math.ceil(totalResults / this.getFetchLimit()), 100)
48
- };
49
- }
34
+ const isVideo = filters?.media === 'video';
50
35
  const params = new URLSearchParams({
51
36
  query: query || 'featured',
52
37
  page: String(page),
53
38
  per_page: String(this.getFetchLimit())
54
39
  });
55
- if (filters?.color) params.set('color', filters.color);
40
+ if (!isVideo && filters?.color) params.set('color', filters.color);
56
41
  if (filters?.size) params.set('size', filters.size);
57
42
  if (filters?.orientation) params.set('orientation', filters.orientation);
58
- const data = await this.fetch('GET', `/v1/search?${params.toString()}`);
43
+ const endpoint = isVideo ? '/videos/search' : '/v1/search';
44
+ const data = await this.fetch('GET', `${endpoint}?${params.toString()}`);
59
45
  const totalResults = data.total_results;
60
46
  return {
61
- images: this.formatResults(data.photos),
47
+ images: isVideo ? this.formatVideoResults(data.videos) : this.formatResults(data.photos),
62
48
  totalImages: totalResults,
63
49
  totalPages: Math.min(Math.ceil(totalResults / this.getFetchLimit()), 100)
64
50
  };
65
51
  }
66
52
  formatVideoResults(data) {
67
53
  return data.map((video)=>{
68
- const file = video.video_files.find((f)=>f.quality === 'hd' && f.file_type === 'video/mp4') ?? video.video_files.find((f)=>f.file_type === 'video/mp4');
54
+ const file = video.video_files.find((file)=>file.quality === 'hd' && file.file_type === 'video/mp4') ?? video.video_files.find((file)=>file.file_type === 'video/mp4');
69
55
  return {
70
56
  id: String(video.id),
71
57
  alt: video.url || '',
@@ -1 +1 @@
1
- {"version":3,"file":"Pixabay.d.ts","sourceRoot":"","sources":["../../../src/endpoints/handler/Pixabay.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,cAAc,EACnB,KAAK,aAAa,EAClB,KAAK,YAAY,EAEjB,KAAK,cAAc,EACpB,MAAM,gBAAgB,CAAA;AACvB,OAAO,EAAE,QAAQ,EAAE,KAAK,QAAQ,EAAE,MAAM,eAAe,CAAA;AAEvD,qBAAa,OAAQ,SAAQ,QAAQ;IACnC,YAAY,MAAM,EAAE,QAAQ,EAE3B;IAEQ,eAAe,IAAI,MAAM,CAEjC;IAEQ,eAAe,IAAI,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAEjD;IAEc,WAAW,CAAC,OAAO,CAAC,EAAE,cAAc,GAAG,OAAO,CAAC,OAAO,CAAC,CAkCrE;IAEc,SAAS,CACtB,KAAK,EAAE,MAAM,EACb,IAAI,EAAE,MAAM,EACZ,OAAO,CAAC,EAAE,cAAc,GACvB,OAAO,CAAC,OAAO,CAAC,CA6ClB;IAED,kBAAkB,CAAC,IAAI,EAAE,YAAY,EAAE,GAAG,cAAc,EAAE,CAwBzD;IAEQ,aAAa,CAAC,IAAI,EAAE,aAAa,EAAE,GAAG,cAAc,EAAE,CAmB9D;CACF"}
1
+ {"version":3,"file":"Pixabay.d.ts","sourceRoot":"","sources":["../../../src/endpoints/handler/Pixabay.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,cAAc,EACnB,KAAK,aAAa,EAClB,KAAK,YAAY,EAEjB,KAAK,cAAc,EACpB,MAAM,gBAAgB,CAAA;AACvB,OAAO,EAAE,QAAQ,EAAE,KAAK,QAAQ,EAAE,MAAM,eAAe,CAAA;AAEvD,qBAAa,OAAQ,SAAQ,QAAQ;IACnC,YAAY,MAAM,EAAE,QAAQ,EAE3B;IAEQ,eAAe,IAAI,MAAM,CAEjC;IAEQ,eAAe,IAAI,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAEjD;IAEc,WAAW,CAAC,OAAO,CAAC,EAAE,cAAc,GAAG,OAAO,CAAC,OAAO,CAAC,CAkCrE;IAEc,SAAS,CACtB,KAAK,EAAE,MAAM,EACb,IAAI,EAAE,MAAM,EACZ,OAAO,CAAC,EAAE,cAAc,GACvB,OAAO,CAAC,OAAO,CAAC,CA+BlB;IAED,kBAAkB,CAAC,IAAI,EAAE,YAAY,EAAE,GAAG,cAAc,EAAE,CAwBzD;IAEQ,aAAa,CAAC,IAAI,EAAE,aAAa,EAAE,GAAG,cAAc,EAAE,CAmB9D;CACF"}
@@ -29,23 +29,7 @@ export class Pixabay extends Provider {
29
29
  };
30
30
  }
31
31
  async getSearch(query, page, filters) {
32
- if (filters?.media === 'video') {
33
- const params = new URLSearchParams({
34
- key: this.getApiKey(),
35
- q: query || '',
36
- page: String(page),
37
- per_page: String(this.getFetchLimit())
38
- });
39
- if (filters?.category) params.set('category', filters.category);
40
- if (filters?.order) params.set('order', filters.order);
41
- const data = await this.fetch('GET', `/api/videos?${params.toString()}`);
42
- const totalHits = data.totalHits;
43
- return {
44
- images: this.formatVideoResults(data.hits),
45
- totalImages: totalHits,
46
- totalPages: Math.min(Math.ceil(totalHits / this.getFetchLimit()), 100)
47
- };
48
- }
32
+ const isVideo = filters?.media === 'video';
49
33
  const params = new URLSearchParams({
50
34
  key: this.getApiKey(),
51
35
  q: query || '',
@@ -53,14 +37,17 @@ export class Pixabay extends Provider {
53
37
  per_page: String(this.getFetchLimit())
54
38
  });
55
39
  if (filters?.category) params.set('category', filters.category);
56
- if (filters?.image_type) params.set('image_type', filters.image_type);
57
- if (filters?.colors) params.set('colors', filters.colors);
58
- if (filters?.orientation) params.set('orientation', filters.orientation);
59
40
  if (filters?.order) params.set('order', filters.order);
60
- const data = await this.fetch('GET', `/api?${params.toString()}`);
41
+ if (!isVideo) {
42
+ if (filters?.image_type) params.set('image_type', filters.image_type);
43
+ if (filters?.colors) params.set('colors', filters.colors);
44
+ if (filters?.orientation) params.set('orientation', filters.orientation);
45
+ }
46
+ const endpoint = isVideo ? '/api/videos' : '/api';
47
+ const data = await this.fetch('GET', `${endpoint}?${params.toString()}`);
61
48
  const totalHits = data.totalHits;
62
49
  return {
63
- images: this.formatResults(data.hits),
50
+ images: isVideo ? this.formatVideoResults(data.hits) : this.formatResults(data.hits),
64
51
  totalImages: totalHits,
65
52
  totalPages: Math.min(Math.ceil(totalHits / this.getFetchLimit()), 100)
66
53
  };
@@ -1,14 +1,14 @@
1
1
  import { type ProviderResult } from '../../types.js';
2
2
  export type Resolver = () => string | undefined;
3
3
  export declare class Provider {
4
- protected apiKey?: Resolver;
4
+ protected apiKey?: Resolver | undefined;
5
5
  key: string;
6
6
  name: string;
7
7
  url: string;
8
- constructor(key: string, name: string, url: string, apiKey?: Resolver);
9
- fetch(method: string, urlPath: string, data?: object): Promise<unknown>;
8
+ constructor(key: string, name: string, url: string, apiKey?: Resolver | undefined);
10
9
  get isConfigured(): boolean;
11
10
  protected getApiKey(): string;
11
+ fetch(method: string, urlPath: string, data?: object): Promise<unknown>;
12
12
  getFetchBaseUrl(): string;
13
13
  getFetchHeaders(): Record<string, string>;
14
14
  getFetchLimit(): number;
@@ -1 +1 @@
1
- {"version":3,"file":"Provider.d.ts","sourceRoot":"","sources":["../../../src/endpoints/handler/Provider.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,cAAc,EAAE,MAAM,gBAAgB,CAAA;AAEpD,MAAM,MAAM,QAAQ,GAAG,MAAM,MAAM,GAAG,SAAS,CAAA;AAE/C,qBAAa,QAAQ;IACnB,SAAS,CAAC,MAAM,CAAC,EAAE,QAAQ,CAAA;IAC3B,GAAG,EAAE,MAAM,CAAA;IACX,IAAI,EAAE,MAAM,CAAA;IACZ,GAAG,EAAE,MAAM,CAAA;IAEX,YAAY,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,QAAQ,EAKpE;IAEK,KAAK,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAQ5E;IAED,IAAI,YAAY,IAAI,OAAO,CAE1B;IAED,SAAS,CAAC,SAAS,IAAI,MAAM,CAQ5B;IAED,eAAe,IAAI,MAAM,CAExB;IAED,eAAe,IAAI,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAExC;IAED,aAAa,IAAI,MAAM,CAEtB;IAED,WAAW,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC,CAEhE;IAED,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAEzD;IAED,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAEhC;IAED,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,cAAc,EAAE,CAE7C;CACF"}
1
+ {"version":3,"file":"Provider.d.ts","sourceRoot":"","sources":["../../../src/endpoints/handler/Provider.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,cAAc,EAAE,MAAM,gBAAgB,CAAA;AAEpD,MAAM,MAAM,QAAQ,GAAG,MAAM,MAAM,GAAG,SAAS,CAAA;AAE/C,qBAAa,QAAQ;IASjB,SAAS,CAAC,MAAM,CAAC,EAAE,QAAQ;IAR7B,GAAG,EAAE,MAAM,CAAA;IACX,IAAI,EAAE,MAAM,CAAA;IACZ,GAAG,EAAE,MAAM,CAAA;IAEX,YACE,GAAG,EAAE,MAAM,EACX,IAAI,EAAE,MAAM,EACZ,GAAG,EAAE,MAAM,EACD,MAAM,CAAC,EAAE,QAAQ,YAAA,EAK5B;IAED,IAAI,YAAY,IAAI,OAAO,CAE1B;IAED,SAAS,CAAC,SAAS,IAAI,MAAM,CAQ5B;IAEK,KAAK,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAQ5E;IAED,eAAe,IAAI,MAAM,CAExB;IAED,eAAe,IAAI,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAExC;IAED,aAAa,IAAI,MAAM,CAEtB;IAED,WAAW,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC,CAEhE;IAED,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAEzD;IAED,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAEhC;IAED,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,cAAc,EAAE,CAE7C;CACF"}
@@ -4,20 +4,10 @@ export class Provider {
4
4
  name;
5
5
  url;
6
6
  constructor(key, name, url, apiKey){
7
+ this.apiKey = apiKey;
7
8
  this.key = key;
8
9
  this.name = name;
9
10
  this.url = url;
10
- this.apiKey = apiKey;
11
- }
12
- async fetch(method, urlPath, data) {
13
- const response = await fetch(new URL(urlPath, this.getFetchBaseUrl()), {
14
- method,
15
- headers: this.getFetchHeaders(),
16
- ...data && {
17
- body: JSON.stringify(data)
18
- }
19
- });
20
- return response.json();
21
11
  }
22
12
  get isConfigured() {
23
13
  return Boolean(this.apiKey?.());
@@ -29,6 +19,16 @@ export class Provider {
29
19
  }
30
20
  return key;
31
21
  }
22
+ async fetch(method, urlPath, data) {
23
+ const response = await fetch(new URL(urlPath, this.getFetchBaseUrl()), {
24
+ method,
25
+ headers: this.getFetchHeaders(),
26
+ ...data && {
27
+ body: JSON.stringify(data)
28
+ }
29
+ });
30
+ return response.json();
31
+ }
32
32
  getFetchBaseUrl() {
33
33
  return '';
34
34
  }
@@ -1 +1 @@
1
- {"version":3,"file":"Unsplash.d.ts","sourceRoot":"","sources":["../../../src/endpoints/handler/Unsplash.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,cAAc,EAAE,KAAK,eAAe,EAAE,KAAK,cAAc,EAAE,MAAM,gBAAgB,CAAA;AAC/F,OAAO,EAAE,QAAQ,EAAE,KAAK,QAAQ,EAAE,MAAM,eAAe,CAAA;AAIvD,qBAAa,QAAS,SAAQ,QAAQ;IACpC,YAAY,MAAM,EAAE,QAAQ,EAE3B;IAEQ,eAAe,IAAI,MAAM,CAEjC;IAEQ,eAAe,IAAI,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAEjD;IAEc,WAAW,CAAC,OAAO,CAAC,EAAE,eAAe,GAAG,OAAO,CAAC,OAAO,CAAC,CAkCtE;IAEc,SAAS,CACtB,KAAK,EAAE,MAAM,EACb,IAAI,EAAE,MAAM,EACZ,OAAO,CAAC,EAAE,eAAe,GACxB,OAAO,CAAC,OAAO,CAAC,CAiBlB;IAEQ,aAAa,CAAC,GAAG,EAAE,MAAM,QAIjC;IAEQ,aAAa,CAAC,IAAI,EAAE,cAAc,EAAE,GAAG,cAAc,EAAE,CAoB/D;CACF"}
1
+ {"version":3,"file":"Unsplash.d.ts","sourceRoot":"","sources":["../../../src/endpoints/handler/Unsplash.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,cAAc,EAAE,KAAK,eAAe,EAAE,KAAK,cAAc,EAAE,MAAM,gBAAgB,CAAA;AAC/F,OAAO,EAAE,QAAQ,EAAE,KAAK,QAAQ,EAAE,MAAM,eAAe,CAAA;AAIvD,qBAAa,QAAS,SAAQ,QAAQ;IACpC,YAAY,MAAM,EAAE,QAAQ,EAE3B;IAEQ,eAAe,IAAI,MAAM,CAEjC;IAEQ,eAAe,IAAI,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAEjD;IAEc,WAAW,CAAC,OAAO,CAAC,EAAE,eAAe,GAAG,OAAO,CAAC,OAAO,CAAC,CA6BtE;IAEc,SAAS,CACtB,KAAK,EAAE,MAAM,EACb,IAAI,EAAE,MAAM,EACZ,OAAO,CAAC,EAAE,eAAe,GACxB,OAAO,CAAC,OAAO,CAAC,CAqBlB;IAEQ,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAMxC;IAEQ,aAAa,CAAC,IAAI,EAAE,cAAc,EAAE,GAAG,cAAc,EAAE,CAoB/D;CACF"}
@@ -18,12 +18,8 @@ export class Unsplash extends Provider {
18
18
  per_page: String(this.getFetchLimit()),
19
19
  query: 'featured'
20
20
  });
21
- if (filters.color) {
22
- params.set('color', filters.color);
23
- }
24
- if (filters.orientation) {
25
- params.set('orientation', filters.orientation);
26
- }
21
+ if (filters?.color) params.set('color', filters.color);
22
+ if (filters?.orientation) params.set('orientation', filters.orientation);
27
23
  const data = await this.fetch('GET', `/search/photos?${params.toString()}`);
28
24
  return {
29
25
  images: this.formatResults(data.results),
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/endpoints/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,QAAQ,EAAE,MAAM,SAAS,CAAA;AAOvC,eAAO,MAAM,SAAS,EAAE,QAAQ,EA6I/B,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/endpoints/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,QAAQ,EAAE,MAAM,SAAS,CAAA;AAkCvC,eAAO,MAAM,SAAS,EAAE,QAAQ,EAkE/B,CAAA"}