sanity-plugin-asset-source-unsplash 1.0.7 → 1.1.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.
@@ -1,25 +1,80 @@
1
+ 'use strict';
2
+
1
3
  var _templateObject, _templateObject2, _templateObject3, _templateObject4, _templateObject5;
2
4
  function _taggedTemplateLiteral(strings, raw) { if (!raw) { raw = strings.slice(0); } return Object.freeze(Object.defineProperties(strings, { raw: { value: Object.freeze(raw) } })); }
3
- import { jsx, jsxs } from 'react/jsx-runtime';
4
- import React, { useCallback, useEffect } from 'react';
5
- import PhotoAlbum from 'react-photo-album';
6
- import { concat, defer, BehaviorSubject } from 'rxjs';
7
- import { Card, useTheme, Text, Stack, Dialog, TextInput, Flex, Spinner } from '@sanity/ui';
8
- import styled from 'styled-components';
9
- import { withLatestFrom, debounceTime, distinctUntilChanged, switchMap, map } from 'rxjs/operators';
10
- import InfiniteScroll from 'react-infinite-scroll-component';
11
- import { useClient, definePlugin } from 'sanity';
12
- const Root = styled.div(_templateObject || (_templateObject = _taggedTemplateLiteral(["\n overflow: hidden;\n background-origin: content-box;\n background-repeat: no-repeat;\n background-clip: border-box;\n background-size: cover;\n position: relative;\n outline: none !important;\n border: ", ";\n box-sizing: content-box;\n user-drag: none;\n\n &:hover {\n opacity: 0.85;\n }\n\n &:focus,\n &:active {\n border: 1px solid var(--input-border-color-focus);\n box-shadow: inset 0 0 0 3px var(--input-border-color-focus);\n }\n"])), _ref => {
5
+ Object.defineProperty(exports, '__esModule', {
6
+ value: true
7
+ });
8
+ var sanity = require('sanity');
9
+ var jsxRuntime = require('react/jsx-runtime');
10
+ var ui = require('@sanity/ui');
11
+ var React = require('react');
12
+ var InfiniteScroll = require('react-infinite-scroll-component');
13
+ var PhotoAlbum = require('react-photo-album');
14
+ var rxjs = require('rxjs');
15
+ var operators = require('rxjs/operators');
16
+ var styled = require('styled-components');
17
+ function _interopDefaultCompat(e) {
18
+ return e && typeof e === 'object' && 'default' in e ? e : {
19
+ default: e
20
+ };
21
+ }
22
+ var React__default = /*#__PURE__*/_interopDefaultCompat(React);
23
+ var InfiniteScroll__default = /*#__PURE__*/_interopDefaultCompat(InfiniteScroll);
24
+ var PhotoAlbum__default = /*#__PURE__*/_interopDefaultCompat(PhotoAlbum);
25
+ var styled__default = /*#__PURE__*/_interopDefaultCompat(styled);
26
+ function UnsplashIcon() {
27
+ return /* @__PURE__ */jsxRuntime.jsxs("svg", {
28
+ role: "img",
29
+ viewBox: "0 0 25 25",
30
+ width: "1em",
31
+ height: "1em",
32
+ fill: "currentColor",
33
+ children: [/* @__PURE__ */jsxRuntime.jsx("title", {}), /* @__PURE__ */jsxRuntime.jsx("path", {
34
+ d: "M9 9V4h7v5H9Zm7 3h5v9H4v-9h5v5h7v-5Z"
35
+ })]
36
+ });
37
+ }
38
+ const fetchSearch = (client, query, page, perPage) => rxjs.defer(() => client.observable.request({
39
+ url: "/addons/unsplash/search/photos?query=".concat(encodeURIComponent(query), "&page=").concat(page, "&per_page=").concat(perPage),
40
+ withCredentials: true,
41
+ method: "GET"
42
+ }));
43
+ const fetchList = (client, type, page, perPage) => rxjs.defer(() => client.observable.request({
44
+ url: "/addons/unsplash/photos?order_by=".concat(type, "&page=").concat(page, "&per_page=").concat(perPage),
45
+ withCredentials: true,
46
+ method: "GET"
47
+ }));
48
+ function fetchDownloadUrl(client, photo) {
49
+ const downloadUrl = photo.links.download_location.replace("https://api.unsplash.com", "/addons/unsplash");
50
+ return client.request({
51
+ url: downloadUrl,
52
+ withCredentials: true,
53
+ method: "GET"
54
+ }).then(result => {
55
+ return result.url;
56
+ });
57
+ }
58
+ const search = (client, query, page, resultsPerPage) => {
59
+ return rxjs.concat(query.pipe(operators.withLatestFrom(page), operators.debounceTime(500), operators.distinctUntilChanged(), operators.switchMap(_ref => {
60
+ let [q, p] = _ref;
61
+ if (q) {
62
+ return fetchSearch(client, q, p, resultsPerPage).pipe(operators.distinctUntilChanged(), operators.map(result => result.results));
63
+ }
64
+ return fetchList(client, "popular", p, resultsPerPage);
65
+ })));
66
+ };
67
+ const Root = styled__default.default.div(_templateObject || (_templateObject = _taggedTemplateLiteral(["\n overflow: hidden;\n background-origin: content-box;\n background-repeat: no-repeat;\n background-clip: border-box;\n background-size: cover;\n position: relative;\n outline: none !important;\n border: ", ";\n box-sizing: content-box;\n user-drag: none;\n\n &:hover {\n opacity: 0.85;\n }\n\n &:focus,\n &:active {\n border: 1px solid var(--input-border-color-focus);\n box-shadow: inset 0 0 0 3px var(--input-border-color-focus);\n }\n"])), _ref2 => {
13
68
  let {
14
69
  studioTheme
15
- } = _ref;
70
+ } = _ref2;
16
71
  return "1px solid ".concat(studioTheme.color.card.enabled.border);
17
72
  });
18
- const CreditLineLink = styled.a(_templateObject2 || (_templateObject2 = _taggedTemplateLiteral(["\n text-decoration: none;\n cursor: pointer;\n"])));
19
- const CreditLine = styled(Card)(_templateObject3 || (_templateObject3 = _taggedTemplateLiteral(["\n ", ";\n user-drag: none;\n position: absolute;\n background-color: var(--creditline-bg);\n bottom: 0;\n\n [data-ui='Text'] {\n color: var(--creditline-fg);\n }\n"])), _ref2 => {
73
+ const CreditLineLink = styled__default.default.a(_templateObject2 || (_templateObject2 = _taggedTemplateLiteral(["\n text-decoration: none;\n cursor: pointer;\n"])));
74
+ const CreditLine = styled__default.default(ui.Card)(_templateObject3 || (_templateObject3 = _taggedTemplateLiteral(["\n ", ";\n user-drag: none;\n position: absolute;\n background-color: var(--creditline-bg);\n bottom: 0;\n\n [data-ui='Text'] {\n color: var(--creditline-fg);\n }\n"])), _ref3 => {
20
75
  let {
21
76
  theme
22
- } = _ref2;
77
+ } = _ref3;
23
78
  return "\n --creditline-fg: ".concat(theme.sanity.color.card.enabled.fg, ";\n --creditline-bg: ").concat(theme.sanity.color.card.enabled.bg, ";\n ");
24
79
  });
25
80
  const UTM_SOURCE = "sanity-plugin-asset-source-unsplash";
@@ -33,32 +88,32 @@ function Photo(props) {
33
88
  width,
34
89
  height
35
90
  } = props;
36
- const handleClick = useCallback(() => {
91
+ const handleClick = React.useCallback(() => {
37
92
  onClick(data);
38
93
  }, [onClick, data]);
39
- const handleCreditLineClicked = useCallback(event => {
94
+ const handleCreditLineClicked = React.useCallback(event => {
40
95
  event.stopPropagation();
41
96
  const url = "".concat(data.links.html, "?utm_source=").concat(encodeURIComponent(UTM_SOURCE), "&utm_medium=referral");
42
97
  window.open(url, data.id, "noreferrer,noopener");
43
98
  }, [data]);
44
- const handleKeyDown = useCallback(event => {
99
+ const handleKeyDown = React.useCallback(event => {
45
100
  onKeyDown(event);
46
101
  if (event.keyCode === 13) {
47
102
  onClick(data);
48
103
  }
49
104
  }, [onKeyDown, data, onClick]);
50
- const handleMouseDown = useCallback(() => {
105
+ const handleMouseDown = React.useCallback(() => {
51
106
  onFocus(data);
52
107
  }, [onFocus, data]);
53
- useEffect(() => {
108
+ React.useEffect(() => {
54
109
  if (active) {
55
110
  onFocus(data);
56
111
  }
57
112
  }, [active, data, onFocus]);
58
113
  const src = data.urls.small;
59
114
  const userName = data.user.name;
60
- const theme = useTheme().sanity;
61
- return /* @__PURE__ */jsx(Root, {
115
+ const theme = ui.useTheme().sanity;
116
+ return /* @__PURE__ */jsxRuntime.jsx(Root, {
62
117
  studioTheme: theme,
63
118
  title: "Select image by ".concat(userName, " from Unsplash"),
64
119
  tabIndex: 0,
@@ -70,13 +125,13 @@ function Photo(props) {
70
125
  backgroundImage: "url(\"".concat(src, "\")")
71
126
  },
72
127
  onClick: handleClick,
73
- children: /* @__PURE__ */jsx(CreditLineLink, {
128
+ children: /* @__PURE__ */jsxRuntime.jsx(CreditLineLink, {
74
129
  onClick: handleCreditLineClicked,
75
- children: /* @__PURE__ */jsx(CreditLine, {
130
+ children: /* @__PURE__ */jsxRuntime.jsx(CreditLine, {
76
131
  padding: 2,
77
132
  radius: 2,
78
133
  margin: 2,
79
- children: /* @__PURE__ */jsxs(Text, {
134
+ children: /* @__PURE__ */jsxRuntime.jsxs(ui.Text, {
80
135
  size: 1,
81
136
  title: "Open image by ".concat(userName, " on Unsplash in new window"),
82
137
  children: ["By @", data.user.username]
@@ -85,50 +140,21 @@ function Photo(props) {
85
140
  })
86
141
  });
87
142
  }
88
- const fetchSearch = (client, query, page, perPage) => defer(() => client.observable.request({
89
- url: "/addons/unsplash/search/photos?query=".concat(encodeURIComponent(query), "&page=").concat(page, "&per_page=").concat(perPage),
90
- withCredentials: true,
91
- method: "GET"
92
- }));
93
- const fetchList = (client, type, page, perPage) => defer(() => client.observable.request({
94
- url: "/addons/unsplash/photos?order_by=".concat(type, "&page=").concat(page, "&per_page=").concat(perPage),
95
- withCredentials: true,
96
- method: "GET"
97
- }));
98
- function fetchDownloadUrl(client, photo) {
99
- const downloadUrl = photo.links.download_location.replace("https://api.unsplash.com", "/addons/unsplash");
100
- return client.request({
101
- url: downloadUrl,
102
- withCredentials: true,
103
- method: "GET"
104
- }).then(result => {
105
- return result.url;
106
- });
107
- }
108
- const search = (client, query, page, resultsPerPage) => {
109
- return concat(query.pipe(withLatestFrom(page), debounceTime(500), distinctUntilChanged(), switchMap(_ref3 => {
110
- let [q, p] = _ref3;
111
- if (q) {
112
- return fetchSearch(client, q, p, resultsPerPage).pipe(distinctUntilChanged(), map(result => result.results));
113
- }
114
- return fetchList(client, "popular", p, resultsPerPage);
115
- })));
116
- };
117
- const Search = styled(Stack)(_templateObject4 || (_templateObject4 = _taggedTemplateLiteral(["\n position: sticky;\n top: 0;\n z-index: 1;\n"])));
118
- styled.div(_templateObject5 || (_templateObject5 = _taggedTemplateLiteral(["\n overflow-y: auto;\n max-height: 80vh;\n"])));
143
+ const Search = styled__default.default(ui.Stack)(_templateObject4 || (_templateObject4 = _taggedTemplateLiteral(["\n position: sticky;\n top: 0;\n z-index: 1;\n"])));
144
+ styled__default.default.div(_templateObject5 || (_templateObject5 = _taggedTemplateLiteral(["\n overflow-y: auto;\n max-height: 80vh;\n"])));
119
145
  const RESULTS_PER_PAGE = 42;
120
146
  const PHOTO_SPACING = 2;
121
147
  const PHOTO_PADDING = 1;
122
148
  function UnsplashAssetSource(props) {
123
- const client = useClient({
149
+ const client = sanity.useClient({
124
150
  apiVersion: "2022-09-01"
125
151
  });
126
- return /* @__PURE__ */jsx(UnsplashAssetSourceInternal, {
152
+ return /* @__PURE__ */jsxRuntime.jsx(UnsplashAssetSourceInternal, {
127
153
  ...props,
128
154
  client
129
155
  });
130
156
  }
131
- class UnsplashAssetSourceInternal extends React.Component {
157
+ class UnsplashAssetSourceInternal extends React__default.default.Component {
132
158
  constructor() {
133
159
  super(...arguments);
134
160
  this.state = {
@@ -139,8 +165,8 @@ class UnsplashAssetSourceInternal extends React.Component {
139
165
  isLoading: true
140
166
  };
141
167
  this.searchSubscription = null;
142
- this.searchSubject$ = new BehaviorSubject("");
143
- this.pageSubject$ = new BehaviorSubject(1);
168
+ this.searchSubject$ = new rxjs.BehaviorSubject("");
169
+ this.pageSubject$ = new rxjs.BehaviorSubject(1);
144
170
  this.handleSelect = photo => {
145
171
  this.setState({
146
172
  isLoading: true
@@ -214,7 +240,7 @@ class UnsplashAssetSourceInternal extends React.Component {
214
240
  layout
215
241
  } = props;
216
242
  const active = this.getPhotos().findIndex(result => result.id === photo.data.id) === this.state.cursor || false;
217
- return /* @__PURE__ */jsx(Photo, {
243
+ return /* @__PURE__ */jsxRuntime.jsx(Photo, {
218
244
  onClick: this.handleSelect.bind(photo.data),
219
245
  onKeyDown: this.handleKeyDown,
220
246
  data: photo.data,
@@ -249,53 +275,53 @@ class UnsplashAssetSourceInternal extends React.Component {
249
275
  searchResults,
250
276
  isLoading
251
277
  } = this.state;
252
- return /* @__PURE__ */jsx(Dialog, {
278
+ return /* @__PURE__ */jsxRuntime.jsx(ui.Dialog, {
253
279
  id: "unsplash-asset-source",
254
280
  header: "Select image from Unsplash",
255
281
  onClose: this.handleClose,
256
282
  open: true,
257
283
  width: 4,
258
- children: /* @__PURE__ */jsxs(Stack, {
284
+ children: /* @__PURE__ */jsxRuntime.jsxs(ui.Stack, {
259
285
  space: 3,
260
286
  padding: 4,
261
- children: [/* @__PURE__ */jsx(Card, {
262
- children: /* @__PURE__ */jsxs(Search, {
287
+ children: [/* @__PURE__ */jsxRuntime.jsx(ui.Card, {
288
+ children: /* @__PURE__ */jsxRuntime.jsxs(Search, {
263
289
  space: 3,
264
- children: [/* @__PURE__ */jsx(Text, {
290
+ children: [/* @__PURE__ */jsxRuntime.jsx(ui.Text, {
265
291
  size: 1,
266
292
  weight: "semibold",
267
293
  children: "Search Unsplash"
268
- }), /* @__PURE__ */jsx(TextInput, {
294
+ }), /* @__PURE__ */jsxRuntime.jsx(ui.TextInput, {
269
295
  label: "Search Unsplash.com",
270
296
  placeholder: "Topics or colors",
271
297
  value: query,
272
298
  onChange: this.handleSearchTermChanged
273
299
  })]
274
300
  })
275
- }), !isLoading && this.getPhotos().length === 0 && /* @__PURE__ */jsx(Text, {
301
+ }), !isLoading && this.getPhotos().length === 0 && /* @__PURE__ */jsxRuntime.jsx(ui.Text, {
276
302
  size: 1,
277
303
  muted: true,
278
304
  children: "No results found"
279
- }), /* @__PURE__ */jsx(InfiniteScroll, {
305
+ }), /* @__PURE__ */jsxRuntime.jsx(InfiniteScroll__default.default, {
280
306
  dataLength: this.getPhotos().length,
281
307
  next: this.handleScollerLoadMore,
282
308
  hasMore: true,
283
309
  scrollThreshold: 0.99,
284
310
  height: "60vh",
285
- loader: /* @__PURE__ */jsx(Flex, {
311
+ loader: /* @__PURE__ */jsxRuntime.jsx(ui.Flex, {
286
312
  align: "center",
287
313
  justify: "center",
288
314
  padding: 3,
289
- children: /* @__PURE__ */jsx(Spinner, {
315
+ children: /* @__PURE__ */jsxRuntime.jsx(ui.Spinner, {
290
316
  muted: true
291
317
  })
292
318
  }),
293
- endMessage: /* @__PURE__ */jsx(Text, {
319
+ endMessage: /* @__PURE__ */jsxRuntime.jsx(ui.Text, {
294
320
  size: 1,
295
321
  muted: true,
296
322
  children: "No more results"
297
323
  }),
298
- children: searchResults.filter(photos => photos.length > 0).map((photos, index) => /* @__PURE__ */jsx(PhotoAlbum, {
324
+ children: searchResults.filter(photos => photos.length > 0).map((photos, index) => /* @__PURE__ */jsxRuntime.jsx(PhotoAlbum__default.default, {
299
325
  layout: "rows",
300
326
  spacing: PHOTO_SPACING,
301
327
  padding: PHOTO_PADDING,
@@ -327,25 +353,13 @@ class UnsplashAssetSourceInternal extends React.Component {
327
353
  UnsplashAssetSourceInternal.defaultProps = {
328
354
  selectedAssets: void 0
329
355
  };
330
- function UnsplashIcon() {
331
- return /* @__PURE__ */jsxs("svg", {
332
- role: "img",
333
- viewBox: "0 0 25 25",
334
- width: "1em",
335
- height: "1em",
336
- fill: "currentColor",
337
- children: [/* @__PURE__ */jsx("title", {}), /* @__PURE__ */jsx("path", {
338
- d: "M9 9V4h7v5H9Zm7 3h5v9H4v-9h5v5h7v-5Z"
339
- })]
340
- });
341
- }
342
356
  const unsplashAssetSource = {
343
357
  name: "unsplash",
344
358
  title: "Unsplash",
345
359
  component: UnsplashAssetSource,
346
360
  icon: UnsplashIcon
347
361
  };
348
- const unsplashImageAsset = definePlugin({
362
+ const unsplashImageAsset = sanity.definePlugin({
349
363
  name: "asset-source-unsplash-plugin",
350
364
  form: {
351
365
  image: {
@@ -355,5 +369,6 @@ const unsplashImageAsset = definePlugin({
355
369
  }
356
370
  }
357
371
  });
358
- export { unsplashAssetSource, unsplashImageAsset };
359
- //# sourceMappingURL=index.esm.js.map
372
+ exports.unsplashAssetSource = unsplashAssetSource;
373
+ exports.unsplashImageAsset = unsplashImageAsset;
374
+ //# sourceMappingURL=index.cjs.map
@@ -0,0 +1,6 @@
1
+ import cjs from './index.cjs';
2
+
3
+ export const unsplashAssetSource = cjs.unsplashAssetSource;
4
+ export const unsplashImageAsset = cjs.unsplashImageAsset;
5
+
6
+ export default cjs.default;
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.cjs","sources":["../src/components/Icon.tsx","../src/datastores/unsplash.ts","../src/components/Photo.styled.tsx","../src/components/Photo.tsx","../src/components/UnsplashAssetSource.styled.tsx","../src/components/UnsplashAssetSource.tsx","../src/index.ts"],"sourcesContent":["import React from 'react'\n\nexport default function UnsplashIcon() {\n return (\n <svg role=\"img\" viewBox=\"0 0 25 25\" width=\"1em\" height=\"1em\" fill=\"currentColor\">\n <title />\n <path d=\"M9 9V4h7v5H9Zm7 3h5v9H4v-9h5v5h7v-5Z\" />\n </svg>\n )\n}\n","import { SanityClient } from '@sanity/client'\nimport { BehaviorSubject, concat, defer, Observable } from 'rxjs'\nimport { debounceTime, distinctUntilChanged, map, switchMap, withLatestFrom } from 'rxjs/operators'\n\nimport { UnsplashPhoto } from '../types'\n\ntype SearchSubject = BehaviorSubject<string>\ntype PageSubject = BehaviorSubject<number>\n\nconst fetchSearch = (\n client: SanityClient,\n query: string,\n page: number,\n perPage: number\n): Observable<any> =>\n defer(\n () =>\n client.observable.request({\n url: `/addons/unsplash/search/photos?query=${encodeURIComponent(\n query\n )}&page=${page}&per_page=${perPage}`,\n withCredentials: true,\n method: 'GET',\n }) as any\n )\n\nconst fetchList = (\n client: SanityClient,\n type: string,\n page: number,\n perPage: number\n): Observable<any> =>\n defer(\n () =>\n client.observable.request({\n url: `/addons/unsplash/photos?order_by=${type}&page=${page}&per_page=${perPage}`,\n withCredentials: true,\n method: 'GET',\n }) as any\n )\n\nexport function fetchDownloadUrl(client: SanityClient, photo: UnsplashPhoto): Promise<string> {\n const downloadUrl = photo.links.download_location.replace(\n 'https://api.unsplash.com',\n '/addons/unsplash'\n )\n return client\n .request({\n url: downloadUrl,\n withCredentials: true,\n method: 'GET',\n })\n .then((result: { url: string }) => {\n return result.url\n })\n}\n\nexport const search = (\n client: SanityClient,\n query: SearchSubject,\n page: PageSubject,\n resultsPerPage: number\n): Observable<any> => {\n return concat(\n query.pipe(\n withLatestFrom(page),\n debounceTime(500),\n distinctUntilChanged(),\n switchMap(([q, p]) => {\n if (q) {\n return fetchSearch(client, q, p, resultsPerPage).pipe(\n distinctUntilChanged(),\n map((result) => result.results)\n )\n }\n return fetchList(client, 'popular', p, resultsPerPage)\n })\n )\n )\n}\n","import { Card, Theme } from '@sanity/ui'\nimport styled from 'styled-components'\n\ntype SanityTheme = Theme['sanity']\n\ninterface Style {\n studioTheme: SanityTheme\n}\n\nexport const Root = styled.div`\n overflow: hidden;\n background-origin: content-box;\n background-repeat: no-repeat;\n background-clip: border-box;\n background-size: cover;\n position: relative;\n outline: none !important;\n border: ${({ studioTheme }: Style) => `1px solid ${studioTheme.color.card.enabled.border}`};\n box-sizing: content-box;\n user-drag: none;\n\n &:hover {\n opacity: 0.85;\n }\n\n &:focus,\n &:active {\n border: 1px solid var(--input-border-color-focus);\n box-shadow: inset 0 0 0 3px var(--input-border-color-focus);\n }\n`\n\nexport const CreditLineLink = styled.a`\n text-decoration: none;\n cursor: pointer;\n`\n\nexport const CreditLine = styled(Card)`\n ${({ theme }) => `\n --creditline-fg: ${theme.sanity.color.card.enabled.fg};\n --creditline-bg: ${theme.sanity.color.card.enabled.bg};\n `};\n user-drag: none;\n position: absolute;\n background-color: var(--creditline-bg);\n bottom: 0;\n\n [data-ui='Text'] {\n color: var(--creditline-fg);\n }\n`\n","import { Text, useTheme } from '@sanity/ui'\nimport React, { useCallback, useEffect } from 'react'\n\nimport { UnsplashPhoto } from '../types'\nimport { CreditLine, CreditLineLink, Root } from './Photo.styled'\n\ntype Props = {\n data: UnsplashPhoto\n width: number\n height: number\n onClick: (photo: UnsplashPhoto) => void\n onKeyDown: (event: any) => void\n active: boolean\n onFocus: (photo: UnsplashPhoto) => void\n}\n\nconst UTM_SOURCE = 'sanity-plugin-asset-source-unsplash'\n\nexport default function Photo(props: Props) {\n const { onClick, data, onKeyDown, onFocus, active, width, height } = props\n\n const handleClick = useCallback(() => {\n onClick(data)\n }, [onClick, data])\n\n const handleCreditLineClicked = useCallback(\n (event: any) => {\n event.stopPropagation()\n const url = `${data.links.html}?utm_source=${encodeURIComponent(\n UTM_SOURCE\n )}&utm_medium=referral`\n window.open(url, data.id, 'noreferrer,noopener')\n },\n [data]\n )\n\n const handleKeyDown = useCallback(\n (event: any) => {\n onKeyDown(event)\n if (event.keyCode === 13) {\n onClick(data)\n }\n },\n [onKeyDown, data, onClick]\n )\n\n const handleMouseDown = useCallback(() => {\n onFocus(data)\n }, [onFocus, data])\n\n useEffect(() => {\n if (active) {\n onFocus(data)\n }\n }, [active, data, onFocus])\n\n const src = data.urls.small\n const userName = data.user.name\n\n const theme = useTheme().sanity\n return (\n <Root\n studioTheme={theme}\n title={`Select image by ${userName} from Unsplash`}\n tabIndex={0}\n onKeyDown={handleKeyDown}\n onMouseDown={handleMouseDown}\n style={{\n width: `${width}px`,\n height: `${height}px`,\n backgroundImage: `url(\"${src}\")`,\n }}\n onClick={handleClick}\n >\n <CreditLineLink onClick={handleCreditLineClicked}>\n <CreditLine padding={2} radius={2} margin={2}>\n <Text size={1} title={`Open image by ${userName} on Unsplash in new window`}>\n By @{data.user.username}\n </Text>\n </CreditLine>\n </CreditLineLink>\n </Root>\n )\n}\n","import { Stack } from '@sanity/ui'\nimport styled from 'styled-components'\n\nexport const Search = styled(Stack)`\n position: sticky;\n top: 0;\n z-index: 1;\n`\n\nexport const Scroller = styled.div`\n overflow-y: auto;\n max-height: 80vh;\n`\n","import { SanityClient } from '@sanity/client'\nimport { Card, Dialog, Flex, Spinner, Stack, Text, TextInput } from '@sanity/ui'\nimport React from 'react'\nimport InfiniteScroll from 'react-infinite-scroll-component'\nimport PhotoAlbum from 'react-photo-album'\nimport { BehaviorSubject, Subscription } from 'rxjs'\nimport { AssetFromSource, AssetSourceComponentProps, useClient } from 'sanity'\n\nimport { fetchDownloadUrl, search } from '../datastores/unsplash'\nimport { UnsplashPhoto } from '../types'\nimport Photo from './Photo'\nimport { Search } from './UnsplashAssetSource.styled'\n\ntype State = {\n query: string\n searchResults: UnsplashPhoto[][]\n page: number\n isLoading: boolean\n cursor: number\n}\n\nconst RESULTS_PER_PAGE = 42\nconst PHOTO_SPACING = 2\nconst PHOTO_PADDING = 1 // offset the 1px border width\n\nexport default function UnsplashAssetSource(props: AssetSourceComponentProps) {\n const client = useClient({ apiVersion: '2022-09-01' })\n return <UnsplashAssetSourceInternal {...props} client={client} />\n}\n\nclass UnsplashAssetSourceInternal extends React.Component<\n AssetSourceComponentProps & { client: SanityClient },\n State\n> {\n static defaultProps = {\n selectedAssets: undefined,\n }\n\n state = {\n cursor: 0,\n query: '',\n page: 1,\n searchResults: [[]],\n isLoading: true,\n }\n\n searchSubscription: Subscription | null = null\n\n searchSubject$ = new BehaviorSubject('')\n pageSubject$ = new BehaviorSubject(1)\n\n componentDidMount() {\n this.searchSubscription = search(\n this.props.client,\n this.searchSubject$,\n this.pageSubject$,\n RESULTS_PER_PAGE\n ).subscribe({\n next: (results: UnsplashPhoto[]) => {\n this.setState((prev) => ({\n searchResults: [...prev.searchResults, results],\n isLoading: false,\n }))\n },\n })\n }\n\n componentWillUnmount() {\n if (this.searchSubscription) {\n this.searchSubscription.unsubscribe()\n }\n }\n\n handleSelect = (photo: UnsplashPhoto) => {\n this.setState({ isLoading: true })\n return fetchDownloadUrl(this.props.client, photo).then((downloadUrl) => {\n const description = photo.description || undefined\n const asset: AssetFromSource = {\n kind: 'url',\n value: downloadUrl,\n assetDocumentProps: {\n _type: 'sanity.imageAsset',\n source: {\n name: 'unsplash',\n id: photo.id,\n url: photo.links.html,\n },\n description,\n creditLine: `${photo.user.name} by Unsplash`,\n } as any,\n }\n this.props.onSelect([asset])\n })\n }\n\n handleClose = () => {\n this.props.onClose()\n }\n\n handleSearchTermChanged = (event: React.ChangeEvent<HTMLInputElement>) => {\n const query = event.currentTarget.value\n this.setState({ query, page: 1, searchResults: [[]], isLoading: true, cursor: 0 })\n this.pageSubject$.next(1)\n this.searchSubject$.next(query)\n }\n\n handleScollerLoadMore = () => {\n // eslint-disable-next-line react/no-access-state-in-setstate\n const nextPage = this.state.page + 1\n this.setState({ page: nextPage, isLoading: true })\n this.pageSubject$.next(nextPage)\n this.searchSubject$.next(this.state.query)\n }\n\n handleKeyDown = (event: any) => {\n const { cursor } = this.state\n if ((event.keyCode === 38 || event.keyCode === 37) && cursor > 0) {\n this.setState((prevState) => ({\n cursor: prevState.cursor - 1,\n }))\n } else if (\n (event.keyCode === 40 || event.keyCode === 39) &&\n cursor < this.getPhotos().length - 1\n ) {\n this.setState((prevState) => ({\n cursor: prevState.cursor + 1,\n }))\n }\n }\n\n getPhotos() {\n return this.state.searchResults.flat()\n }\n\n updateCursor = (photo: UnsplashPhoto) => {\n const index = this.getPhotos().findIndex((result: UnsplashPhoto) => result.id === photo.id)\n this.setState({ cursor: index })\n }\n\n renderImage = (props: any) => {\n const { photo, layout } = props\n const active =\n this.getPhotos().findIndex((result: UnsplashPhoto) => result.id === photo.data.id) ===\n this.state.cursor || false\n return (\n <Photo\n onClick={this.handleSelect.bind(photo.data)}\n onKeyDown={this.handleKeyDown}\n data={photo.data}\n width={layout.width}\n height={layout.height}\n active={active}\n onFocus={this.updateCursor}\n />\n )\n }\n\n render() {\n const { query, searchResults, isLoading } = this.state\n\n return (\n <Dialog\n id=\"unsplash-asset-source\"\n header=\"Select image from Unsplash\"\n onClose={this.handleClose}\n open\n width={4}\n >\n <Stack space={3} padding={4}>\n <Card>\n <Search space={3}>\n <Text size={1} weight=\"semibold\">\n Search Unsplash\n </Text>\n <TextInput\n label=\"Search Unsplash.com\"\n placeholder=\"Topics or colors\"\n value={query}\n onChange={this.handleSearchTermChanged}\n />\n </Search>\n </Card>\n {!isLoading && this.getPhotos().length === 0 && (\n <Text size={1} muted>\n No results found\n </Text>\n )}\n <InfiniteScroll\n dataLength={this.getPhotos().length} // This is important field to render the next data\n next={this.handleScollerLoadMore}\n // scrollableTarget=\"unsplash-scroller\"\n hasMore\n scrollThreshold={0.99}\n height=\"60vh\"\n loader={\n <Flex align=\"center\" justify=\"center\" padding={3}>\n <Spinner muted />\n </Flex>\n }\n endMessage={\n <Text size={1} muted>\n No more results\n </Text>\n }\n >\n {searchResults\n .filter((photos) => photos.length > 0)\n .map((photos: UnsplashPhoto[], index) => (\n <PhotoAlbum\n // eslint-disable-next-line react/no-array-index-key\n key={`gallery-${query || 'popular'}-${index}`}\n layout=\"rows\"\n spacing={PHOTO_SPACING}\n padding={PHOTO_PADDING}\n targetRowHeight={(width) => {\n if (width < 300) return 150\n else if (width < 600) return 200\n return 300\n }}\n photos={photos.map((photo: UnsplashPhoto) => ({\n src: photo.urls.small,\n width: photo.width,\n height: photo.height,\n key: photo.id,\n data: photo,\n }))}\n renderPhoto={this.renderImage}\n componentsProps={{\n containerProps: { style: { marginBottom: `${PHOTO_SPACING}px` } },\n }}\n />\n ))}\n </InfiniteScroll>\n </Stack>\n </Dialog>\n )\n }\n}\n","import { AssetSource, definePlugin } from 'sanity'\n\nimport Icon from './components/Icon'\nimport Unsplash from './components/UnsplashAssetSource'\n\nexport type { Asset, AssetDocument, UnsplashPhoto } from './types'\n\n/**\n * @public\n */\nexport const unsplashAssetSource: AssetSource = {\n name: 'unsplash',\n title: 'Unsplash',\n component: Unsplash,\n icon: Icon,\n}\n\n/**\n * @public\n */\nexport const unsplashImageAsset = definePlugin({\n name: 'asset-source-unsplash-plugin',\n\n form: {\n image: {\n assetSources: (prev) => {\n return [...prev, unsplashAssetSource]\n },\n },\n },\n})\n"],"names":["UnsplashIcon","jsxs","role","viewBox","width","height","fill","children","jsx","d","fetchSearch","client","query","page","perPage","defer","observable","request","url","encodeURIComponent","concat","withCredentials","method","fetchList","type","fetchDownloadUrl","photo","downloadUrl","links","download_location","replace","then","result","search","resultsPerPage","pipe","withLatestFrom","debounceTime","distinctUntilChanged","switchMap","_ref","q","p","map","results","Root","styled","default","div","_templateObject","_taggedTemplateLiteral","_ref2","studioTheme","color","card","enabled","border","CreditLineLink","a","_templateObject2","CreditLine","Card","_templateObject3","_ref3","theme","sanity","fg","bg","UTM_SOURCE","Photo","props","onClick","data","onKeyDown","onFocus","active","handleClick","useCallback","handleCreditLineClicked","event","stopPropagation","html","window","open","id","handleKeyDown","keyCode","handleMouseDown","useEffect","src","urls","small","userName","user","name","useTheme","title","tabIndex","onMouseDown","style","backgroundImage","padding","radius","margin","Text","size","username","Search","Stack","_templateObject4","_templateObject5","RESULTS_PER_PAGE","PHOTO_SPACING","PHOTO_PADDING","UnsplashAssetSource","useClient","apiVersion","UnsplashAssetSourceInternal","React","Component","constructor","arguments","state","cursor","searchResults","isLoading","searchSubscription","searchSubject$","BehaviorSubject","pageSubject$","handleSelect","setState","description","asset","kind","value","assetDocumentProps","_type","source","creditLine","onSelect","handleClose","onClose","handleSearchTermChanged","currentTarget","next","handleScollerLoadMore","nextPage","prevState","getPhotos","length","updateCursor","index","findIndex","renderImage","layout","bind","componentDidMount","subscribe","prev","componentWillUnmount","unsubscribe","flat","render","Dialog","header","space","weight","TextInput","label","placeholder","onChange","muted","InfiniteScroll","dataLength","hasMore","scrollThreshold","loader","Flex","align","justify","Spinner","endMessage","filter","photos","PhotoAlbum","spacing","targetRowHeight","key","renderPhoto","componentsProps","containerProps","marginBottom","defaultProps","selectedAssets","unsplashAssetSource","component","Unsplash","icon","Icon","unsplashImageAsset","definePlugin","form","image","assetSources"],"mappings":"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"}
package/lib/index.js CHANGED
@@ -1,39 +1,66 @@
1
- 'use strict';
2
-
3
1
  var _templateObject, _templateObject2, _templateObject3, _templateObject4, _templateObject5;
4
2
  function _taggedTemplateLiteral(strings, raw) { if (!raw) { raw = strings.slice(0); } return Object.freeze(Object.defineProperties(strings, { raw: { value: Object.freeze(raw) } })); }
5
- Object.defineProperty(exports, '__esModule', {
6
- value: true
7
- });
8
- var jsxRuntime = require('react/jsx-runtime');
9
- var React = require('react');
10
- var PhotoAlbum = require('react-photo-album');
11
- var rxjs = require('rxjs');
12
- var ui = require('@sanity/ui');
13
- var styled = require('styled-components');
14
- var operators = require('rxjs/operators');
15
- var InfiniteScroll = require('react-infinite-scroll-component');
16
- var sanity = require('sanity');
17
- function _interopDefaultCompat(e) {
18
- return e && typeof e === 'object' && 'default' in e ? e : {
19
- default: e
20
- };
3
+ import { useClient, definePlugin } from 'sanity';
4
+ import { jsxs, jsx } from 'react/jsx-runtime';
5
+ import { Card, useTheme, Text, Stack, Dialog, TextInput, Flex, Spinner } from '@sanity/ui';
6
+ import React, { useCallback, useEffect } from 'react';
7
+ import InfiniteScroll from 'react-infinite-scroll-component';
8
+ import PhotoAlbum from 'react-photo-album';
9
+ import { concat, defer, BehaviorSubject } from 'rxjs';
10
+ import { withLatestFrom, debounceTime, distinctUntilChanged, switchMap, map } from 'rxjs/operators';
11
+ import styled from 'styled-components';
12
+ function UnsplashIcon() {
13
+ return /* @__PURE__ */jsxs("svg", {
14
+ role: "img",
15
+ viewBox: "0 0 25 25",
16
+ width: "1em",
17
+ height: "1em",
18
+ fill: "currentColor",
19
+ children: [/* @__PURE__ */jsx("title", {}), /* @__PURE__ */jsx("path", {
20
+ d: "M9 9V4h7v5H9Zm7 3h5v9H4v-9h5v5h7v-5Z"
21
+ })]
22
+ });
21
23
  }
22
- var React__default = /*#__PURE__*/_interopDefaultCompat(React);
23
- var PhotoAlbum__default = /*#__PURE__*/_interopDefaultCompat(PhotoAlbum);
24
- var styled__default = /*#__PURE__*/_interopDefaultCompat(styled);
25
- var InfiniteScroll__default = /*#__PURE__*/_interopDefaultCompat(InfiniteScroll);
26
- const Root = styled__default.default.div(_templateObject || (_templateObject = _taggedTemplateLiteral(["\n overflow: hidden;\n background-origin: content-box;\n background-repeat: no-repeat;\n background-clip: border-box;\n background-size: cover;\n position: relative;\n outline: none !important;\n border: ", ";\n box-sizing: content-box;\n user-drag: none;\n\n &:hover {\n opacity: 0.85;\n }\n\n &:focus,\n &:active {\n border: 1px solid var(--input-border-color-focus);\n box-shadow: inset 0 0 0 3px var(--input-border-color-focus);\n }\n"])), _ref => {
24
+ const fetchSearch = (client, query, page, perPage) => defer(() => client.observable.request({
25
+ url: "/addons/unsplash/search/photos?query=".concat(encodeURIComponent(query), "&page=").concat(page, "&per_page=").concat(perPage),
26
+ withCredentials: true,
27
+ method: "GET"
28
+ }));
29
+ const fetchList = (client, type, page, perPage) => defer(() => client.observable.request({
30
+ url: "/addons/unsplash/photos?order_by=".concat(type, "&page=").concat(page, "&per_page=").concat(perPage),
31
+ withCredentials: true,
32
+ method: "GET"
33
+ }));
34
+ function fetchDownloadUrl(client, photo) {
35
+ const downloadUrl = photo.links.download_location.replace("https://api.unsplash.com", "/addons/unsplash");
36
+ return client.request({
37
+ url: downloadUrl,
38
+ withCredentials: true,
39
+ method: "GET"
40
+ }).then(result => {
41
+ return result.url;
42
+ });
43
+ }
44
+ const search = (client, query, page, resultsPerPage) => {
45
+ return concat(query.pipe(withLatestFrom(page), debounceTime(500), distinctUntilChanged(), switchMap(_ref => {
46
+ let [q, p] = _ref;
47
+ if (q) {
48
+ return fetchSearch(client, q, p, resultsPerPage).pipe(distinctUntilChanged(), map(result => result.results));
49
+ }
50
+ return fetchList(client, "popular", p, resultsPerPage);
51
+ })));
52
+ };
53
+ const Root = styled.div(_templateObject || (_templateObject = _taggedTemplateLiteral(["\n overflow: hidden;\n background-origin: content-box;\n background-repeat: no-repeat;\n background-clip: border-box;\n background-size: cover;\n position: relative;\n outline: none !important;\n border: ", ";\n box-sizing: content-box;\n user-drag: none;\n\n &:hover {\n opacity: 0.85;\n }\n\n &:focus,\n &:active {\n border: 1px solid var(--input-border-color-focus);\n box-shadow: inset 0 0 0 3px var(--input-border-color-focus);\n }\n"])), _ref2 => {
27
54
  let {
28
55
  studioTheme
29
- } = _ref;
56
+ } = _ref2;
30
57
  return "1px solid ".concat(studioTheme.color.card.enabled.border);
31
58
  });
32
- const CreditLineLink = styled__default.default.a(_templateObject2 || (_templateObject2 = _taggedTemplateLiteral(["\n text-decoration: none;\n cursor: pointer;\n"])));
33
- const CreditLine = styled__default.default(ui.Card)(_templateObject3 || (_templateObject3 = _taggedTemplateLiteral(["\n ", ";\n user-drag: none;\n position: absolute;\n background-color: var(--creditline-bg);\n bottom: 0;\n\n [data-ui='Text'] {\n color: var(--creditline-fg);\n }\n"])), _ref2 => {
59
+ const CreditLineLink = styled.a(_templateObject2 || (_templateObject2 = _taggedTemplateLiteral(["\n text-decoration: none;\n cursor: pointer;\n"])));
60
+ const CreditLine = styled(Card)(_templateObject3 || (_templateObject3 = _taggedTemplateLiteral(["\n ", ";\n user-drag: none;\n position: absolute;\n background-color: var(--creditline-bg);\n bottom: 0;\n\n [data-ui='Text'] {\n color: var(--creditline-fg);\n }\n"])), _ref3 => {
34
61
  let {
35
62
  theme
36
- } = _ref2;
63
+ } = _ref3;
37
64
  return "\n --creditline-fg: ".concat(theme.sanity.color.card.enabled.fg, ";\n --creditline-bg: ").concat(theme.sanity.color.card.enabled.bg, ";\n ");
38
65
  });
39
66
  const UTM_SOURCE = "sanity-plugin-asset-source-unsplash";
@@ -47,32 +74,32 @@ function Photo(props) {
47
74
  width,
48
75
  height
49
76
  } = props;
50
- const handleClick = React.useCallback(() => {
77
+ const handleClick = useCallback(() => {
51
78
  onClick(data);
52
79
  }, [onClick, data]);
53
- const handleCreditLineClicked = React.useCallback(event => {
80
+ const handleCreditLineClicked = useCallback(event => {
54
81
  event.stopPropagation();
55
82
  const url = "".concat(data.links.html, "?utm_source=").concat(encodeURIComponent(UTM_SOURCE), "&utm_medium=referral");
56
83
  window.open(url, data.id, "noreferrer,noopener");
57
84
  }, [data]);
58
- const handleKeyDown = React.useCallback(event => {
85
+ const handleKeyDown = useCallback(event => {
59
86
  onKeyDown(event);
60
87
  if (event.keyCode === 13) {
61
88
  onClick(data);
62
89
  }
63
90
  }, [onKeyDown, data, onClick]);
64
- const handleMouseDown = React.useCallback(() => {
91
+ const handleMouseDown = useCallback(() => {
65
92
  onFocus(data);
66
93
  }, [onFocus, data]);
67
- React.useEffect(() => {
94
+ useEffect(() => {
68
95
  if (active) {
69
96
  onFocus(data);
70
97
  }
71
98
  }, [active, data, onFocus]);
72
99
  const src = data.urls.small;
73
100
  const userName = data.user.name;
74
- const theme = ui.useTheme().sanity;
75
- return /* @__PURE__ */jsxRuntime.jsx(Root, {
101
+ const theme = useTheme().sanity;
102
+ return /* @__PURE__ */jsx(Root, {
76
103
  studioTheme: theme,
77
104
  title: "Select image by ".concat(userName, " from Unsplash"),
78
105
  tabIndex: 0,
@@ -84,13 +111,13 @@ function Photo(props) {
84
111
  backgroundImage: "url(\"".concat(src, "\")")
85
112
  },
86
113
  onClick: handleClick,
87
- children: /* @__PURE__ */jsxRuntime.jsx(CreditLineLink, {
114
+ children: /* @__PURE__ */jsx(CreditLineLink, {
88
115
  onClick: handleCreditLineClicked,
89
- children: /* @__PURE__ */jsxRuntime.jsx(CreditLine, {
116
+ children: /* @__PURE__ */jsx(CreditLine, {
90
117
  padding: 2,
91
118
  radius: 2,
92
119
  margin: 2,
93
- children: /* @__PURE__ */jsxRuntime.jsxs(ui.Text, {
120
+ children: /* @__PURE__ */jsxs(Text, {
94
121
  size: 1,
95
122
  title: "Open image by ".concat(userName, " on Unsplash in new window"),
96
123
  children: ["By @", data.user.username]
@@ -99,50 +126,21 @@ function Photo(props) {
99
126
  })
100
127
  });
101
128
  }
102
- const fetchSearch = (client, query, page, perPage) => rxjs.defer(() => client.observable.request({
103
- url: "/addons/unsplash/search/photos?query=".concat(encodeURIComponent(query), "&page=").concat(page, "&per_page=").concat(perPage),
104
- withCredentials: true,
105
- method: "GET"
106
- }));
107
- const fetchList = (client, type, page, perPage) => rxjs.defer(() => client.observable.request({
108
- url: "/addons/unsplash/photos?order_by=".concat(type, "&page=").concat(page, "&per_page=").concat(perPage),
109
- withCredentials: true,
110
- method: "GET"
111
- }));
112
- function fetchDownloadUrl(client, photo) {
113
- const downloadUrl = photo.links.download_location.replace("https://api.unsplash.com", "/addons/unsplash");
114
- return client.request({
115
- url: downloadUrl,
116
- withCredentials: true,
117
- method: "GET"
118
- }).then(result => {
119
- return result.url;
120
- });
121
- }
122
- const search = (client, query, page, resultsPerPage) => {
123
- return rxjs.concat(query.pipe(operators.withLatestFrom(page), operators.debounceTime(500), operators.distinctUntilChanged(), operators.switchMap(_ref3 => {
124
- let [q, p] = _ref3;
125
- if (q) {
126
- return fetchSearch(client, q, p, resultsPerPage).pipe(operators.distinctUntilChanged(), operators.map(result => result.results));
127
- }
128
- return fetchList(client, "popular", p, resultsPerPage);
129
- })));
130
- };
131
- const Search = styled__default.default(ui.Stack)(_templateObject4 || (_templateObject4 = _taggedTemplateLiteral(["\n position: sticky;\n top: 0;\n z-index: 1;\n"])));
132
- styled__default.default.div(_templateObject5 || (_templateObject5 = _taggedTemplateLiteral(["\n overflow-y: auto;\n max-height: 80vh;\n"])));
129
+ const Search = styled(Stack)(_templateObject4 || (_templateObject4 = _taggedTemplateLiteral(["\n position: sticky;\n top: 0;\n z-index: 1;\n"])));
130
+ styled.div(_templateObject5 || (_templateObject5 = _taggedTemplateLiteral(["\n overflow-y: auto;\n max-height: 80vh;\n"])));
133
131
  const RESULTS_PER_PAGE = 42;
134
132
  const PHOTO_SPACING = 2;
135
133
  const PHOTO_PADDING = 1;
136
134
  function UnsplashAssetSource(props) {
137
- const client = sanity.useClient({
135
+ const client = useClient({
138
136
  apiVersion: "2022-09-01"
139
137
  });
140
- return /* @__PURE__ */jsxRuntime.jsx(UnsplashAssetSourceInternal, {
138
+ return /* @__PURE__ */jsx(UnsplashAssetSourceInternal, {
141
139
  ...props,
142
140
  client
143
141
  });
144
142
  }
145
- class UnsplashAssetSourceInternal extends React__default.default.Component {
143
+ class UnsplashAssetSourceInternal extends React.Component {
146
144
  constructor() {
147
145
  super(...arguments);
148
146
  this.state = {
@@ -153,8 +151,8 @@ class UnsplashAssetSourceInternal extends React__default.default.Component {
153
151
  isLoading: true
154
152
  };
155
153
  this.searchSubscription = null;
156
- this.searchSubject$ = new rxjs.BehaviorSubject("");
157
- this.pageSubject$ = new rxjs.BehaviorSubject(1);
154
+ this.searchSubject$ = new BehaviorSubject("");
155
+ this.pageSubject$ = new BehaviorSubject(1);
158
156
  this.handleSelect = photo => {
159
157
  this.setState({
160
158
  isLoading: true
@@ -228,7 +226,7 @@ class UnsplashAssetSourceInternal extends React__default.default.Component {
228
226
  layout
229
227
  } = props;
230
228
  const active = this.getPhotos().findIndex(result => result.id === photo.data.id) === this.state.cursor || false;
231
- return /* @__PURE__ */jsxRuntime.jsx(Photo, {
229
+ return /* @__PURE__ */jsx(Photo, {
232
230
  onClick: this.handleSelect.bind(photo.data),
233
231
  onKeyDown: this.handleKeyDown,
234
232
  data: photo.data,
@@ -263,53 +261,53 @@ class UnsplashAssetSourceInternal extends React__default.default.Component {
263
261
  searchResults,
264
262
  isLoading
265
263
  } = this.state;
266
- return /* @__PURE__ */jsxRuntime.jsx(ui.Dialog, {
264
+ return /* @__PURE__ */jsx(Dialog, {
267
265
  id: "unsplash-asset-source",
268
266
  header: "Select image from Unsplash",
269
267
  onClose: this.handleClose,
270
268
  open: true,
271
269
  width: 4,
272
- children: /* @__PURE__ */jsxRuntime.jsxs(ui.Stack, {
270
+ children: /* @__PURE__ */jsxs(Stack, {
273
271
  space: 3,
274
272
  padding: 4,
275
- children: [/* @__PURE__ */jsxRuntime.jsx(ui.Card, {
276
- children: /* @__PURE__ */jsxRuntime.jsxs(Search, {
273
+ children: [/* @__PURE__ */jsx(Card, {
274
+ children: /* @__PURE__ */jsxs(Search, {
277
275
  space: 3,
278
- children: [/* @__PURE__ */jsxRuntime.jsx(ui.Text, {
276
+ children: [/* @__PURE__ */jsx(Text, {
279
277
  size: 1,
280
278
  weight: "semibold",
281
279
  children: "Search Unsplash"
282
- }), /* @__PURE__ */jsxRuntime.jsx(ui.TextInput, {
280
+ }), /* @__PURE__ */jsx(TextInput, {
283
281
  label: "Search Unsplash.com",
284
282
  placeholder: "Topics or colors",
285
283
  value: query,
286
284
  onChange: this.handleSearchTermChanged
287
285
  })]
288
286
  })
289
- }), !isLoading && this.getPhotos().length === 0 && /* @__PURE__ */jsxRuntime.jsx(ui.Text, {
287
+ }), !isLoading && this.getPhotos().length === 0 && /* @__PURE__ */jsx(Text, {
290
288
  size: 1,
291
289
  muted: true,
292
290
  children: "No results found"
293
- }), /* @__PURE__ */jsxRuntime.jsx(InfiniteScroll__default.default, {
291
+ }), /* @__PURE__ */jsx(InfiniteScroll, {
294
292
  dataLength: this.getPhotos().length,
295
293
  next: this.handleScollerLoadMore,
296
294
  hasMore: true,
297
295
  scrollThreshold: 0.99,
298
296
  height: "60vh",
299
- loader: /* @__PURE__ */jsxRuntime.jsx(ui.Flex, {
297
+ loader: /* @__PURE__ */jsx(Flex, {
300
298
  align: "center",
301
299
  justify: "center",
302
300
  padding: 3,
303
- children: /* @__PURE__ */jsxRuntime.jsx(ui.Spinner, {
301
+ children: /* @__PURE__ */jsx(Spinner, {
304
302
  muted: true
305
303
  })
306
304
  }),
307
- endMessage: /* @__PURE__ */jsxRuntime.jsx(ui.Text, {
305
+ endMessage: /* @__PURE__ */jsx(Text, {
308
306
  size: 1,
309
307
  muted: true,
310
308
  children: "No more results"
311
309
  }),
312
- children: searchResults.filter(photos => photos.length > 0).map((photos, index) => /* @__PURE__ */jsxRuntime.jsx(PhotoAlbum__default.default, {
310
+ children: searchResults.filter(photos => photos.length > 0).map((photos, index) => /* @__PURE__ */jsx(PhotoAlbum, {
313
311
  layout: "rows",
314
312
  spacing: PHOTO_SPACING,
315
313
  padding: PHOTO_PADDING,
@@ -341,25 +339,13 @@ class UnsplashAssetSourceInternal extends React__default.default.Component {
341
339
  UnsplashAssetSourceInternal.defaultProps = {
342
340
  selectedAssets: void 0
343
341
  };
344
- function UnsplashIcon() {
345
- return /* @__PURE__ */jsxRuntime.jsxs("svg", {
346
- role: "img",
347
- viewBox: "0 0 25 25",
348
- width: "1em",
349
- height: "1em",
350
- fill: "currentColor",
351
- children: [/* @__PURE__ */jsxRuntime.jsx("title", {}), /* @__PURE__ */jsxRuntime.jsx("path", {
352
- d: "M9 9V4h7v5H9Zm7 3h5v9H4v-9h5v5h7v-5Z"
353
- })]
354
- });
355
- }
356
342
  const unsplashAssetSource = {
357
343
  name: "unsplash",
358
344
  title: "Unsplash",
359
345
  component: UnsplashAssetSource,
360
346
  icon: UnsplashIcon
361
347
  };
362
- const unsplashImageAsset = sanity.definePlugin({
348
+ const unsplashImageAsset = definePlugin({
363
349
  name: "asset-source-unsplash-plugin",
364
350
  form: {
365
351
  image: {
@@ -369,6 +355,5 @@ const unsplashImageAsset = sanity.definePlugin({
369
355
  }
370
356
  }
371
357
  });
372
- exports.unsplashAssetSource = unsplashAssetSource;
373
- exports.unsplashImageAsset = unsplashImageAsset;
358
+ export { unsplashAssetSource, unsplashImageAsset };
374
359
  //# sourceMappingURL=index.js.map
package/lib/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../src/components/Photo.styled.tsx","../src/components/Photo.tsx","../src/datastores/unsplash.ts","../src/components/UnsplashAssetSource.styled.tsx","../src/components/UnsplashAssetSource.tsx","../src/components/Icon.tsx","../src/index.ts"],"sourcesContent":["import { Card, Theme } from '@sanity/ui'\nimport styled from 'styled-components'\n\ntype SanityTheme = Theme['sanity']\n\ninterface Style {\n studioTheme: SanityTheme\n}\n\nexport const Root = styled.div`\n overflow: hidden;\n background-origin: content-box;\n background-repeat: no-repeat;\n background-clip: border-box;\n background-size: cover;\n position: relative;\n outline: none !important;\n border: ${({ studioTheme }: Style) => `1px solid ${studioTheme.color.card.enabled.border}`};\n box-sizing: content-box;\n user-drag: none;\n\n &:hover {\n opacity: 0.85;\n }\n\n &:focus,\n &:active {\n border: 1px solid var(--input-border-color-focus);\n box-shadow: inset 0 0 0 3px var(--input-border-color-focus);\n }\n`\n\nexport const CreditLineLink = styled.a`\n text-decoration: none;\n cursor: pointer;\n`\n\nexport const CreditLine = styled(Card)`\n ${({ theme }) => `\n --creditline-fg: ${theme.sanity.color.card.enabled.fg};\n --creditline-bg: ${theme.sanity.color.card.enabled.bg};\n `};\n user-drag: none;\n position: absolute;\n background-color: var(--creditline-bg);\n bottom: 0;\n\n [data-ui='Text'] {\n color: var(--creditline-fg);\n }\n`\n","import { Text, useTheme } from '@sanity/ui'\nimport React, { useCallback, useEffect } from 'react'\nimport { UnsplashPhoto } from '../types'\nimport { CreditLine, CreditLineLink, Root } from './Photo.styled'\n\ntype Props = {\n data: UnsplashPhoto\n width: number\n height: number\n onClick: (photo: UnsplashPhoto) => void\n onKeyDown: (event: any) => void\n active: boolean\n onFocus: (photo: UnsplashPhoto) => void\n}\n\nconst UTM_SOURCE = 'sanity-plugin-asset-source-unsplash'\n\nexport default function Photo(props: Props) {\n const { onClick, data, onKeyDown, onFocus, active, width, height } = props\n\n const handleClick = useCallback(() => {\n onClick(data)\n }, [onClick, data])\n\n const handleCreditLineClicked = useCallback(\n (event: any) => {\n event.stopPropagation()\n const url = `${data.links.html}?utm_source=${encodeURIComponent(\n UTM_SOURCE\n )}&utm_medium=referral`\n window.open(url, data.id, 'noreferrer,noopener')\n },\n [data]\n )\n\n const handleKeyDown = useCallback(\n (event: any) => {\n onKeyDown(event)\n if (event.keyCode === 13) {\n onClick(data)\n }\n },\n [onKeyDown, data, onClick]\n )\n\n const handleMouseDown = useCallback(() => {\n onFocus(data)\n }, [onFocus, data])\n\n useEffect(() => {\n if (active) {\n onFocus(data)\n }\n }, [active, data, onFocus])\n\n const src = data.urls.small\n const userName = data.user.name\n\n const theme = useTheme().sanity\n return (\n <Root\n studioTheme={theme}\n title={`Select image by ${userName} from Unsplash`}\n tabIndex={0}\n onKeyDown={handleKeyDown}\n onMouseDown={handleMouseDown}\n style={{\n width: `${width}px`,\n height: `${height}px`,\n backgroundImage: `url(\"${src}\")`,\n }}\n onClick={handleClick}\n >\n <CreditLineLink onClick={handleCreditLineClicked}>\n <CreditLine padding={2} radius={2} margin={2}>\n <Text size={1} title={`Open image by ${userName} on Unsplash in new window`}>\n By @{data.user.username}\n </Text>\n </CreditLine>\n </CreditLineLink>\n </Root>\n )\n}\n","import { defer, concat, BehaviorSubject, Observable } from 'rxjs'\nimport { debounceTime, switchMap, map, distinctUntilChanged, withLatestFrom } from 'rxjs/operators'\nimport { UnsplashPhoto } from '../types'\nimport { SanityClient } from '@sanity/client'\n\ntype SearchSubject = BehaviorSubject<string>\ntype PageSubject = BehaviorSubject<number>\n\nconst fetchSearch = (\n client: SanityClient,\n query: string,\n page: number,\n perPage: number\n): Observable<any> =>\n defer(\n () =>\n client.observable.request({\n url: `/addons/unsplash/search/photos?query=${encodeURIComponent(\n query\n )}&page=${page}&per_page=${perPage}`,\n withCredentials: true,\n method: 'GET',\n }) as any\n )\n\nconst fetchList = (\n client: SanityClient,\n type: string,\n page: number,\n perPage: number\n): Observable<any> =>\n defer(\n () =>\n client.observable.request({\n url: `/addons/unsplash/photos?order_by=${type}&page=${page}&per_page=${perPage}`,\n withCredentials: true,\n method: 'GET',\n }) as any\n )\n\nexport function fetchDownloadUrl(client: SanityClient, photo: UnsplashPhoto): Promise<string> {\n const downloadUrl = photo.links.download_location.replace(\n 'https://api.unsplash.com',\n '/addons/unsplash'\n )\n return client\n .request({\n url: downloadUrl,\n withCredentials: true,\n method: 'GET',\n })\n .then((result: { url: string }) => {\n return result.url\n })\n}\n\nexport const search = (\n client: SanityClient,\n query: SearchSubject,\n page: PageSubject,\n resultsPerPage: number\n): Observable<any> => {\n return concat(\n query.pipe(\n withLatestFrom(page),\n debounceTime(500),\n distinctUntilChanged(),\n switchMap(([q, p]) => {\n if (q) {\n return fetchSearch(client, q, p, resultsPerPage).pipe(\n distinctUntilChanged(),\n map((result) => result.results)\n )\n }\n return fetchList(client, 'popular', p, resultsPerPage)\n })\n )\n )\n}\n","import { Stack } from '@sanity/ui'\nimport styled from 'styled-components'\n\nexport const Search = styled(Stack)`\n position: sticky;\n top: 0;\n z-index: 1;\n`\n\nexport const Scroller = styled.div`\n overflow-y: auto;\n max-height: 80vh;\n`\n","import React from 'react'\nimport PhotoAlbum from 'react-photo-album'\nimport { BehaviorSubject, Subscription } from 'rxjs'\nimport { UnsplashPhoto } from '../types'\nimport Photo from './Photo'\nimport { fetchDownloadUrl, search } from '../datastores/unsplash'\nimport { Card, Dialog, Flex, Spinner, Stack, Text, TextInput } from '@sanity/ui'\nimport { Search } from './UnsplashAssetSource.styled'\nimport InfiniteScroll from 'react-infinite-scroll-component'\nimport { useClient, AssetSourceComponentProps, AssetFromSource } from 'sanity'\nimport { SanityClient } from '@sanity/client'\n\ntype State = {\n query: string\n searchResults: UnsplashPhoto[][]\n page: number\n isLoading: boolean\n cursor: number\n}\n\nconst RESULTS_PER_PAGE = 42\nconst PHOTO_SPACING = 2\nconst PHOTO_PADDING = 1 // offset the 1px border width\n\nexport default function UnsplashAssetSource(props: AssetSourceComponentProps) {\n const client = useClient({ apiVersion: '2022-09-01' })\n return <UnsplashAssetSourceInternal {...props} client={client} />\n}\n\nclass UnsplashAssetSourceInternal extends React.Component<\n AssetSourceComponentProps & { client: SanityClient },\n State\n> {\n static defaultProps = {\n selectedAssets: undefined,\n }\n\n state = {\n cursor: 0,\n query: '',\n page: 1,\n searchResults: [[]],\n isLoading: true,\n }\n\n searchSubscription: Subscription | null = null\n\n searchSubject$ = new BehaviorSubject('')\n pageSubject$ = new BehaviorSubject(1)\n\n componentDidMount() {\n this.searchSubscription = search(\n this.props.client,\n this.searchSubject$,\n this.pageSubject$,\n RESULTS_PER_PAGE\n ).subscribe({\n next: (results: UnsplashPhoto[]) => {\n this.setState((prev) => ({\n searchResults: [...prev.searchResults, results],\n isLoading: false,\n }))\n },\n })\n }\n\n componentWillUnmount() {\n if (this.searchSubscription) {\n this.searchSubscription.unsubscribe()\n }\n }\n\n handleSelect = (photo: UnsplashPhoto) => {\n this.setState({ isLoading: true })\n return fetchDownloadUrl(this.props.client, photo).then((downloadUrl) => {\n const description = photo.description || undefined\n const asset: AssetFromSource = {\n kind: 'url',\n value: downloadUrl,\n assetDocumentProps: {\n _type: 'sanity.imageAsset',\n source: {\n name: 'unsplash',\n id: photo.id,\n url: photo.links.html,\n },\n description,\n creditLine: `${photo.user.name} by Unsplash`,\n } as any,\n }\n this.props.onSelect([asset])\n })\n }\n\n handleClose = () => {\n this.props.onClose()\n }\n\n handleSearchTermChanged = (event: React.ChangeEvent<HTMLInputElement>) => {\n const query = event.currentTarget.value\n this.setState({ query, page: 1, searchResults: [[]], isLoading: true, cursor: 0 })\n this.pageSubject$.next(1)\n this.searchSubject$.next(query)\n }\n\n handleScollerLoadMore = () => {\n // eslint-disable-next-line react/no-access-state-in-setstate\n const nextPage = this.state.page + 1\n this.setState({ page: nextPage, isLoading: true })\n this.pageSubject$.next(nextPage)\n this.searchSubject$.next(this.state.query)\n }\n\n handleKeyDown = (event: any) => {\n const { cursor } = this.state\n if ((event.keyCode === 38 || event.keyCode === 37) && cursor > 0) {\n this.setState((prevState) => ({\n cursor: prevState.cursor - 1,\n }))\n } else if (\n (event.keyCode === 40 || event.keyCode === 39) &&\n cursor < this.getPhotos().length - 1\n ) {\n this.setState((prevState) => ({\n cursor: prevState.cursor + 1,\n }))\n }\n }\n\n getPhotos() {\n return this.state.searchResults.flat()\n }\n\n updateCursor = (photo: UnsplashPhoto) => {\n const index = this.getPhotos().findIndex((result: UnsplashPhoto) => result.id === photo.id)\n this.setState({ cursor: index })\n }\n\n renderImage = (props: any) => {\n const { photo, layout } = props\n const active =\n this.getPhotos().findIndex((result: UnsplashPhoto) => result.id === photo.data.id) ===\n this.state.cursor || false\n return (\n <Photo\n onClick={this.handleSelect.bind(photo.data)}\n onKeyDown={this.handleKeyDown}\n data={photo.data}\n width={layout.width}\n height={layout.height}\n active={active}\n onFocus={this.updateCursor}\n />\n )\n }\n\n render() {\n const { query, searchResults, isLoading } = this.state\n\n return (\n <Dialog\n id=\"unsplash-asset-source\"\n header=\"Select image from Unsplash\"\n onClose={this.handleClose}\n open\n width={4}\n >\n <Stack space={3} padding={4}>\n <Card>\n <Search space={3}>\n <Text size={1} weight=\"semibold\">\n Search Unsplash\n </Text>\n <TextInput\n label=\"Search Unsplash.com\"\n placeholder=\"Topics or colors\"\n value={query}\n onChange={this.handleSearchTermChanged}\n />\n </Search>\n </Card>\n {!isLoading && this.getPhotos().length === 0 && (\n <Text size={1} muted>\n No results found\n </Text>\n )}\n <InfiniteScroll\n dataLength={this.getPhotos().length} // This is important field to render the next data\n next={this.handleScollerLoadMore}\n // scrollableTarget=\"unsplash-scroller\"\n hasMore\n scrollThreshold={0.99}\n height=\"60vh\"\n loader={\n <Flex align=\"center\" justify=\"center\" padding={3}>\n <Spinner muted />\n </Flex>\n }\n endMessage={\n <Text size={1} muted>\n No more results\n </Text>\n }\n >\n {searchResults\n .filter((photos) => photos.length > 0)\n .map((photos: UnsplashPhoto[], index) => (\n <PhotoAlbum\n key={`gallery-${query || 'popular'}-${index}`}\n layout=\"rows\"\n spacing={PHOTO_SPACING}\n padding={PHOTO_PADDING}\n targetRowHeight={(width) => {\n if (width < 300) return 150\n else if (width < 600) return 200\n return 300\n }}\n photos={photos.map((photo: UnsplashPhoto) => ({\n src: photo.urls.small,\n width: photo.width,\n height: photo.height,\n key: photo.id,\n data: photo,\n }))}\n renderPhoto={this.renderImage}\n componentsProps={{\n containerProps: { style: { marginBottom: `${PHOTO_SPACING}px` } },\n }}\n />\n ))}\n </InfiniteScroll>\n </Stack>\n </Dialog>\n )\n }\n}\n","import React from 'react'\n\nexport default function UnsplashIcon() {\n return (\n <svg role=\"img\" viewBox=\"0 0 25 25\" width=\"1em\" height=\"1em\" fill=\"currentColor\">\n <title />\n <path d=\"M9 9V4h7v5H9Zm7 3h5v9H4v-9h5v5h7v-5Z\" />\n </svg>\n )\n}\n","import Unsplash from './components/UnsplashAssetSource'\nimport Icon from './components/Icon'\nimport { definePlugin, AssetSource } from 'sanity'\n\nexport type { UnsplashPhoto, Asset, AssetDocument } from './types'\n\n/**\n * @public\n */\nexport const unsplashAssetSource: AssetSource = {\n name: 'unsplash',\n title: 'Unsplash',\n component: Unsplash,\n icon: Icon,\n}\n\n/**\n * @public\n */\nexport const unsplashImageAsset = definePlugin({\n name: 'asset-source-unsplash-plugin',\n\n form: {\n image: {\n assetSources: (prev) => {\n return [...prev, unsplashAssetSource]\n },\n },\n },\n})\n"],"names":["Root","styled","default","div","_templateObject","_taggedTemplateLiteral","_ref","studioTheme","concat","color","card","enabled","border","CreditLineLink","a","_templateObject2","CreditLine","Card","_templateObject3","_ref2","theme","sanity","fg","bg","UTM_SOURCE","Photo","props","onClick","data","onKeyDown","onFocus","active","width","height","handleClick","useCallback","handleCreditLineClicked","event","stopPropagation","url","links","html","encodeURIComponent","window","open","id","handleKeyDown","keyCode","handleMouseDown","useEffect","src","urls","small","userName","user","name","useTheme","jsx","title","tabIndex","onMouseDown","style","backgroundImage","children","padding","radius","margin","jsxs","Text","size","username","fetchSearch","client","query","page","perPage","defer","observable","request","withCredentials","method","fetchList","type","fetchDownloadUrl","photo","downloadUrl","download_location","replace","then","result","search","resultsPerPage","pipe","withLatestFrom","debounceTime","distinctUntilChanged","switchMap","_ref3","q","p","map","results","Search","Stack","_templateObject4","_templateObject5","RESULTS_PER_PAGE","PHOTO_SPACING","PHOTO_PADDING","UnsplashAssetSource","useClient","apiVersion","UnsplashAssetSourceInternal","React","Component","constructor","arguments","state","cursor","searchResults","isLoading","searchSubscription","searchSubject$","BehaviorSubject","pageSubject$","handleSelect","setState","description","asset","kind","value","assetDocumentProps","_type","source","creditLine","onSelect","handleClose","onClose","handleSearchTermChanged","currentTarget","next","handleScollerLoadMore","nextPage","prevState","getPhotos","length","updateCursor","index","findIndex","renderImage","layout","bind","componentDidMount","subscribe","prev","componentWillUnmount","unsubscribe","flat","render","Dialog","header","space","weight","TextInput","label","placeholder","onChange","muted","InfiniteScroll","dataLength","hasMore","scrollThreshold","loader","Flex","align","justify","Spinner","endMessage","filter","photos","PhotoAlbum","spacing","targetRowHeight","key","renderPhoto","componentsProps","containerProps","marginBottom","defaultProps","selectedAssets","UnsplashIcon","role","viewBox","fill","d","unsplashAssetSource","component","Unsplash","icon","Icon","unsplashImageAsset","definePlugin","form","image","assetSources"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sources":["../src/components/Icon.tsx","../src/datastores/unsplash.ts","../src/components/Photo.styled.tsx","../src/components/Photo.tsx","../src/components/UnsplashAssetSource.styled.tsx","../src/components/UnsplashAssetSource.tsx","../src/index.ts"],"sourcesContent":["import React from 'react'\n\nexport default function UnsplashIcon() {\n return (\n <svg role=\"img\" viewBox=\"0 0 25 25\" width=\"1em\" height=\"1em\" fill=\"currentColor\">\n <title />\n <path d=\"M9 9V4h7v5H9Zm7 3h5v9H4v-9h5v5h7v-5Z\" />\n </svg>\n )\n}\n","import { SanityClient } from '@sanity/client'\nimport { BehaviorSubject, concat, defer, Observable } from 'rxjs'\nimport { debounceTime, distinctUntilChanged, map, switchMap, withLatestFrom } from 'rxjs/operators'\n\nimport { UnsplashPhoto } from '../types'\n\ntype SearchSubject = BehaviorSubject<string>\ntype PageSubject = BehaviorSubject<number>\n\nconst fetchSearch = (\n client: SanityClient,\n query: string,\n page: number,\n perPage: number\n): Observable<any> =>\n defer(\n () =>\n client.observable.request({\n url: `/addons/unsplash/search/photos?query=${encodeURIComponent(\n query\n )}&page=${page}&per_page=${perPage}`,\n withCredentials: true,\n method: 'GET',\n }) as any\n )\n\nconst fetchList = (\n client: SanityClient,\n type: string,\n page: number,\n perPage: number\n): Observable<any> =>\n defer(\n () =>\n client.observable.request({\n url: `/addons/unsplash/photos?order_by=${type}&page=${page}&per_page=${perPage}`,\n withCredentials: true,\n method: 'GET',\n }) as any\n )\n\nexport function fetchDownloadUrl(client: SanityClient, photo: UnsplashPhoto): Promise<string> {\n const downloadUrl = photo.links.download_location.replace(\n 'https://api.unsplash.com',\n '/addons/unsplash'\n )\n return client\n .request({\n url: downloadUrl,\n withCredentials: true,\n method: 'GET',\n })\n .then((result: { url: string }) => {\n return result.url\n })\n}\n\nexport const search = (\n client: SanityClient,\n query: SearchSubject,\n page: PageSubject,\n resultsPerPage: number\n): Observable<any> => {\n return concat(\n query.pipe(\n withLatestFrom(page),\n debounceTime(500),\n distinctUntilChanged(),\n switchMap(([q, p]) => {\n if (q) {\n return fetchSearch(client, q, p, resultsPerPage).pipe(\n distinctUntilChanged(),\n map((result) => result.results)\n )\n }\n return fetchList(client, 'popular', p, resultsPerPage)\n })\n )\n )\n}\n","import { Card, Theme } from '@sanity/ui'\nimport styled from 'styled-components'\n\ntype SanityTheme = Theme['sanity']\n\ninterface Style {\n studioTheme: SanityTheme\n}\n\nexport const Root = styled.div`\n overflow: hidden;\n background-origin: content-box;\n background-repeat: no-repeat;\n background-clip: border-box;\n background-size: cover;\n position: relative;\n outline: none !important;\n border: ${({ studioTheme }: Style) => `1px solid ${studioTheme.color.card.enabled.border}`};\n box-sizing: content-box;\n user-drag: none;\n\n &:hover {\n opacity: 0.85;\n }\n\n &:focus,\n &:active {\n border: 1px solid var(--input-border-color-focus);\n box-shadow: inset 0 0 0 3px var(--input-border-color-focus);\n }\n`\n\nexport const CreditLineLink = styled.a`\n text-decoration: none;\n cursor: pointer;\n`\n\nexport const CreditLine = styled(Card)`\n ${({ theme }) => `\n --creditline-fg: ${theme.sanity.color.card.enabled.fg};\n --creditline-bg: ${theme.sanity.color.card.enabled.bg};\n `};\n user-drag: none;\n position: absolute;\n background-color: var(--creditline-bg);\n bottom: 0;\n\n [data-ui='Text'] {\n color: var(--creditline-fg);\n }\n`\n","import { Text, useTheme } from '@sanity/ui'\nimport React, { useCallback, useEffect } from 'react'\n\nimport { UnsplashPhoto } from '../types'\nimport { CreditLine, CreditLineLink, Root } from './Photo.styled'\n\ntype Props = {\n data: UnsplashPhoto\n width: number\n height: number\n onClick: (photo: UnsplashPhoto) => void\n onKeyDown: (event: any) => void\n active: boolean\n onFocus: (photo: UnsplashPhoto) => void\n}\n\nconst UTM_SOURCE = 'sanity-plugin-asset-source-unsplash'\n\nexport default function Photo(props: Props) {\n const { onClick, data, onKeyDown, onFocus, active, width, height } = props\n\n const handleClick = useCallback(() => {\n onClick(data)\n }, [onClick, data])\n\n const handleCreditLineClicked = useCallback(\n (event: any) => {\n event.stopPropagation()\n const url = `${data.links.html}?utm_source=${encodeURIComponent(\n UTM_SOURCE\n )}&utm_medium=referral`\n window.open(url, data.id, 'noreferrer,noopener')\n },\n [data]\n )\n\n const handleKeyDown = useCallback(\n (event: any) => {\n onKeyDown(event)\n if (event.keyCode === 13) {\n onClick(data)\n }\n },\n [onKeyDown, data, onClick]\n )\n\n const handleMouseDown = useCallback(() => {\n onFocus(data)\n }, [onFocus, data])\n\n useEffect(() => {\n if (active) {\n onFocus(data)\n }\n }, [active, data, onFocus])\n\n const src = data.urls.small\n const userName = data.user.name\n\n const theme = useTheme().sanity\n return (\n <Root\n studioTheme={theme}\n title={`Select image by ${userName} from Unsplash`}\n tabIndex={0}\n onKeyDown={handleKeyDown}\n onMouseDown={handleMouseDown}\n style={{\n width: `${width}px`,\n height: `${height}px`,\n backgroundImage: `url(\"${src}\")`,\n }}\n onClick={handleClick}\n >\n <CreditLineLink onClick={handleCreditLineClicked}>\n <CreditLine padding={2} radius={2} margin={2}>\n <Text size={1} title={`Open image by ${userName} on Unsplash in new window`}>\n By @{data.user.username}\n </Text>\n </CreditLine>\n </CreditLineLink>\n </Root>\n )\n}\n","import { Stack } from '@sanity/ui'\nimport styled from 'styled-components'\n\nexport const Search = styled(Stack)`\n position: sticky;\n top: 0;\n z-index: 1;\n`\n\nexport const Scroller = styled.div`\n overflow-y: auto;\n max-height: 80vh;\n`\n","import { SanityClient } from '@sanity/client'\nimport { Card, Dialog, Flex, Spinner, Stack, Text, TextInput } from '@sanity/ui'\nimport React from 'react'\nimport InfiniteScroll from 'react-infinite-scroll-component'\nimport PhotoAlbum from 'react-photo-album'\nimport { BehaviorSubject, Subscription } from 'rxjs'\nimport { AssetFromSource, AssetSourceComponentProps, useClient } from 'sanity'\n\nimport { fetchDownloadUrl, search } from '../datastores/unsplash'\nimport { UnsplashPhoto } from '../types'\nimport Photo from './Photo'\nimport { Search } from './UnsplashAssetSource.styled'\n\ntype State = {\n query: string\n searchResults: UnsplashPhoto[][]\n page: number\n isLoading: boolean\n cursor: number\n}\n\nconst RESULTS_PER_PAGE = 42\nconst PHOTO_SPACING = 2\nconst PHOTO_PADDING = 1 // offset the 1px border width\n\nexport default function UnsplashAssetSource(props: AssetSourceComponentProps) {\n const client = useClient({ apiVersion: '2022-09-01' })\n return <UnsplashAssetSourceInternal {...props} client={client} />\n}\n\nclass UnsplashAssetSourceInternal extends React.Component<\n AssetSourceComponentProps & { client: SanityClient },\n State\n> {\n static defaultProps = {\n selectedAssets: undefined,\n }\n\n state = {\n cursor: 0,\n query: '',\n page: 1,\n searchResults: [[]],\n isLoading: true,\n }\n\n searchSubscription: Subscription | null = null\n\n searchSubject$ = new BehaviorSubject('')\n pageSubject$ = new BehaviorSubject(1)\n\n componentDidMount() {\n this.searchSubscription = search(\n this.props.client,\n this.searchSubject$,\n this.pageSubject$,\n RESULTS_PER_PAGE\n ).subscribe({\n next: (results: UnsplashPhoto[]) => {\n this.setState((prev) => ({\n searchResults: [...prev.searchResults, results],\n isLoading: false,\n }))\n },\n })\n }\n\n componentWillUnmount() {\n if (this.searchSubscription) {\n this.searchSubscription.unsubscribe()\n }\n }\n\n handleSelect = (photo: UnsplashPhoto) => {\n this.setState({ isLoading: true })\n return fetchDownloadUrl(this.props.client, photo).then((downloadUrl) => {\n const description = photo.description || undefined\n const asset: AssetFromSource = {\n kind: 'url',\n value: downloadUrl,\n assetDocumentProps: {\n _type: 'sanity.imageAsset',\n source: {\n name: 'unsplash',\n id: photo.id,\n url: photo.links.html,\n },\n description,\n creditLine: `${photo.user.name} by Unsplash`,\n } as any,\n }\n this.props.onSelect([asset])\n })\n }\n\n handleClose = () => {\n this.props.onClose()\n }\n\n handleSearchTermChanged = (event: React.ChangeEvent<HTMLInputElement>) => {\n const query = event.currentTarget.value\n this.setState({ query, page: 1, searchResults: [[]], isLoading: true, cursor: 0 })\n this.pageSubject$.next(1)\n this.searchSubject$.next(query)\n }\n\n handleScollerLoadMore = () => {\n // eslint-disable-next-line react/no-access-state-in-setstate\n const nextPage = this.state.page + 1\n this.setState({ page: nextPage, isLoading: true })\n this.pageSubject$.next(nextPage)\n this.searchSubject$.next(this.state.query)\n }\n\n handleKeyDown = (event: any) => {\n const { cursor } = this.state\n if ((event.keyCode === 38 || event.keyCode === 37) && cursor > 0) {\n this.setState((prevState) => ({\n cursor: prevState.cursor - 1,\n }))\n } else if (\n (event.keyCode === 40 || event.keyCode === 39) &&\n cursor < this.getPhotos().length - 1\n ) {\n this.setState((prevState) => ({\n cursor: prevState.cursor + 1,\n }))\n }\n }\n\n getPhotos() {\n return this.state.searchResults.flat()\n }\n\n updateCursor = (photo: UnsplashPhoto) => {\n const index = this.getPhotos().findIndex((result: UnsplashPhoto) => result.id === photo.id)\n this.setState({ cursor: index })\n }\n\n renderImage = (props: any) => {\n const { photo, layout } = props\n const active =\n this.getPhotos().findIndex((result: UnsplashPhoto) => result.id === photo.data.id) ===\n this.state.cursor || false\n return (\n <Photo\n onClick={this.handleSelect.bind(photo.data)}\n onKeyDown={this.handleKeyDown}\n data={photo.data}\n width={layout.width}\n height={layout.height}\n active={active}\n onFocus={this.updateCursor}\n />\n )\n }\n\n render() {\n const { query, searchResults, isLoading } = this.state\n\n return (\n <Dialog\n id=\"unsplash-asset-source\"\n header=\"Select image from Unsplash\"\n onClose={this.handleClose}\n open\n width={4}\n >\n <Stack space={3} padding={4}>\n <Card>\n <Search space={3}>\n <Text size={1} weight=\"semibold\">\n Search Unsplash\n </Text>\n <TextInput\n label=\"Search Unsplash.com\"\n placeholder=\"Topics or colors\"\n value={query}\n onChange={this.handleSearchTermChanged}\n />\n </Search>\n </Card>\n {!isLoading && this.getPhotos().length === 0 && (\n <Text size={1} muted>\n No results found\n </Text>\n )}\n <InfiniteScroll\n dataLength={this.getPhotos().length} // This is important field to render the next data\n next={this.handleScollerLoadMore}\n // scrollableTarget=\"unsplash-scroller\"\n hasMore\n scrollThreshold={0.99}\n height=\"60vh\"\n loader={\n <Flex align=\"center\" justify=\"center\" padding={3}>\n <Spinner muted />\n </Flex>\n }\n endMessage={\n <Text size={1} muted>\n No more results\n </Text>\n }\n >\n {searchResults\n .filter((photos) => photos.length > 0)\n .map((photos: UnsplashPhoto[], index) => (\n <PhotoAlbum\n // eslint-disable-next-line react/no-array-index-key\n key={`gallery-${query || 'popular'}-${index}`}\n layout=\"rows\"\n spacing={PHOTO_SPACING}\n padding={PHOTO_PADDING}\n targetRowHeight={(width) => {\n if (width < 300) return 150\n else if (width < 600) return 200\n return 300\n }}\n photos={photos.map((photo: UnsplashPhoto) => ({\n src: photo.urls.small,\n width: photo.width,\n height: photo.height,\n key: photo.id,\n data: photo,\n }))}\n renderPhoto={this.renderImage}\n componentsProps={{\n containerProps: { style: { marginBottom: `${PHOTO_SPACING}px` } },\n }}\n />\n ))}\n </InfiniteScroll>\n </Stack>\n </Dialog>\n )\n }\n}\n","import { AssetSource, definePlugin } from 'sanity'\n\nimport Icon from './components/Icon'\nimport Unsplash from './components/UnsplashAssetSource'\n\nexport type { Asset, AssetDocument, UnsplashPhoto } from './types'\n\n/**\n * @public\n */\nexport const unsplashAssetSource: AssetSource = {\n name: 'unsplash',\n title: 'Unsplash',\n component: Unsplash,\n icon: Icon,\n}\n\n/**\n * @public\n */\nexport const unsplashImageAsset = definePlugin({\n name: 'asset-source-unsplash-plugin',\n\n form: {\n image: {\n assetSources: (prev) => {\n return [...prev, unsplashAssetSource]\n },\n },\n },\n})\n"],"names":["UnsplashIcon","jsxs","role","viewBox","width","height","fill","children","jsx","d","fetchSearch","client","query","page","perPage","defer","observable","request","url","encodeURIComponent","concat","withCredentials","method","fetchList","type","fetchDownloadUrl","photo","downloadUrl","links","download_location","replace","then","result","search","resultsPerPage","pipe","withLatestFrom","debounceTime","distinctUntilChanged","switchMap","_ref","q","p","map","results","Root","styled","div","_templateObject","_taggedTemplateLiteral","_ref2","studioTheme","color","card","enabled","border","CreditLineLink","a","_templateObject2","CreditLine","Card","_templateObject3","_ref3","theme","sanity","fg","bg","UTM_SOURCE","Photo","props","onClick","data","onKeyDown","onFocus","active","handleClick","useCallback","handleCreditLineClicked","event","stopPropagation","html","window","open","id","handleKeyDown","keyCode","handleMouseDown","useEffect","src","urls","small","userName","user","name","useTheme","title","tabIndex","onMouseDown","style","backgroundImage","padding","radius","margin","Text","size","username","Search","Stack","_templateObject4","_templateObject5","RESULTS_PER_PAGE","PHOTO_SPACING","PHOTO_PADDING","UnsplashAssetSource","useClient","apiVersion","UnsplashAssetSourceInternal","React","Component","constructor","arguments","state","cursor","searchResults","isLoading","searchSubscription","searchSubject$","BehaviorSubject","pageSubject$","handleSelect","setState","description","asset","kind","value","assetDocumentProps","_type","source","creditLine","onSelect","handleClose","onClose","handleSearchTermChanged","currentTarget","next","handleScollerLoadMore","nextPage","prevState","getPhotos","length","updateCursor","index","findIndex","renderImage","layout","bind","componentDidMount","subscribe","prev","componentWillUnmount","unsubscribe","flat","render","Dialog","header","space","weight","TextInput","label","placeholder","onChange","muted","InfiniteScroll","dataLength","hasMore","scrollThreshold","loader","Flex","align","justify","Spinner","endMessage","filter","photos","PhotoAlbum","spacing","targetRowHeight","key","renderPhoto","componentsProps","containerProps","marginBottom","defaultProps","selectedAssets","unsplashAssetSource","component","Unsplash","icon","Icon","unsplashImageAsset","definePlugin","form","image","assetSources"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "sanity-plugin-asset-source-unsplash",
3
- "version": "1.0.7",
3
+ "version": "1.1.0",
4
4
  "description": "Use images from Unsplash.com in your Sanity Studio",
5
5
  "keywords": [
6
6
  "sanity",
@@ -21,18 +21,23 @@
21
21
  "license": "MIT",
22
22
  "author": "Sanity.io <hello@sanity.io>",
23
23
  "sideEffects": false,
24
+ "type": "module",
24
25
  "exports": {
25
26
  ".": {
26
27
  "types": "./lib/index.d.ts",
27
28
  "source": "./src/index.ts",
28
- "require": "./lib/index.js",
29
- "import": "./lib/index.esm.js",
30
- "default": "./lib/index.esm.js"
29
+ "require": "./lib/index.cjs",
30
+ "node": {
31
+ "import": "./lib/index.cjs.js",
32
+ "require": "./lib/index.cjs"
33
+ },
34
+ "import": "./lib/index.js",
35
+ "default": "./lib/index.js"
31
36
  },
32
37
  "./package.json": "./package.json"
33
38
  },
34
- "main": "./lib/index.js",
35
- "module": "./lib/index.esm.js",
39
+ "main": "./lib/index.cjs",
40
+ "module": "./lib/index.js",
36
41
  "source": "./src/index.ts",
37
42
  "types": "./lib/index.d.ts",
38
43
  "files": [
@@ -42,19 +47,16 @@
42
47
  "v2-incompatible.js"
43
48
  ],
44
49
  "scripts": {
45
- "prebuild": "npm run clean && plugin-kit verify-package --silent && pkg-utils",
46
50
  "build": "run-s clean && plugin-kit verify-package --silent && pkg-utils build --strict && pkg-utils --strict",
47
51
  "clean": "rimraf lib",
48
- "compile": "tsc --noEmit",
49
- "deploy-docs": "ts-node tools/gh-pages-publish",
52
+ "dev": "next dev",
50
53
  "format": "prettier --write --cache --ignore-unknown .",
51
54
  "link-watch": "plugin-kit link-watch",
52
55
  "lint": "eslint .",
53
- "precommit": "lint-staged",
54
- "prepare": "husky install",
56
+ "prepare": "husky install || true",
55
57
  "prepublishOnly": "run-s build",
56
- "report-coverage": "cat ./coverage/lcov.info | coveralls",
57
- "test": "echo 'no tests for now'",
58
+ "test": "npm run lint && npm run type-check && npm run build",
59
+ "type-check": "tsc --noEmit",
58
60
  "watch": "pkg-utils watch --strict"
59
61
  },
60
62
  "dependencies": {
@@ -70,43 +72,36 @@
70
72
  "@sanity/pkg-utils": "^2.2.16",
71
73
  "@sanity/plugin-kit": "^3.1.7",
72
74
  "@sanity/semantic-release-preset": "^4.1.1",
73
- "@types/node": "^20.2.3",
75
+ "@types/node": "^18.0.0",
74
76
  "@types/react": "^18.2.6",
75
77
  "@types/react-dom": "^18",
76
78
  "@types/styled-components": "^5.1.26",
77
79
  "@typescript-eslint/eslint-plugin": "^5.59.7",
78
80
  "@typescript-eslint/parser": "^5.59.7",
79
- "colors": "^1.4.0",
80
- "coveralls": "^3.1.1",
81
- "cross-env": "^7.0.3",
82
- "eslint": "^8.41.0",
83
- "eslint-config-prettier": "^8.8.0",
81
+ "eslint": "^8.36.0",
82
+ "eslint-config-prettier": "^8.7.0",
83
+ "eslint-config-react-app": "^7.0.1",
84
84
  "eslint-config-sanity": "^6.0.0",
85
+ "eslint-plugin-import": "^2.27.5",
85
86
  "eslint-plugin-prettier": "^4.2.1",
86
87
  "eslint-plugin-react": "^7.32.2",
87
88
  "eslint-plugin-react-hooks": "^4.6.0",
89
+ "eslint-plugin-simple-import-sort": "^10.0.0",
88
90
  "husky": "^8.0.3",
89
91
  "lint-staged": "^13.2.2",
90
92
  "npm-run-all": "^4.1.5",
91
93
  "prettier": "^2.8.8",
92
94
  "prettier-plugin-packagejson": "^2.4.3",
93
- "prompt": "^1.3.0",
94
95
  "react": "^18.2.0",
95
96
  "react-dom": "^18.2.0",
96
97
  "react-is": "^18.2.0",
97
- "replace-in-file": "^6.3.5",
98
98
  "rimraf": "^5.0.1",
99
99
  "sanity": "^3.11.1",
100
- "shelljs": "^0.8.5",
101
100
  "styled-components": "^5.3.10",
102
- "ts-node": "^10.9.1",
103
- "tslint-config-prettier": "^1.18.0",
104
- "tslint-config-standard": "^9.0.0",
105
101
  "typescript": "^5.0.4"
106
102
  },
107
103
  "peerDependencies": {
108
104
  "react": "^18",
109
- "react-dom": "^18",
110
105
  "sanity": "^3",
111
106
  "styled-components": "^5.2"
112
107
  },
@@ -1,5 +1,6 @@
1
1
  import { Text, useTheme } from '@sanity/ui'
2
2
  import React, { useCallback, useEffect } from 'react'
3
+
3
4
  import { UnsplashPhoto } from '../types'
4
5
  import { CreditLine, CreditLineLink, Root } from './Photo.styled'
5
6
 
@@ -1,14 +1,15 @@
1
+ import { SanityClient } from '@sanity/client'
2
+ import { Card, Dialog, Flex, Spinner, Stack, Text, TextInput } from '@sanity/ui'
1
3
  import React from 'react'
4
+ import InfiniteScroll from 'react-infinite-scroll-component'
2
5
  import PhotoAlbum from 'react-photo-album'
3
6
  import { BehaviorSubject, Subscription } from 'rxjs'
7
+ import { AssetFromSource, AssetSourceComponentProps, useClient } from 'sanity'
8
+
9
+ import { fetchDownloadUrl, search } from '../datastores/unsplash'
4
10
  import { UnsplashPhoto } from '../types'
5
11
  import Photo from './Photo'
6
- import { fetchDownloadUrl, search } from '../datastores/unsplash'
7
- import { Card, Dialog, Flex, Spinner, Stack, Text, TextInput } from '@sanity/ui'
8
12
  import { Search } from './UnsplashAssetSource.styled'
9
- import InfiniteScroll from 'react-infinite-scroll-component'
10
- import { useClient, AssetSourceComponentProps, AssetFromSource } from 'sanity'
11
- import { SanityClient } from '@sanity/client'
12
13
 
13
14
  type State = {
14
15
  query: string
@@ -206,6 +207,7 @@ class UnsplashAssetSourceInternal extends React.Component<
206
207
  .filter((photos) => photos.length > 0)
207
208
  .map((photos: UnsplashPhoto[], index) => (
208
209
  <PhotoAlbum
210
+ // eslint-disable-next-line react/no-array-index-key
209
211
  key={`gallery-${query || 'popular'}-${index}`}
210
212
  layout="rows"
211
213
  spacing={PHOTO_SPACING}
@@ -1,7 +1,8 @@
1
- import { defer, concat, BehaviorSubject, Observable } from 'rxjs'
2
- import { debounceTime, switchMap, map, distinctUntilChanged, withLatestFrom } from 'rxjs/operators'
3
- import { UnsplashPhoto } from '../types'
4
1
  import { SanityClient } from '@sanity/client'
2
+ import { BehaviorSubject, concat, defer, Observable } from 'rxjs'
3
+ import { debounceTime, distinctUntilChanged, map, switchMap, withLatestFrom } from 'rxjs/operators'
4
+
5
+ import { UnsplashPhoto } from '../types'
5
6
 
6
7
  type SearchSubject = BehaviorSubject<string>
7
8
  type PageSubject = BehaviorSubject<number>
package/src/index.ts CHANGED
@@ -1,8 +1,9 @@
1
- import Unsplash from './components/UnsplashAssetSource'
1
+ import { AssetSource, definePlugin } from 'sanity'
2
+
2
3
  import Icon from './components/Icon'
3
- import { definePlugin, AssetSource } from 'sanity'
4
+ import Unsplash from './components/UnsplashAssetSource'
4
5
 
5
- export type { UnsplashPhoto, Asset, AssetDocument } from './types'
6
+ export type { Asset, AssetDocument, UnsplashPhoto } from './types'
6
7
 
7
8
  /**
8
9
  * @public
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.esm.js","sources":["../src/components/Photo.styled.tsx","../src/components/Photo.tsx","../src/datastores/unsplash.ts","../src/components/UnsplashAssetSource.styled.tsx","../src/components/UnsplashAssetSource.tsx","../src/components/Icon.tsx","../src/index.ts"],"sourcesContent":["import { Card, Theme } from '@sanity/ui'\nimport styled from 'styled-components'\n\ntype SanityTheme = Theme['sanity']\n\ninterface Style {\n studioTheme: SanityTheme\n}\n\nexport const Root = styled.div`\n overflow: hidden;\n background-origin: content-box;\n background-repeat: no-repeat;\n background-clip: border-box;\n background-size: cover;\n position: relative;\n outline: none !important;\n border: ${({ studioTheme }: Style) => `1px solid ${studioTheme.color.card.enabled.border}`};\n box-sizing: content-box;\n user-drag: none;\n\n &:hover {\n opacity: 0.85;\n }\n\n &:focus,\n &:active {\n border: 1px solid var(--input-border-color-focus);\n box-shadow: inset 0 0 0 3px var(--input-border-color-focus);\n }\n`\n\nexport const CreditLineLink = styled.a`\n text-decoration: none;\n cursor: pointer;\n`\n\nexport const CreditLine = styled(Card)`\n ${({ theme }) => `\n --creditline-fg: ${theme.sanity.color.card.enabled.fg};\n --creditline-bg: ${theme.sanity.color.card.enabled.bg};\n `};\n user-drag: none;\n position: absolute;\n background-color: var(--creditline-bg);\n bottom: 0;\n\n [data-ui='Text'] {\n color: var(--creditline-fg);\n }\n`\n","import { Text, useTheme } from '@sanity/ui'\nimport React, { useCallback, useEffect } from 'react'\nimport { UnsplashPhoto } from '../types'\nimport { CreditLine, CreditLineLink, Root } from './Photo.styled'\n\ntype Props = {\n data: UnsplashPhoto\n width: number\n height: number\n onClick: (photo: UnsplashPhoto) => void\n onKeyDown: (event: any) => void\n active: boolean\n onFocus: (photo: UnsplashPhoto) => void\n}\n\nconst UTM_SOURCE = 'sanity-plugin-asset-source-unsplash'\n\nexport default function Photo(props: Props) {\n const { onClick, data, onKeyDown, onFocus, active, width, height } = props\n\n const handleClick = useCallback(() => {\n onClick(data)\n }, [onClick, data])\n\n const handleCreditLineClicked = useCallback(\n (event: any) => {\n event.stopPropagation()\n const url = `${data.links.html}?utm_source=${encodeURIComponent(\n UTM_SOURCE\n )}&utm_medium=referral`\n window.open(url, data.id, 'noreferrer,noopener')\n },\n [data]\n )\n\n const handleKeyDown = useCallback(\n (event: any) => {\n onKeyDown(event)\n if (event.keyCode === 13) {\n onClick(data)\n }\n },\n [onKeyDown, data, onClick]\n )\n\n const handleMouseDown = useCallback(() => {\n onFocus(data)\n }, [onFocus, data])\n\n useEffect(() => {\n if (active) {\n onFocus(data)\n }\n }, [active, data, onFocus])\n\n const src = data.urls.small\n const userName = data.user.name\n\n const theme = useTheme().sanity\n return (\n <Root\n studioTheme={theme}\n title={`Select image by ${userName} from Unsplash`}\n tabIndex={0}\n onKeyDown={handleKeyDown}\n onMouseDown={handleMouseDown}\n style={{\n width: `${width}px`,\n height: `${height}px`,\n backgroundImage: `url(\"${src}\")`,\n }}\n onClick={handleClick}\n >\n <CreditLineLink onClick={handleCreditLineClicked}>\n <CreditLine padding={2} radius={2} margin={2}>\n <Text size={1} title={`Open image by ${userName} on Unsplash in new window`}>\n By @{data.user.username}\n </Text>\n </CreditLine>\n </CreditLineLink>\n </Root>\n )\n}\n","import { defer, concat, BehaviorSubject, Observable } from 'rxjs'\nimport { debounceTime, switchMap, map, distinctUntilChanged, withLatestFrom } from 'rxjs/operators'\nimport { UnsplashPhoto } from '../types'\nimport { SanityClient } from '@sanity/client'\n\ntype SearchSubject = BehaviorSubject<string>\ntype PageSubject = BehaviorSubject<number>\n\nconst fetchSearch = (\n client: SanityClient,\n query: string,\n page: number,\n perPage: number\n): Observable<any> =>\n defer(\n () =>\n client.observable.request({\n url: `/addons/unsplash/search/photos?query=${encodeURIComponent(\n query\n )}&page=${page}&per_page=${perPage}`,\n withCredentials: true,\n method: 'GET',\n }) as any\n )\n\nconst fetchList = (\n client: SanityClient,\n type: string,\n page: number,\n perPage: number\n): Observable<any> =>\n defer(\n () =>\n client.observable.request({\n url: `/addons/unsplash/photos?order_by=${type}&page=${page}&per_page=${perPage}`,\n withCredentials: true,\n method: 'GET',\n }) as any\n )\n\nexport function fetchDownloadUrl(client: SanityClient, photo: UnsplashPhoto): Promise<string> {\n const downloadUrl = photo.links.download_location.replace(\n 'https://api.unsplash.com',\n '/addons/unsplash'\n )\n return client\n .request({\n url: downloadUrl,\n withCredentials: true,\n method: 'GET',\n })\n .then((result: { url: string }) => {\n return result.url\n })\n}\n\nexport const search = (\n client: SanityClient,\n query: SearchSubject,\n page: PageSubject,\n resultsPerPage: number\n): Observable<any> => {\n return concat(\n query.pipe(\n withLatestFrom(page),\n debounceTime(500),\n distinctUntilChanged(),\n switchMap(([q, p]) => {\n if (q) {\n return fetchSearch(client, q, p, resultsPerPage).pipe(\n distinctUntilChanged(),\n map((result) => result.results)\n )\n }\n return fetchList(client, 'popular', p, resultsPerPage)\n })\n )\n )\n}\n","import { Stack } from '@sanity/ui'\nimport styled from 'styled-components'\n\nexport const Search = styled(Stack)`\n position: sticky;\n top: 0;\n z-index: 1;\n`\n\nexport const Scroller = styled.div`\n overflow-y: auto;\n max-height: 80vh;\n`\n","import React from 'react'\nimport PhotoAlbum from 'react-photo-album'\nimport { BehaviorSubject, Subscription } from 'rxjs'\nimport { UnsplashPhoto } from '../types'\nimport Photo from './Photo'\nimport { fetchDownloadUrl, search } from '../datastores/unsplash'\nimport { Card, Dialog, Flex, Spinner, Stack, Text, TextInput } from '@sanity/ui'\nimport { Search } from './UnsplashAssetSource.styled'\nimport InfiniteScroll from 'react-infinite-scroll-component'\nimport { useClient, AssetSourceComponentProps, AssetFromSource } from 'sanity'\nimport { SanityClient } from '@sanity/client'\n\ntype State = {\n query: string\n searchResults: UnsplashPhoto[][]\n page: number\n isLoading: boolean\n cursor: number\n}\n\nconst RESULTS_PER_PAGE = 42\nconst PHOTO_SPACING = 2\nconst PHOTO_PADDING = 1 // offset the 1px border width\n\nexport default function UnsplashAssetSource(props: AssetSourceComponentProps) {\n const client = useClient({ apiVersion: '2022-09-01' })\n return <UnsplashAssetSourceInternal {...props} client={client} />\n}\n\nclass UnsplashAssetSourceInternal extends React.Component<\n AssetSourceComponentProps & { client: SanityClient },\n State\n> {\n static defaultProps = {\n selectedAssets: undefined,\n }\n\n state = {\n cursor: 0,\n query: '',\n page: 1,\n searchResults: [[]],\n isLoading: true,\n }\n\n searchSubscription: Subscription | null = null\n\n searchSubject$ = new BehaviorSubject('')\n pageSubject$ = new BehaviorSubject(1)\n\n componentDidMount() {\n this.searchSubscription = search(\n this.props.client,\n this.searchSubject$,\n this.pageSubject$,\n RESULTS_PER_PAGE\n ).subscribe({\n next: (results: UnsplashPhoto[]) => {\n this.setState((prev) => ({\n searchResults: [...prev.searchResults, results],\n isLoading: false,\n }))\n },\n })\n }\n\n componentWillUnmount() {\n if (this.searchSubscription) {\n this.searchSubscription.unsubscribe()\n }\n }\n\n handleSelect = (photo: UnsplashPhoto) => {\n this.setState({ isLoading: true })\n return fetchDownloadUrl(this.props.client, photo).then((downloadUrl) => {\n const description = photo.description || undefined\n const asset: AssetFromSource = {\n kind: 'url',\n value: downloadUrl,\n assetDocumentProps: {\n _type: 'sanity.imageAsset',\n source: {\n name: 'unsplash',\n id: photo.id,\n url: photo.links.html,\n },\n description,\n creditLine: `${photo.user.name} by Unsplash`,\n } as any,\n }\n this.props.onSelect([asset])\n })\n }\n\n handleClose = () => {\n this.props.onClose()\n }\n\n handleSearchTermChanged = (event: React.ChangeEvent<HTMLInputElement>) => {\n const query = event.currentTarget.value\n this.setState({ query, page: 1, searchResults: [[]], isLoading: true, cursor: 0 })\n this.pageSubject$.next(1)\n this.searchSubject$.next(query)\n }\n\n handleScollerLoadMore = () => {\n // eslint-disable-next-line react/no-access-state-in-setstate\n const nextPage = this.state.page + 1\n this.setState({ page: nextPage, isLoading: true })\n this.pageSubject$.next(nextPage)\n this.searchSubject$.next(this.state.query)\n }\n\n handleKeyDown = (event: any) => {\n const { cursor } = this.state\n if ((event.keyCode === 38 || event.keyCode === 37) && cursor > 0) {\n this.setState((prevState) => ({\n cursor: prevState.cursor - 1,\n }))\n } else if (\n (event.keyCode === 40 || event.keyCode === 39) &&\n cursor < this.getPhotos().length - 1\n ) {\n this.setState((prevState) => ({\n cursor: prevState.cursor + 1,\n }))\n }\n }\n\n getPhotos() {\n return this.state.searchResults.flat()\n }\n\n updateCursor = (photo: UnsplashPhoto) => {\n const index = this.getPhotos().findIndex((result: UnsplashPhoto) => result.id === photo.id)\n this.setState({ cursor: index })\n }\n\n renderImage = (props: any) => {\n const { photo, layout } = props\n const active =\n this.getPhotos().findIndex((result: UnsplashPhoto) => result.id === photo.data.id) ===\n this.state.cursor || false\n return (\n <Photo\n onClick={this.handleSelect.bind(photo.data)}\n onKeyDown={this.handleKeyDown}\n data={photo.data}\n width={layout.width}\n height={layout.height}\n active={active}\n onFocus={this.updateCursor}\n />\n )\n }\n\n render() {\n const { query, searchResults, isLoading } = this.state\n\n return (\n <Dialog\n id=\"unsplash-asset-source\"\n header=\"Select image from Unsplash\"\n onClose={this.handleClose}\n open\n width={4}\n >\n <Stack space={3} padding={4}>\n <Card>\n <Search space={3}>\n <Text size={1} weight=\"semibold\">\n Search Unsplash\n </Text>\n <TextInput\n label=\"Search Unsplash.com\"\n placeholder=\"Topics or colors\"\n value={query}\n onChange={this.handleSearchTermChanged}\n />\n </Search>\n </Card>\n {!isLoading && this.getPhotos().length === 0 && (\n <Text size={1} muted>\n No results found\n </Text>\n )}\n <InfiniteScroll\n dataLength={this.getPhotos().length} // This is important field to render the next data\n next={this.handleScollerLoadMore}\n // scrollableTarget=\"unsplash-scroller\"\n hasMore\n scrollThreshold={0.99}\n height=\"60vh\"\n loader={\n <Flex align=\"center\" justify=\"center\" padding={3}>\n <Spinner muted />\n </Flex>\n }\n endMessage={\n <Text size={1} muted>\n No more results\n </Text>\n }\n >\n {searchResults\n .filter((photos) => photos.length > 0)\n .map((photos: UnsplashPhoto[], index) => (\n <PhotoAlbum\n key={`gallery-${query || 'popular'}-${index}`}\n layout=\"rows\"\n spacing={PHOTO_SPACING}\n padding={PHOTO_PADDING}\n targetRowHeight={(width) => {\n if (width < 300) return 150\n else if (width < 600) return 200\n return 300\n }}\n photos={photos.map((photo: UnsplashPhoto) => ({\n src: photo.urls.small,\n width: photo.width,\n height: photo.height,\n key: photo.id,\n data: photo,\n }))}\n renderPhoto={this.renderImage}\n componentsProps={{\n containerProps: { style: { marginBottom: `${PHOTO_SPACING}px` } },\n }}\n />\n ))}\n </InfiniteScroll>\n </Stack>\n </Dialog>\n )\n }\n}\n","import React from 'react'\n\nexport default function UnsplashIcon() {\n return (\n <svg role=\"img\" viewBox=\"0 0 25 25\" width=\"1em\" height=\"1em\" fill=\"currentColor\">\n <title />\n <path d=\"M9 9V4h7v5H9Zm7 3h5v9H4v-9h5v5h7v-5Z\" />\n </svg>\n )\n}\n","import Unsplash from './components/UnsplashAssetSource'\nimport Icon from './components/Icon'\nimport { definePlugin, AssetSource } from 'sanity'\n\nexport type { UnsplashPhoto, Asset, AssetDocument } from './types'\n\n/**\n * @public\n */\nexport const unsplashAssetSource: AssetSource = {\n name: 'unsplash',\n title: 'Unsplash',\n component: Unsplash,\n icon: Icon,\n}\n\n/**\n * @public\n */\nexport const unsplashImageAsset = definePlugin({\n name: 'asset-source-unsplash-plugin',\n\n form: {\n image: {\n assetSources: (prev) => {\n return [...prev, unsplashAssetSource]\n },\n },\n },\n})\n"],"names":["Root","styled","div","_templateObject","_taggedTemplateLiteral","_ref","studioTheme","concat","color","card","enabled","border","CreditLineLink","a","_templateObject2","CreditLine","Card","_templateObject3","_ref2","theme","sanity","fg","bg","UTM_SOURCE","Photo","props","onClick","data","onKeyDown","onFocus","active","width","height","handleClick","useCallback","handleCreditLineClicked","event","stopPropagation","url","links","html","encodeURIComponent","window","open","id","handleKeyDown","keyCode","handleMouseDown","useEffect","src","urls","small","userName","user","name","useTheme","jsx","title","tabIndex","onMouseDown","style","backgroundImage","children","padding","radius","margin","jsxs","Text","size","username","fetchSearch","client","query","page","perPage","defer","observable","request","withCredentials","method","fetchList","type","fetchDownloadUrl","photo","downloadUrl","download_location","replace","then","result","search","resultsPerPage","pipe","withLatestFrom","debounceTime","distinctUntilChanged","switchMap","_ref3","q","p","map","results","Search","Stack","_templateObject4","_templateObject5","RESULTS_PER_PAGE","PHOTO_SPACING","PHOTO_PADDING","UnsplashAssetSource","useClient","apiVersion","UnsplashAssetSourceInternal","React","Component","constructor","arguments","state","cursor","searchResults","isLoading","searchSubscription","searchSubject$","BehaviorSubject","pageSubject$","handleSelect","setState","description","asset","kind","value","assetDocumentProps","_type","source","creditLine","onSelect","handleClose","onClose","handleSearchTermChanged","currentTarget","next","handleScollerLoadMore","nextPage","prevState","getPhotos","length","updateCursor","index","findIndex","renderImage","layout","bind","componentDidMount","subscribe","prev","componentWillUnmount","unsubscribe","flat","render","Dialog","header","space","weight","TextInput","label","placeholder","onChange","muted","InfiniteScroll","dataLength","hasMore","scrollThreshold","loader","Flex","align","justify","Spinner","endMessage","filter","photos","PhotoAlbum","spacing","targetRowHeight","key","renderPhoto","componentsProps","containerProps","marginBottom","defaultProps","selectedAssets","UnsplashIcon","role","viewBox","fill","d","unsplashAssetSource","component","Unsplash","icon","Icon","unsplashImageAsset","definePlugin","form","image","assetSources"],"mappings":"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"}