@rubixstudios/payload-media 1.2.4 → 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.
- package/README.md +72 -35
- package/dist/components/media-search/index.d.ts.map +1 -1
- package/dist/components/media-search/index.js +6 -5
- package/dist/components/search-drawer/filters/pexels.d.ts +4 -4
- package/dist/components/search-drawer/filters/pexels.d.ts.map +1 -1
- package/dist/components/search-drawer/filters/pexels.js +9 -8
- package/dist/components/search-drawer/filters/pixabay.d.ts +4 -4
- package/dist/components/search-drawer/filters/pixabay.d.ts.map +1 -1
- package/dist/components/search-drawer/filters/pixabay.js +11 -11
- package/dist/components/search-drawer/filters/unsplash.d.ts +4 -4
- package/dist/components/search-drawer/filters/unsplash.d.ts.map +1 -1
- package/dist/components/search-drawer/filters/unsplash.js +5 -5
- package/dist/components/search-drawer/index.d.ts +2 -2
- package/dist/components/search-drawer/index.d.ts.map +1 -1
- package/dist/components/search-drawer/index.js +56 -50
- package/dist/components/search-drawer/media/image.d.ts +2 -2
- package/dist/components/search-drawer/media/image.d.ts.map +1 -1
- package/dist/components/search-drawer/media/image.js +2 -2
- package/dist/components/search-drawer/media/video.d.ts +2 -2
- package/dist/components/search-drawer/media/video.d.ts.map +1 -1
- package/dist/components/search-drawer/media/video.js +5 -3
- package/dist/components/search-drawer/style.css +1 -1
- package/dist/endpoints/handler/Pexels.d.ts.map +1 -1
- package/dist/endpoints/handler/Pexels.js +7 -21
- package/dist/endpoints/handler/Pixabay.d.ts.map +1 -1
- package/dist/endpoints/handler/Pixabay.js +9 -22
- package/dist/endpoints/handler/Provider.d.ts +3 -3
- package/dist/endpoints/handler/Provider.d.ts.map +1 -1
- package/dist/endpoints/handler/Provider.js +11 -11
- package/dist/endpoints/handler/Unsplash.d.ts.map +1 -1
- package/dist/endpoints/handler/Unsplash.js +2 -6
- package/dist/endpoints/index.d.ts.map +1 -1
- package/dist/endpoints/index.js +42 -75
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +18 -19
- package/dist/lib/cache.d.ts.map +1 -1
- package/dist/lib/cache.js +12 -9
- package/dist/types.d.ts +101 -100
- package/dist/types.d.ts.map +1 -1
- package/dist/utils/fetchCache.d.ts.map +1 -1
- package/dist/utils/fetchCache.js +4 -4
- package/dist/utils/getProviders.d.ts +1 -1
- package/dist/utils/getProviders.d.ts.map +1 -1
- package/dist/utils/getProviders.js +6 -6
- package/dist/utils/resolveProvider.d.ts +1 -4
- package/dist/utils/resolveProvider.d.ts.map +1 -1
- package/package.json +3 -3
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
'use client';
|
|
2
|
-
import React, { useCallback, useEffect, useState } from 'react';
|
|
3
|
-
import {
|
|
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 [
|
|
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
|
|
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
|
-
|
|
55
|
+
setProvider(initial);
|
|
55
56
|
} catch {
|
|
56
57
|
setLoading(false);
|
|
57
|
-
|
|
58
|
+
error();
|
|
58
59
|
}
|
|
59
60
|
}, [
|
|
60
61
|
serverURL,
|
|
61
62
|
api,
|
|
62
|
-
|
|
63
|
+
error
|
|
63
64
|
]);
|
|
64
|
-
const
|
|
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
|
|
103
|
-
if (!
|
|
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/${
|
|
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
|
-
|
|
115
|
+
error();
|
|
115
116
|
} finally{
|
|
116
117
|
setLoading(false);
|
|
117
118
|
}
|
|
118
119
|
}, [
|
|
119
120
|
serverURL,
|
|
120
121
|
api,
|
|
121
|
-
|
|
122
|
+
provider,
|
|
122
123
|
filters,
|
|
123
|
-
|
|
124
|
+
buildFeatures,
|
|
124
125
|
mediaType,
|
|
125
|
-
|
|
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/${
|
|
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
|
-
|
|
177
|
+
error();
|
|
177
178
|
} finally{
|
|
178
179
|
setLoading(false);
|
|
179
180
|
}
|
|
180
181
|
}, [
|
|
181
182
|
serverURL,
|
|
182
183
|
api,
|
|
183
|
-
|
|
184
|
-
|
|
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/${
|
|
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((
|
|
197
|
+
const selectFilter = useCallback((value)=>{
|
|
198
|
+
const select = value;
|
|
197
199
|
setFilters({
|
|
198
200
|
provider: select.value,
|
|
199
201
|
options: {}
|
|
200
202
|
});
|
|
201
|
-
|
|
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 (!
|
|
241
|
+
if (!provider?.value || !filters || !mediaType) return;
|
|
222
242
|
if (value.trim().length > 0) {
|
|
223
243
|
void getMedia(1);
|
|
224
244
|
} else {
|
|
225
|
-
void
|
|
245
|
+
void getFeatures();
|
|
226
246
|
}
|
|
227
247
|
}, [
|
|
228
|
-
|
|
248
|
+
provider?.value,
|
|
229
249
|
filters,
|
|
230
250
|
value,
|
|
231
251
|
mediaType,
|
|
232
252
|
getMedia,
|
|
233
|
-
|
|
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(
|
|
240
|
-
|
|
241
|
-
|
|
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:
|
|
248
|
-
|
|
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:
|
|
278
|
+
onChange: selectFilter,
|
|
263
279
|
options: options,
|
|
264
|
-
value:
|
|
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(
|
|
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:
|
|
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
|
|
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 }:
|
|
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,
|
|
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
|
|
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 }:
|
|
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,
|
|
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
|
|
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{
|
|
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,
|
|
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:
|
|
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
|
-
|
|
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
|
|
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((
|
|
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,
|
|
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
|
-
|
|
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
|
-
|
|
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;
|
|
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,
|
|
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
|
-
|
|
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;
|
|
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"}
|