sanity-plugin-asset-source-unsplash 7.0.29 → 7.0.30
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/Loader-D8rxvGsi.js +103 -0
- package/dist/Loader-D8rxvGsi.js.map +1 -0
- package/dist/{UnsplashPhotoGallery-95ChILH4.js → UnsplashPhotoGallery-DR1iIjJu.js} +2 -10
- package/dist/{UnsplashPhotoGallery-95ChILH4.js.map → UnsplashPhotoGallery-DR1iIjJu.js.map} +1 -1
- package/dist/index.js +7 -28
- package/dist/index.js.map +1 -1
- package/package.json +7 -7
- package/dist/Loader-BKAt74MR.js +0 -15
- package/dist/Loader-BKAt74MR.js.map +0 -1
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
import { c } from "react/compiler-runtime";
|
|
2
|
+
import { jsx } from "react/jsx-runtime";
|
|
3
|
+
import { Flex, Spinner } from "@sanity/ui";
|
|
4
|
+
const PHOTO_ID_PATTERN = /^[A-Za-z0-9_-]{11}$/;
|
|
5
|
+
function unsplashPhotoIdFromQuery(query) {
|
|
6
|
+
let trimmed = query.trim();
|
|
7
|
+
if (PHOTO_ID_PATTERN.test(trimmed)) return trimmed;
|
|
8
|
+
let url = unsplashPhotoPageUrl(trimmed);
|
|
9
|
+
if (!url) return;
|
|
10
|
+
let segments = url.pathname.split("/").filter(Boolean);
|
|
11
|
+
if (segments[0] !== "photos" || !segments[1]) return;
|
|
12
|
+
let slug;
|
|
13
|
+
try {
|
|
14
|
+
slug = decodeURIComponent(segments[1]);
|
|
15
|
+
} catch {
|
|
16
|
+
return;
|
|
17
|
+
}
|
|
18
|
+
if (PHOTO_ID_PATTERN.test(slug)) return slug;
|
|
19
|
+
if (slug.length <= 11) return;
|
|
20
|
+
let candidate = slug.slice(-11), separator = slug.charAt(slug.length - 11 - 1);
|
|
21
|
+
if ((separator === "-" || separator === "_") && PHOTO_ID_PATTERN.test(candidate)) return candidate;
|
|
22
|
+
}
|
|
23
|
+
function unsplashPhotoPageUrl(value) {
|
|
24
|
+
let withProtocol = /^(?:www\.)?unsplash\.com\//i.test(value) ? `https://${value}` : value, url;
|
|
25
|
+
try {
|
|
26
|
+
url = new URL(withProtocol);
|
|
27
|
+
} catch {
|
|
28
|
+
return;
|
|
29
|
+
}
|
|
30
|
+
let host = url.hostname.toLowerCase();
|
|
31
|
+
if (host === "unsplash.com" || host === "www.unsplash.com") return url;
|
|
32
|
+
}
|
|
33
|
+
async function fetchUnsplashPhotos(client, query, page) {
|
|
34
|
+
let photoId = unsplashPhotoIdFromQuery(query);
|
|
35
|
+
if (photoId) {
|
|
36
|
+
let photo = await fetchPhotoById(client, photoId);
|
|
37
|
+
if (photo) return page === 1 ? {
|
|
38
|
+
results: [photo],
|
|
39
|
+
total: 1,
|
|
40
|
+
total_pages: 1
|
|
41
|
+
} : {
|
|
42
|
+
results: [],
|
|
43
|
+
total: 1,
|
|
44
|
+
total_pages: 1
|
|
45
|
+
};
|
|
46
|
+
}
|
|
47
|
+
let searchParams = new URLSearchParams({
|
|
48
|
+
page: `${page}`,
|
|
49
|
+
per_page: "42"
|
|
50
|
+
}), trimmed = query.trim();
|
|
51
|
+
if (trimmed) return searchParams.set("query", trimmed), client.request({
|
|
52
|
+
url: `/addons/unsplash/search/photos?${searchParams}`,
|
|
53
|
+
withCredentials: !0,
|
|
54
|
+
method: "GET"
|
|
55
|
+
});
|
|
56
|
+
searchParams.set("order_by", "popular");
|
|
57
|
+
let results = await client.request({
|
|
58
|
+
url: `/addons/unsplash/photos?${searchParams}`,
|
|
59
|
+
withCredentials: !0,
|
|
60
|
+
method: "GET"
|
|
61
|
+
});
|
|
62
|
+
return {
|
|
63
|
+
results,
|
|
64
|
+
total: results.length,
|
|
65
|
+
total_pages: Math.ceil(results.length / 42)
|
|
66
|
+
};
|
|
67
|
+
}
|
|
68
|
+
async function fetchPhotoById(client, photoId) {
|
|
69
|
+
try {
|
|
70
|
+
let photo = await client.request({
|
|
71
|
+
url: `/addons/unsplash/photos/${encodeURIComponent(photoId)}`,
|
|
72
|
+
withCredentials: !0,
|
|
73
|
+
method: "GET"
|
|
74
|
+
});
|
|
75
|
+
return !photo || photo.id !== photoId ? void 0 : photo;
|
|
76
|
+
} catch (error) {
|
|
77
|
+
if (isNotFound(error)) return;
|
|
78
|
+
throw error;
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
function isNotFound(error) {
|
|
82
|
+
return typeof error == "object" && !!error && "statusCode" in error && error.statusCode === 404;
|
|
83
|
+
}
|
|
84
|
+
async function fetchDownloadUrl(client, photo) {
|
|
85
|
+
let downloadUrl = photo.links.download_location.replace("https://api.unsplash.com", "/addons/unsplash"), { url } = await client.request({
|
|
86
|
+
url: downloadUrl,
|
|
87
|
+
withCredentials: !0,
|
|
88
|
+
method: "GET"
|
|
89
|
+
});
|
|
90
|
+
return url;
|
|
91
|
+
}
|
|
92
|
+
function Loader() {
|
|
93
|
+
let $ = c(1), t0;
|
|
94
|
+
return $[0] === Symbol.for("react.memo_cache_sentinel") ? (t0 = /* @__PURE__ */ jsx(Flex, {
|
|
95
|
+
align: "center",
|
|
96
|
+
justify: "center",
|
|
97
|
+
padding: 3,
|
|
98
|
+
children: /* @__PURE__ */ jsx(Spinner, { muted: !0 })
|
|
99
|
+
}), $[0] = t0) : t0 = $[0], t0;
|
|
100
|
+
}
|
|
101
|
+
export { fetchDownloadUrl as n, fetchUnsplashPhotos as r, Loader as t };
|
|
102
|
+
|
|
103
|
+
//# sourceMappingURL=Loader-D8rxvGsi.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Loader-D8rxvGsi.js","names":["<Flex align=\"center\" justify=\"center\" padding={3}>\n <Spinner muted />\n </Flex>","_c"],"sources":["../src/datastores/unsplash.ts","../src/components/Loader.tsx"],"sourcesContent":["import type {SanityClient} from 'sanity'\n\nimport type {FetcherResult, UnsplashPhoto} from '../types'\n\nconst RESULTS_PER_PAGE = 42\n\n// Unsplash photo ids are 11 characters from this alphabet, including leading `-` or `_`.\nconst PHOTO_ID_LENGTH = 11\nconst PHOTO_ID_PATTERN = /^[A-Za-z0-9_-]{11}$/\n\nfunction unsplashPhotoIdFromQuery(query: string): string | undefined {\n const trimmed = query.trim()\n if (PHOTO_ID_PATTERN.test(trimmed)) return trimmed\n\n const url = unsplashPhotoPageUrl(trimmed)\n if (!url) return undefined\n\n const segments = url.pathname.split('/').filter(Boolean)\n if (segments[0] !== 'photos' || !segments[1]) return undefined\n\n let slug: string\n try {\n slug = decodeURIComponent(segments[1])\n } catch {\n return undefined\n }\n\n if (PHOTO_ID_PATTERN.test(slug)) return slug\n if (slug.length <= PHOTO_ID_LENGTH) return undefined\n\n const candidate = slug.slice(-PHOTO_ID_LENGTH)\n const separator = slug.charAt(slug.length - PHOTO_ID_LENGTH - 1)\n if ((separator === '-' || separator === '_') && PHOTO_ID_PATTERN.test(candidate)) return candidate\n return undefined\n}\n\nfunction unsplashPhotoPageUrl(value: string): URL | undefined {\n const withProtocol = /^(?:www\\.)?unsplash\\.com\\//i.test(value) ? `https://${value}` : value\n let url: URL\n try {\n url = new URL(withProtocol)\n } catch {\n return undefined\n }\n\n const host = url.hostname.toLowerCase()\n if (host !== 'unsplash.com' && host !== 'www.unsplash.com') return undefined\n return url\n}\n\nexport async function fetchUnsplashPhotos(\n client: SanityClient,\n query: string,\n page: number,\n): Promise<FetcherResult> {\n // Keyword search does not match photo ids (`m2J105CzEAU` returns zero hits).\n // GET /photos/:id returns the image. A normal 11-character word 404s and falls through.\n const photoId = unsplashPhotoIdFromQuery(query)\n if (photoId) {\n const photo = await fetchPhotoById(client, photoId)\n if (photo) {\n return page === 1\n ? {results: [photo], total: 1, total_pages: 1}\n : {results: [], total: 1, total_pages: 1}\n }\n }\n\n const searchParams = new URLSearchParams({\n page: `${page}`,\n per_page: `${RESULTS_PER_PAGE}`,\n })\n const trimmed = query.trim()\n if (trimmed) {\n searchParams.set('query', trimmed)\n return client.request<FetcherResult>({\n url: `/addons/unsplash/search/photos?${searchParams}`,\n withCredentials: true,\n method: 'GET',\n })\n }\n\n searchParams.set('order_by', 'popular')\n const results = await client.request<UnsplashPhoto[]>({\n url: `/addons/unsplash/photos?${searchParams}`,\n withCredentials: true,\n method: 'GET',\n })\n return {\n results,\n total: results.length,\n total_pages: Math.ceil(results.length / RESULTS_PER_PAGE),\n }\n}\n\nasync function fetchPhotoById(\n client: SanityClient,\n photoId: string,\n): Promise<UnsplashPhoto | undefined> {\n try {\n const photo = await client.request<UnsplashPhoto>({\n url: `/addons/unsplash/photos/${encodeURIComponent(photoId)}`,\n withCredentials: true,\n method: 'GET',\n })\n if (!photo || photo.id !== photoId) return undefined\n return photo\n } catch (error) {\n if (isNotFound(error)) return undefined\n throw error\n }\n}\n\nfunction isNotFound(error: unknown): boolean {\n return (\n typeof error === 'object' && error !== null && 'statusCode' in error && error.statusCode === 404\n )\n}\n\nexport async function fetchDownloadUrl(\n client: SanityClient,\n photo: UnsplashPhoto,\n): Promise<string> {\n const downloadUrl = photo.links.download_location.replace(\n 'https://api.unsplash.com',\n '/addons/unsplash',\n )\n const {url} = await client.request<{url: string}>({\n url: downloadUrl,\n withCredentials: true,\n method: 'GET',\n })\n\n return url\n}\n","import {Flex, Spinner} from '@sanity/ui'\n\nexport function Loader() {\n return (\n <Flex align=\"center\" justify=\"center\" padding={3}>\n <Spinner muted />\n </Flex>\n )\n}\n"],"mappings":";;;AAIA,MAIM,mBAAmB;AAEzB,SAAS,yBAAyB,OAAmC;CACnE,IAAM,UAAU,MAAM,KAAK;CAC3B,IAAI,iBAAiB,KAAK,OAAO,GAAG,OAAO;CAE3C,IAAM,MAAM,qBAAqB,OAAO;CACxC,IAAI,CAAC,KAAK;CAEV,IAAM,WAAW,IAAI,SAAS,MAAM,GAAG,CAAC,CAAC,OAAO,OAAO;CACvD,IAAI,SAAS,OAAO,YAAY,CAAC,SAAS,IAAI;CAE9C,IAAI;CACJ,IAAI;EACF,OAAO,mBAAmB,SAAS,EAAE;CACvC,QAAQ;EACN;CACF;CAEA,IAAI,iBAAiB,KAAK,IAAI,GAAG,OAAO;CACxC,IAAI,KAAK,UAAU,IAAiB;CAEpC,IAAM,YAAY,KAAK,MAAM,GAAgB,GACvC,YAAY,KAAK,OAAO,KAAK,SAAS,KAAkB,CAAC;CAC/D,KAAK,cAAc,OAAO,cAAc,QAAQ,iBAAiB,KAAK,SAAS,GAAG,OAAO;AAE3F;AAEA,SAAS,qBAAqB,OAAgC;CAC5D,IAAM,eAAe,8BAA8B,KAAK,KAAK,IAAI,WAAW,UAAU,OAClF;CACJ,IAAI;EACF,MAAM,IAAI,IAAI,YAAY;CAC5B,QAAQ;EACN;CACF;CAEA,IAAM,OAAO,IAAI,SAAS,YAAY;CACtC,IAAI,SAAS,kBAAkB,SAAS,oBACxC,OAAO;AACT;AAEA,eAAsB,oBACpB,QACA,OACA,MACwB;CAGxB,IAAM,UAAU,yBAAyB,KAAK;CAC9C,IAAI,SAAS;EACX,IAAM,QAAQ,MAAM,eAAe,QAAQ,OAAO;EAClD,IAAI,OACF,OAAO,SAAS,IACZ;GAAC,SAAS,CAAC,KAAK;GAAG,OAAO;GAAG,aAAa;EAAC,IAC3C;GAAC,SAAS,CAAC;GAAG,OAAO;GAAG,aAAa;EAAC;CAE9C;CAEA,IAAM,eAAe,IAAI,gBAAgB;EACvC,MAAM,GAAG;EACT,UAAU;CACZ,CAAC,GACK,UAAU,MAAM,KAAK;CAC3B,IAAI,SAEF,OADA,aAAa,IAAI,SAAS,OAAO,GAC1B,OAAO,QAAuB;EACnC,KAAK,kCAAkC;EACvC,iBAAiB;EACjB,QAAQ;CACV,CAAC;CAGH,aAAa,IAAI,YAAY,SAAS;CACtC,IAAM,UAAU,MAAM,OAAO,QAAyB;EACpD,KAAK,2BAA2B;EAChC,iBAAiB;EACjB,QAAQ;CACV,CAAC;CACD,OAAO;EACL;EACA,OAAO,QAAQ;EACf,aAAa,KAAK,KAAK,QAAQ,SAAS,EAAgB;CAC1D;AACF;AAEA,eAAe,eACb,QACA,SACoC;CACpC,IAAI;EACF,IAAM,QAAQ,MAAM,OAAO,QAAuB;GAChD,KAAK,2BAA2B,mBAAmB,OAAO;GAC1D,iBAAiB;GACjB,QAAQ;EACV,CAAC;EAED,OADI,CAAC,SAAS,MAAM,OAAO,UAAS,SAC7B;CACT,SAAS,OAAO;EACd,IAAI,WAAW,KAAK,GAAG;EACvB,MAAM;CACR;AACF;AAEA,SAAS,WAAW,OAAyB;CAC3C,OACE,OAAO,SAAU,cAAY,SAAkB,gBAAgB,SAAS,MAAM,eAAe;AAEjG;AAEA,eAAsB,iBACpB,QACA,OACiB;CACjB,IAAM,cAAc,MAAM,MAAM,kBAAkB,QAChD,4BACA,kBACF,GACM,EAAC,QAAO,MAAM,OAAO,QAAuB;EAChD,KAAK;EACL,iBAAiB;EACjB,QAAQ;CACV,CAAC;CAED,OAAO;AACT;ACnIA,SAAgB,SAAS;C,cAErBA;CADF,O,oDACG,KAAA,oBAAA,MAAD;EAAM,OAAM;EAAS,SAAQ;EAAS,SAAS;EAC7C,UAAA,oBAAC,SAAD,EAAS,OAAA,GAAO,CAAA;CACZ,CAAA,G,wBAFNA;AAIJ"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { t as Loader } from "./Loader-
|
|
1
|
+
import { n as fetchDownloadUrl, t as Loader } from "./Loader-D8rxvGsi.js";
|
|
2
2
|
import { c } from "react/compiler-runtime";
|
|
3
3
|
import { Fragment, jsx, jsxs } from "react/jsx-runtime";
|
|
4
4
|
import { Box, Card, Text } from "@sanity/ui";
|
|
@@ -8,14 +8,6 @@ import "react-photo-album/rows.css";
|
|
|
8
8
|
import { RowsPhotoAlbum } from "react-photo-album";
|
|
9
9
|
import InfiniteScroll from "react-photo-album/scroll";
|
|
10
10
|
import { getTheme_v2 } from "@sanity/ui/theme";
|
|
11
|
-
async function fetchDownloadUrl(client, photo) {
|
|
12
|
-
let downloadUrl = photo.links.download_location.replace("https://api.unsplash.com", "/addons/unsplash"), { url } = await client.request({
|
|
13
|
-
url: downloadUrl,
|
|
14
|
-
withCredentials: !0,
|
|
15
|
-
method: "GET"
|
|
16
|
-
});
|
|
17
|
-
return url;
|
|
18
|
-
}
|
|
19
11
|
const CreditLineLink = styled.a.withConfig({
|
|
20
12
|
displayName: "CreditLineLink",
|
|
21
13
|
componentId: "sc-flemiu-0"
|
|
@@ -167,4 +159,4 @@ function _temp(width) {
|
|
|
167
159
|
}
|
|
168
160
|
export { UnsplashAssetSourceGallery as default };
|
|
169
161
|
|
|
170
|
-
//# sourceMappingURL=UnsplashPhotoGallery-
|
|
162
|
+
//# sourceMappingURL=UnsplashPhotoGallery-DR1iIjJu.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"UnsplashPhotoGallery-95ChILH4.js","names":["{\n link,\n id,\n userName,\n}: {\n link: string\n id: string\n userName: string\n}","CreditLineLink","url.toString()","<CreditLine padding={1} radius={1} margin={1}>\n <Text size={0} title={`Open image by ${userName} on Unsplash in new window`}>\n By @{userName}\n </Text>\n </CreditLine>","`Open image by ${userName} on Unsplash in new window`","<CreditLineLink\n href={url.toString()}\n target={id}\n rel=\"noreferrer noopener\"\n onClick={(event) => event.stopPropagation()}\n >\n <CreditLine padding={1} radius={1} margin={1}>\n <Text size={0} title={`Open image by ${userName} on Unsplash in new window`}>\n By @{userName}\n </Text>\n </CreditLine>\n </CreditLineLink>","(event) => event.stopPropagation()","_c","_temp","{\n client,\n query,\n fetcher,\n scrollContainerRef,\n onSelect,\n initialDataPromise,\n}: {\n client: SanityClient\n query: string\n fetcher: (query: string, index: number) => Promise<FetcherResult>\n scrollContainerRef: React.RefObject<HTMLDivElement | null>\n initialDataPromise: Promise<FetcherResult>\n} & Pick<AssetSourceComponentProps, 'onSelect'>","<Box paddingX={2} paddingY={3}>\n <Text size={1} muted>\n No results found for \"{query}\"\n </Text>\n </Box>","<Activity mode={data.total === 0 ? 'visible' : 'hidden'}>\n <Box paddingX={2} paddingY={3}>\n <Text size={1} muted>\n No results found for \"{query}\"\n </Text>\n </Box>\n </Activity>","data.total === 0 ? 'visible' : 'hidden'","() => scrollContainerRef.current","scrollContainerRef.current","data.results.map(mapUnsplashToPhotoAlbumPhoto)","results","async (index) => {\n const {results, total_pages} = await fetcher(query, index + 1)\n\n if (index < total_pages) {\n return results.map(mapUnsplashToPhotoAlbumPhoto)\n }\n\n return null\n }","<Loader />","query && (\n <Box paddingX={2} paddingY={3}>\n <Text size={1} muted>\n No more results\n </Text>\n </Box>\n )","async ({photo: {data: photo}}) => {\n const downloadUrl = await fetchDownloadUrl(client, photo)\n\n const description = photo.description || undefined\n const asset: AssetFromSource = {\n kind: 'url',\n value: downloadUrl,\n // @ts-expect-error TODO: this is a partial assetDocumentProps, update types.\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 },\n }\n return onSelect([asset])\n }","{data: photo}","{photo: {data: photo}}","[]","<RowsPhotoAlbum<ReturnType<typeof mapUnsplashToPhotoAlbumPhoto>>\n photos={[]}\n spacing={PHOTO_SPACING}\n padding={PHOTO_PADDING}\n targetRowHeight={(width) => {\n if (width < 300) return 150\n if (width < 600) return 200\n return 300\n }}\n render={{\n extras: (_, context) => {\n return (\n <UnsplashCreditLine\n id={context.photo.data.id}\n link={context.photo.data.links.html}\n userName={context.photo.data.user.username}\n />\n )\n },\n }}\n componentsProps={{container: {style: {marginBottom: PHOTO_SPACING}}}}\n />","(width) => {\n if (width < 300) return 150\n if (width < 600) return 200\n return 300\n }","(_, context) => {\n return (\n <UnsplashCreditLine\n id={context.photo.data.id}\n link={context.photo.data.links.html}\n userName={context.photo.data.user.username}\n />\n )\n }","<InfiniteScroll\n key={query}\n scrollContainer={() => scrollContainerRef.current}\n photos={data.results.map(mapUnsplashToPhotoAlbumPhoto)}\n fetch={async (index) => {\n const {results, total_pages} = await fetcher(query, index + 1)\n\n if (index < total_pages) {\n return results.map(mapUnsplashToPhotoAlbumPhoto)\n }\n\n return null\n }}\n loading={<Loader />}\n finished={\n query && (\n <Box paddingX={2} paddingY={3}>\n <Text size={1} muted>\n No more results\n </Text>\n </Box>\n )\n }\n onClick={async ({photo: {data: photo}}) => {\n const downloadUrl = await fetchDownloadUrl(client, photo)\n\n const description = photo.description || undefined\n const asset: AssetFromSource = {\n kind: 'url',\n value: downloadUrl,\n // @ts-expect-error TODO: this is a partial assetDocumentProps, update types.\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 },\n }\n return onSelect([asset])\n }}\n >\n <RowsPhotoAlbum<ReturnType<typeof mapUnsplashToPhotoAlbumPhoto>>\n photos={[]}\n spacing={PHOTO_SPACING}\n padding={PHOTO_PADDING}\n targetRowHeight={(width) => {\n if (width < 300) return 150\n if (width < 600) return 200\n return 300\n }}\n render={{\n extras: (_, context) => {\n return (\n <UnsplashCreditLine\n id={context.photo.data.id}\n link={context.photo.data.links.html}\n userName={context.photo.data.user.username}\n />\n )\n },\n }}\n componentsProps={{container: {style: {marginBottom: PHOTO_SPACING}}}}\n />\n </InfiniteScroll>","<Activity mode={data.total === 0 ? 'hidden' : 'visible'}>\n <InfiniteScroll\n key={query}\n scrollContainer={() => scrollContainerRef.current}\n photos={data.results.map(mapUnsplashToPhotoAlbumPhoto)}\n fetch={async (index) => {\n const {results, total_pages} = await fetcher(query, index + 1)\n\n if (index < total_pages) {\n return results.map(mapUnsplashToPhotoAlbumPhoto)\n }\n\n return null\n }}\n loading={<Loader />}\n finished={\n query && (\n <Box paddingX={2} paddingY={3}>\n <Text size={1} muted>\n No more results\n </Text>\n </Box>\n )\n }\n onClick={async ({photo: {data: photo}}) => {\n const downloadUrl = await fetchDownloadUrl(client, photo)\n\n const description = photo.description || undefined\n const asset: AssetFromSource = {\n kind: 'url',\n value: downloadUrl,\n // @ts-expect-error TODO: this is a partial assetDocumentProps, update types.\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 },\n }\n return onSelect([asset])\n }}\n >\n <RowsPhotoAlbum<ReturnType<typeof mapUnsplashToPhotoAlbumPhoto>>\n photos={[]}\n spacing={PHOTO_SPACING}\n padding={PHOTO_PADDING}\n targetRowHeight={(width) => {\n if (width < 300) return 150\n if (width < 600) return 200\n return 300\n }}\n render={{\n extras: (_, context) => {\n return (\n <UnsplashCreditLine\n id={context.photo.data.id}\n link={context.photo.data.links.html}\n userName={context.photo.data.user.username}\n />\n )\n },\n }}\n componentsProps={{container: {style: {marginBottom: PHOTO_SPACING}}}}\n />\n </InfiniteScroll>\n </Activity>","data.total === 0 ? 'hidden' : 'visible'","<>\n <Activity mode={data.total === 0 ? 'visible' : 'hidden'}>\n <Box paddingX={2} paddingY={3}>\n <Text size={1} muted>\n No results found for \"{query}\"\n </Text>\n </Box>\n </Activity>\n <Activity mode={data.total === 0 ? 'hidden' : 'visible'}>\n <InfiniteScroll\n key={query}\n scrollContainer={() => scrollContainerRef.current}\n photos={data.results.map(mapUnsplashToPhotoAlbumPhoto)}\n fetch={async (index) => {\n const {results, total_pages} = await fetcher(query, index + 1)\n\n if (index < total_pages) {\n return results.map(mapUnsplashToPhotoAlbumPhoto)\n }\n\n return null\n }}\n loading={<Loader />}\n finished={\n query && (\n <Box paddingX={2} paddingY={3}>\n <Text size={1} muted>\n No more results\n </Text>\n </Box>\n )\n }\n onClick={async ({photo: {data: photo}}) => {\n const downloadUrl = await fetchDownloadUrl(client, photo)\n\n const description = photo.description || undefined\n const asset: AssetFromSource = {\n kind: 'url',\n value: downloadUrl,\n // @ts-expect-error TODO: this is a partial assetDocumentProps, update types.\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 },\n }\n return onSelect([asset])\n }}\n >\n <RowsPhotoAlbum<ReturnType<typeof mapUnsplashToPhotoAlbumPhoto>>\n photos={[]}\n spacing={PHOTO_SPACING}\n padding={PHOTO_PADDING}\n targetRowHeight={(width) => {\n if (width < 300) return 150\n if (width < 600) return 200\n return 300\n }}\n render={{\n extras: (_, context) => {\n return (\n <UnsplashCreditLine\n id={context.photo.data.id}\n link={context.photo.data.links.html}\n userName={context.photo.data.user.username}\n />\n )\n },\n }}\n componentsProps={{container: {style: {marginBottom: PHOTO_SPACING}}}}\n />\n </InfiniteScroll>\n </Activity>\n </>","_c","_Fragment"],"sources":["../src/datastores/unsplash.ts","../src/components/UnsplashCreditLine.tsx","../src/components/UnsplashPhotoGallery.tsx"],"sourcesContent":["import type {SanityClient} from 'sanity'\n\nimport type {UnsplashPhoto} from '../types'\n\nexport async function fetchDownloadUrl(\n client: SanityClient,\n photo: UnsplashPhoto,\n): Promise<string> {\n const downloadUrl = photo.links.download_location.replace(\n 'https://api.unsplash.com',\n '/addons/unsplash',\n )\n const {url} = await client.request<{url: string}>({\n url: downloadUrl,\n withCredentials: true,\n method: 'GET',\n })\n\n return url\n}\n","import {Text, Card} from '@sanity/ui'\nimport {getTheme_v2} from '@sanity/ui/theme'\nimport {styled} from 'styled-components'\n\nconst CreditLineLink = styled.a`\n text-decoration: none;\n cursor: pointer;\n &:hover,\n &:focus {\n [data-ui='Text'] {\n text-decoration: underline;\n }\n }\n`\n\nconst CreditLine = styled(Card)`\n ${({theme}) => {\n const v2 = getTheme_v2({sanity: theme.sanity})\n return `\n --creditline-fg: ${v2.color.fg};\n --creditline-bg: ${v2.color.bg};\n `\n }};\n -webkit-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\nconst UTM_SOURCE = 'sanity-plugin-asset-source-unsplash'\nexport function UnsplashCreditLine({\n link,\n id,\n userName,\n}: {\n link: string\n id: string\n userName: string\n}) {\n const url = new URL(link)\n url.searchParams.set('utm_source', UTM_SOURCE)\n url.searchParams.set('utm_medium', 'referral')\n\n return (\n <CreditLineLink\n href={url.toString()}\n target={id}\n rel=\"noreferrer noopener\"\n onClick={(event) => event.stopPropagation()}\n >\n <CreditLine padding={1} radius={1} margin={1}>\n <Text size={0} title={`Open image by ${userName} on Unsplash in new window`}>\n By @{userName}\n </Text>\n </CreditLine>\n </CreditLineLink>\n )\n}\n","import {Box, Text} from '@sanity/ui'\nimport {use, Activity} from 'react'\n\nimport 'react-photo-album/rows.css'\nimport {RowsPhotoAlbum} from 'react-photo-album'\nimport InfiniteScroll from 'react-photo-album/scroll'\nimport {type AssetFromSource, type AssetSourceComponentProps, type SanityClient} from 'sanity'\n\nimport {fetchDownloadUrl} from '../datastores/unsplash'\nimport type {FetcherResult, UnsplashPhoto} from '../types'\nimport {Loader} from './Loader'\nimport {UnsplashCreditLine} from './UnsplashCreditLine'\n\nconst PHOTO_SPACING = 2\nconst PHOTO_PADDING = 1 // offset the 1px border width\n\nfunction mapUnsplashToPhotoAlbumPhoto(photo: UnsplashPhoto) {\n return {\n src: photo.urls.small,\n width: photo.width,\n height: photo.height,\n key: photo.id,\n data: photo,\n }\n}\n\nexport default function UnsplashAssetSourceGallery({\n client,\n query,\n fetcher,\n scrollContainerRef,\n onSelect,\n initialDataPromise,\n}: {\n client: SanityClient\n query: string\n fetcher: (query: string, index: number) => Promise<FetcherResult>\n scrollContainerRef: React.RefObject<HTMLDivElement | null>\n initialDataPromise: Promise<FetcherResult>\n} & Pick<AssetSourceComponentProps, 'onSelect'>) {\n const data = use(initialDataPromise)\n\n return (\n <>\n <Activity mode={data.total === 0 ? 'visible' : 'hidden'}>\n <Box paddingX={2} paddingY={3}>\n <Text size={1} muted>\n No results found for \"{query}\"\n </Text>\n </Box>\n </Activity>\n <Activity mode={data.total === 0 ? 'hidden' : 'visible'}>\n <InfiniteScroll\n key={query}\n scrollContainer={() => scrollContainerRef.current}\n photos={data.results.map(mapUnsplashToPhotoAlbumPhoto)}\n fetch={async (index) => {\n const {results, total_pages} = await fetcher(query, index + 1)\n\n if (index < total_pages) {\n return results.map(mapUnsplashToPhotoAlbumPhoto)\n }\n\n return null\n }}\n loading={<Loader />}\n finished={\n query && (\n <Box paddingX={2} paddingY={3}>\n <Text size={1} muted>\n No more results\n </Text>\n </Box>\n )\n }\n onClick={async ({photo: {data: photo}}) => {\n const downloadUrl = await fetchDownloadUrl(client, photo)\n\n const description = photo.description || undefined\n const asset: AssetFromSource = {\n kind: 'url',\n value: downloadUrl,\n // @ts-expect-error TODO: this is a partial assetDocumentProps, update types.\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 },\n }\n return onSelect([asset])\n }}\n >\n <RowsPhotoAlbum<ReturnType<typeof mapUnsplashToPhotoAlbumPhoto>>\n photos={[]}\n spacing={PHOTO_SPACING}\n padding={PHOTO_PADDING}\n targetRowHeight={(width) => {\n if (width < 300) return 150\n if (width < 600) return 200\n return 300\n }}\n render={{\n extras: (_, context) => {\n return (\n <UnsplashCreditLine\n id={context.photo.data.id}\n link={context.photo.data.links.html}\n userName={context.photo.data.user.username}\n />\n )\n },\n }}\n componentsProps={{container: {style: {marginBottom: PHOTO_SPACING}}}}\n />\n </InfiniteScroll>\n </Activity>\n </>\n )\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"UnsplashPhotoGallery-DR1iIjJu.js","names":["{\n link,\n id,\n userName,\n}: {\n link: string\n id: string\n userName: string\n}","CreditLineLink","url.toString()","<CreditLine padding={1} radius={1} margin={1}>\n <Text size={0} title={`Open image by ${userName} on Unsplash in new window`}>\n By @{userName}\n </Text>\n </CreditLine>","`Open image by ${userName} on Unsplash in new window`","<CreditLineLink\n href={url.toString()}\n target={id}\n rel=\"noreferrer noopener\"\n onClick={(event) => event.stopPropagation()}\n >\n <CreditLine padding={1} radius={1} margin={1}>\n <Text size={0} title={`Open image by ${userName} on Unsplash in new window`}>\n By @{userName}\n </Text>\n </CreditLine>\n </CreditLineLink>","(event) => event.stopPropagation()","_c","_temp","{\n client,\n query,\n fetcher,\n scrollContainerRef,\n onSelect,\n initialDataPromise,\n}: {\n client: SanityClient\n query: string\n fetcher: (query: string, index: number) => Promise<FetcherResult>\n scrollContainerRef: React.RefObject<HTMLDivElement | null>\n initialDataPromise: Promise<FetcherResult>\n} & Pick<AssetSourceComponentProps, 'onSelect'>","<Box paddingX={2} paddingY={3}>\n <Text size={1} muted>\n No results found for \"{query}\"\n </Text>\n </Box>","<Activity mode={data.total === 0 ? 'visible' : 'hidden'}>\n <Box paddingX={2} paddingY={3}>\n <Text size={1} muted>\n No results found for \"{query}\"\n </Text>\n </Box>\n </Activity>","data.total === 0 ? 'visible' : 'hidden'","() => scrollContainerRef.current","scrollContainerRef.current","data.results.map(mapUnsplashToPhotoAlbumPhoto)","results","async (index) => {\n const {results, total_pages} = await fetcher(query, index + 1)\n\n if (index < total_pages) {\n return results.map(mapUnsplashToPhotoAlbumPhoto)\n }\n\n return null\n }","<Loader />","query && (\n <Box paddingX={2} paddingY={3}>\n <Text size={1} muted>\n No more results\n </Text>\n </Box>\n )","async ({photo: {data: photo}}) => {\n const downloadUrl = await fetchDownloadUrl(client, photo)\n\n const description = photo.description || undefined\n const asset: AssetFromSource = {\n kind: 'url',\n value: downloadUrl,\n // @ts-expect-error TODO: this is a partial assetDocumentProps, update types.\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 },\n }\n return onSelect([asset])\n }","{data: photo}","{photo: {data: photo}}","[]","<RowsPhotoAlbum<ReturnType<typeof mapUnsplashToPhotoAlbumPhoto>>\n photos={[]}\n spacing={PHOTO_SPACING}\n padding={PHOTO_PADDING}\n targetRowHeight={(width) => {\n if (width < 300) return 150\n if (width < 600) return 200\n return 300\n }}\n render={{\n extras: (_, context) => {\n return (\n <UnsplashCreditLine\n id={context.photo.data.id}\n link={context.photo.data.links.html}\n userName={context.photo.data.user.username}\n />\n )\n },\n }}\n componentsProps={{container: {style: {marginBottom: PHOTO_SPACING}}}}\n />","(width) => {\n if (width < 300) return 150\n if (width < 600) return 200\n return 300\n }","(_, context) => {\n return (\n <UnsplashCreditLine\n id={context.photo.data.id}\n link={context.photo.data.links.html}\n userName={context.photo.data.user.username}\n />\n )\n }","<InfiniteScroll\n key={query}\n scrollContainer={() => scrollContainerRef.current}\n photos={data.results.map(mapUnsplashToPhotoAlbumPhoto)}\n fetch={async (index) => {\n const {results, total_pages} = await fetcher(query, index + 1)\n\n if (index < total_pages) {\n return results.map(mapUnsplashToPhotoAlbumPhoto)\n }\n\n return null\n }}\n loading={<Loader />}\n finished={\n query && (\n <Box paddingX={2} paddingY={3}>\n <Text size={1} muted>\n No more results\n </Text>\n </Box>\n )\n }\n onClick={async ({photo: {data: photo}}) => {\n const downloadUrl = await fetchDownloadUrl(client, photo)\n\n const description = photo.description || undefined\n const asset: AssetFromSource = {\n kind: 'url',\n value: downloadUrl,\n // @ts-expect-error TODO: this is a partial assetDocumentProps, update types.\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 },\n }\n return onSelect([asset])\n }}\n >\n <RowsPhotoAlbum<ReturnType<typeof mapUnsplashToPhotoAlbumPhoto>>\n photos={[]}\n spacing={PHOTO_SPACING}\n padding={PHOTO_PADDING}\n targetRowHeight={(width) => {\n if (width < 300) return 150\n if (width < 600) return 200\n return 300\n }}\n render={{\n extras: (_, context) => {\n return (\n <UnsplashCreditLine\n id={context.photo.data.id}\n link={context.photo.data.links.html}\n userName={context.photo.data.user.username}\n />\n )\n },\n }}\n componentsProps={{container: {style: {marginBottom: PHOTO_SPACING}}}}\n />\n </InfiniteScroll>","<Activity mode={data.total === 0 ? 'hidden' : 'visible'}>\n <InfiniteScroll\n key={query}\n scrollContainer={() => scrollContainerRef.current}\n photos={data.results.map(mapUnsplashToPhotoAlbumPhoto)}\n fetch={async (index) => {\n const {results, total_pages} = await fetcher(query, index + 1)\n\n if (index < total_pages) {\n return results.map(mapUnsplashToPhotoAlbumPhoto)\n }\n\n return null\n }}\n loading={<Loader />}\n finished={\n query && (\n <Box paddingX={2} paddingY={3}>\n <Text size={1} muted>\n No more results\n </Text>\n </Box>\n )\n }\n onClick={async ({photo: {data: photo}}) => {\n const downloadUrl = await fetchDownloadUrl(client, photo)\n\n const description = photo.description || undefined\n const asset: AssetFromSource = {\n kind: 'url',\n value: downloadUrl,\n // @ts-expect-error TODO: this is a partial assetDocumentProps, update types.\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 },\n }\n return onSelect([asset])\n }}\n >\n <RowsPhotoAlbum<ReturnType<typeof mapUnsplashToPhotoAlbumPhoto>>\n photos={[]}\n spacing={PHOTO_SPACING}\n padding={PHOTO_PADDING}\n targetRowHeight={(width) => {\n if (width < 300) return 150\n if (width < 600) return 200\n return 300\n }}\n render={{\n extras: (_, context) => {\n return (\n <UnsplashCreditLine\n id={context.photo.data.id}\n link={context.photo.data.links.html}\n userName={context.photo.data.user.username}\n />\n )\n },\n }}\n componentsProps={{container: {style: {marginBottom: PHOTO_SPACING}}}}\n />\n </InfiniteScroll>\n </Activity>","data.total === 0 ? 'hidden' : 'visible'","<>\n <Activity mode={data.total === 0 ? 'visible' : 'hidden'}>\n <Box paddingX={2} paddingY={3}>\n <Text size={1} muted>\n No results found for \"{query}\"\n </Text>\n </Box>\n </Activity>\n <Activity mode={data.total === 0 ? 'hidden' : 'visible'}>\n <InfiniteScroll\n key={query}\n scrollContainer={() => scrollContainerRef.current}\n photos={data.results.map(mapUnsplashToPhotoAlbumPhoto)}\n fetch={async (index) => {\n const {results, total_pages} = await fetcher(query, index + 1)\n\n if (index < total_pages) {\n return results.map(mapUnsplashToPhotoAlbumPhoto)\n }\n\n return null\n }}\n loading={<Loader />}\n finished={\n query && (\n <Box paddingX={2} paddingY={3}>\n <Text size={1} muted>\n No more results\n </Text>\n </Box>\n )\n }\n onClick={async ({photo: {data: photo}}) => {\n const downloadUrl = await fetchDownloadUrl(client, photo)\n\n const description = photo.description || undefined\n const asset: AssetFromSource = {\n kind: 'url',\n value: downloadUrl,\n // @ts-expect-error TODO: this is a partial assetDocumentProps, update types.\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 },\n }\n return onSelect([asset])\n }}\n >\n <RowsPhotoAlbum<ReturnType<typeof mapUnsplashToPhotoAlbumPhoto>>\n photos={[]}\n spacing={PHOTO_SPACING}\n padding={PHOTO_PADDING}\n targetRowHeight={(width) => {\n if (width < 300) return 150\n if (width < 600) return 200\n return 300\n }}\n render={{\n extras: (_, context) => {\n return (\n <UnsplashCreditLine\n id={context.photo.data.id}\n link={context.photo.data.links.html}\n userName={context.photo.data.user.username}\n />\n )\n },\n }}\n componentsProps={{container: {style: {marginBottom: PHOTO_SPACING}}}}\n />\n </InfiniteScroll>\n </Activity>\n </>","_c","_Fragment"],"sources":["../src/components/UnsplashCreditLine.tsx","../src/components/UnsplashPhotoGallery.tsx"],"sourcesContent":["import {Text, Card} from '@sanity/ui'\nimport {getTheme_v2} from '@sanity/ui/theme'\nimport {styled} from 'styled-components'\n\nconst CreditLineLink = styled.a`\n text-decoration: none;\n cursor: pointer;\n &:hover,\n &:focus {\n [data-ui='Text'] {\n text-decoration: underline;\n }\n }\n`\n\nconst CreditLine = styled(Card)`\n ${({theme}) => {\n const v2 = getTheme_v2({sanity: theme.sanity})\n return `\n --creditline-fg: ${v2.color.fg};\n --creditline-bg: ${v2.color.bg};\n `\n }};\n -webkit-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\nconst UTM_SOURCE = 'sanity-plugin-asset-source-unsplash'\nexport function UnsplashCreditLine({\n link,\n id,\n userName,\n}: {\n link: string\n id: string\n userName: string\n}) {\n const url = new URL(link)\n url.searchParams.set('utm_source', UTM_SOURCE)\n url.searchParams.set('utm_medium', 'referral')\n\n return (\n <CreditLineLink\n href={url.toString()}\n target={id}\n rel=\"noreferrer noopener\"\n onClick={(event) => event.stopPropagation()}\n >\n <CreditLine padding={1} radius={1} margin={1}>\n <Text size={0} title={`Open image by ${userName} on Unsplash in new window`}>\n By @{userName}\n </Text>\n </CreditLine>\n </CreditLineLink>\n )\n}\n","import {Box, Text} from '@sanity/ui'\nimport {use, Activity} from 'react'\n\nimport 'react-photo-album/rows.css'\nimport {RowsPhotoAlbum} from 'react-photo-album'\nimport InfiniteScroll from 'react-photo-album/scroll'\nimport {type AssetFromSource, type AssetSourceComponentProps, type SanityClient} from 'sanity'\n\nimport {fetchDownloadUrl} from '../datastores/unsplash'\nimport type {FetcherResult, UnsplashPhoto} from '../types'\nimport {Loader} from './Loader'\nimport {UnsplashCreditLine} from './UnsplashCreditLine'\n\nconst PHOTO_SPACING = 2\nconst PHOTO_PADDING = 1 // offset the 1px border width\n\nfunction mapUnsplashToPhotoAlbumPhoto(photo: UnsplashPhoto) {\n return {\n src: photo.urls.small,\n width: photo.width,\n height: photo.height,\n key: photo.id,\n data: photo,\n }\n}\n\nexport default function UnsplashAssetSourceGallery({\n client,\n query,\n fetcher,\n scrollContainerRef,\n onSelect,\n initialDataPromise,\n}: {\n client: SanityClient\n query: string\n fetcher: (query: string, index: number) => Promise<FetcherResult>\n scrollContainerRef: React.RefObject<HTMLDivElement | null>\n initialDataPromise: Promise<FetcherResult>\n} & Pick<AssetSourceComponentProps, 'onSelect'>) {\n const data = use(initialDataPromise)\n\n return (\n <>\n <Activity mode={data.total === 0 ? 'visible' : 'hidden'}>\n <Box paddingX={2} paddingY={3}>\n <Text size={1} muted>\n No results found for \"{query}\"\n </Text>\n </Box>\n </Activity>\n <Activity mode={data.total === 0 ? 'hidden' : 'visible'}>\n <InfiniteScroll\n key={query}\n scrollContainer={() => scrollContainerRef.current}\n photos={data.results.map(mapUnsplashToPhotoAlbumPhoto)}\n fetch={async (index) => {\n const {results, total_pages} = await fetcher(query, index + 1)\n\n if (index < total_pages) {\n return results.map(mapUnsplashToPhotoAlbumPhoto)\n }\n\n return null\n }}\n loading={<Loader />}\n finished={\n query && (\n <Box paddingX={2} paddingY={3}>\n <Text size={1} muted>\n No more results\n </Text>\n </Box>\n )\n }\n onClick={async ({photo: {data: photo}}) => {\n const downloadUrl = await fetchDownloadUrl(client, photo)\n\n const description = photo.description || undefined\n const asset: AssetFromSource = {\n kind: 'url',\n value: downloadUrl,\n // @ts-expect-error TODO: this is a partial assetDocumentProps, update types.\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 },\n }\n return onSelect([asset])\n }}\n >\n <RowsPhotoAlbum<ReturnType<typeof mapUnsplashToPhotoAlbumPhoto>>\n photos={[]}\n spacing={PHOTO_SPACING}\n padding={PHOTO_PADDING}\n targetRowHeight={(width) => {\n if (width < 300) return 150\n if (width < 600) return 200\n return 300\n }}\n render={{\n extras: (_, context) => {\n return (\n <UnsplashCreditLine\n id={context.photo.data.id}\n link={context.photo.data.links.html}\n userName={context.photo.data.user.username}\n />\n )\n },\n }}\n componentsProps={{container: {style: {marginBottom: PHOTO_SPACING}}}}\n />\n </InfiniteScroll>\n </Activity>\n </>\n )\n}\n"],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { t as Loader } from "./Loader-
|
|
1
|
+
import { r as fetchUnsplashPhotos, t as Loader } from "./Loader-D8rxvGsi.js";
|
|
2
2
|
import "@sanity/ui/styles.css";
|
|
3
3
|
import { definePlugin, useClient } from "sanity";
|
|
4
4
|
import { c } from "react/compiler-runtime";
|
|
@@ -25,7 +25,7 @@ function UnsplashIcon() {
|
|
|
25
25
|
}
|
|
26
26
|
const rotate = keyframes`from{transform:rotate(0deg);}to{transform:rotate(360deg);}`, AnimatedSpinnerIcon = styled(SpinnerIcon).withConfig({
|
|
27
27
|
displayName: "AnimatedSpinnerIcon",
|
|
28
|
-
componentId: "sc-
|
|
28
|
+
componentId: "sc-p52uvh-0"
|
|
29
29
|
})`animation:${rotate} 500ms linear infinite;`;
|
|
30
30
|
function SearchInput(t0) {
|
|
31
31
|
let $ = c(11), { value, changeAction } = t0, [inputValue, setInputValue] = useOptimistic(value), isPending = inputValue !== value, t1;
|
|
@@ -42,34 +42,20 @@ function SearchInput(t0) {
|
|
|
42
42
|
icon: SearchIcon,
|
|
43
43
|
onChange: t3,
|
|
44
44
|
onClear: t4,
|
|
45
|
-
placeholder: "Search by topics or
|
|
45
|
+
placeholder: "Search by topics, colors, or image ID",
|
|
46
46
|
value: inputValue,
|
|
47
47
|
iconRight: t5
|
|
48
48
|
}), $[5] = inputValue, $[6] = t2, $[7] = t3, $[8] = t4, $[9] = t5, $[10] = t6) : t6 = $[10], t6;
|
|
49
49
|
}
|
|
50
50
|
const StyledDialog = styled(Dialog).withConfig({
|
|
51
51
|
displayName: "StyledDialog",
|
|
52
|
-
componentId: "sc-
|
|
53
|
-
})`& > [data-ui='DialogCard'] > [data-ui='Card']{height:100%;}`, UnsplashAssetSourceGallery = lazy(() => import("./UnsplashPhotoGallery-
|
|
52
|
+
componentId: "sc-6lylv9-0"
|
|
53
|
+
})`& > [data-ui='DialogCard'] > [data-ui='Card']{height:100%;}`, UnsplashAssetSourceGallery = lazy(() => import("./UnsplashPhotoGallery-DR1iIjJu.js"));
|
|
54
54
|
function UnsplashAssetSource(t0) {
|
|
55
55
|
let $ = c(25), { onClose, onSelect } = t0, t1;
|
|
56
56
|
$[0] === Symbol.for("react.memo_cache_sentinel") ? (t1 = { apiVersion: "2022-09-01" }, $[0] = t1) : t1 = $[0];
|
|
57
57
|
let client = useClient(t1), t2;
|
|
58
|
-
$[1] === client ? t2 = $[2] : (t2 = memoize(
|
|
59
|
-
let searchParams = new URLSearchParams({
|
|
60
|
-
page: `${page}`,
|
|
61
|
-
per_page: "42"
|
|
62
|
-
});
|
|
63
|
-
return query.trim() ? (searchParams.set("query", query.trim()), client.request({
|
|
64
|
-
url: `/addons/unsplash/search/photos?${searchParams}`,
|
|
65
|
-
withCredentials: !0,
|
|
66
|
-
method: "GET"
|
|
67
|
-
})) : (searchParams.set("order_by", "popular"), client.request({
|
|
68
|
-
url: `/addons/unsplash/photos?${searchParams}`,
|
|
69
|
-
withCredentials: !0,
|
|
70
|
-
method: "GET"
|
|
71
|
-
}).then(_temp));
|
|
72
|
-
}, _temp2), $[1] = client, $[2] = t2);
|
|
58
|
+
$[1] === client ? t2 = $[2] : (t2 = memoize((query, page) => fetchUnsplashPhotos(client, query, page), _temp), $[1] = client, $[2] = t2);
|
|
73
59
|
let fetcher = t2, [query_1, setQuery] = useState(""), scrollContainerRef = useRef(null), t3;
|
|
74
60
|
$[3] === onClose ? t3 = $[4] : (t3 = () => onClose(), $[3] = onClose, $[4] = t3);
|
|
75
61
|
let t4;
|
|
@@ -129,19 +115,12 @@ function UnsplashAssetSource(t0) {
|
|
|
129
115
|
children: t10
|
|
130
116
|
}), $[22] = t10, $[23] = t3, $[24] = t11) : t11 = $[24], t11;
|
|
131
117
|
}
|
|
132
|
-
function
|
|
118
|
+
function _temp(query_0, page_0) {
|
|
133
119
|
return JSON.stringify({
|
|
134
120
|
query: query_0,
|
|
135
121
|
page: page_0
|
|
136
122
|
});
|
|
137
123
|
}
|
|
138
|
-
function _temp(results) {
|
|
139
|
-
return {
|
|
140
|
-
results,
|
|
141
|
-
total: results.length,
|
|
142
|
-
total_pages: Math.ceil(results.length / 42)
|
|
143
|
-
};
|
|
144
|
-
}
|
|
145
124
|
/**
|
|
146
125
|
* @public
|
|
147
126
|
*/
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":["<svg\n // oxlint-disable-next-line prefer-tag-over-role\n role=\"img\"\n viewBox=\"0 0 25 25\"\n width=\"1em\"\n height=\"1em\"\n fill=\"currentColor\"\n >\n <title>Unsplash</title>\n <path d=\"M9 9V4h7v5H9Zm7 3h5v9H4v-9h5v5h7v-5Z\" />\n </svg>","_c","{\n value,\n changeAction,\n}: {\n value: string\n changeAction: (value: string) => Promise<void> | void\n}","function handleChange(newValue: string) {\n startTransition(async () => {\n setInputValue(newValue)\n await changeAction(newValue)\n })\n }","(event) => handleChange(event.currentTarget.value)","() => handleChange('')","<TextInput\n clearButton={inputValue.length > 0 && !isPending}\n icon={SearchIcon}\n onChange={(event) => handleChange(event.currentTarget.value)}\n onClear={() => handleChange('')}\n placeholder=\"Search by topics or colors\"\n value={inputValue}\n iconRight={isPending && AnimatedSpinnerIcon}\n />","inputValue.length > 0 && !isPending","isPending && AnimatedSpinnerIcon","_c","{onClose, onSelect}: AssetSourceComponentProps","{apiVersion: '2022-09-01'}","memoize(\n async function fetcher(query: string, page: number): Promise<FetcherResult> {\n const searchParams = new URLSearchParams({\n page: `${page}`,\n per_page: `${RESULTS_PER_PAGE}`,\n })\n if (query.trim()) {\n searchParams.set('query', query.trim())\n return client.request<{\n results: UnsplashPhoto[]\n total: number\n total_pages: number\n }>({\n url: `/addons/unsplash/search/photos?${searchParams}`,\n withCredentials: true,\n method: 'GET',\n })\n }\n searchParams.set('order_by', 'popular')\n return client\n .request<UnsplashPhoto[]>({\n url: `/addons/unsplash/photos?${searchParams}`,\n withCredentials: true,\n method: 'GET',\n })\n .then((results) => ({\n results,\n total: results.length,\n total_pages: Math.ceil(results.length / RESULTS_PER_PAGE),\n }))\n },\n (query, page) => JSON.stringify({query, page}),\n )","(results) => ({\n results,\n total: results.length,\n total_pages: Math.ceil(results.length / RESULTS_PER_PAGE),\n })","(query, page) => JSON.stringify({query, page})","useMemo(\n () =>\n memoize(\n async function fetcher(query: string, page: number): Promise<FetcherResult> {\n const searchParams = new URLSearchParams({\n page: `${page}`,\n per_page: `${RESULTS_PER_PAGE}`,\n })\n if (query.trim()) {\n searchParams.set('query', query.trim())\n return client.request<{\n results: UnsplashPhoto[]\n total: number\n total_pages: number\n }>({\n url: `/addons/unsplash/search/photos?${searchParams}`,\n withCredentials: true,\n method: 'GET',\n })\n }\n searchParams.set('order_by', 'popular')\n return client\n .request<UnsplashPhoto[]>({\n url: `/addons/unsplash/photos?${searchParams}`,\n withCredentials: true,\n method: 'GET',\n })\n .then((results) => ({\n results,\n total: results.length,\n total_pages: Math.ceil(results.length / RESULTS_PER_PAGE),\n }))\n },\n (query, page) => JSON.stringify({query, page}),\n ),\n [client],\n )","query","() => onClose()","{overflow: 'hidden scroll', overflowX: 'clip', overflowY: 'scroll'}","{position: 'sticky', top: 0, zIndex: 1}","<Box style={{position: 'sticky', top: 0, zIndex: 1}}>\n <SearchInput changeAction={setQuery} value={query} />\n </Box>","<Loader />","fetcher(query, 1)","<Suspense fallback={<Loader />}>\n <UnsplashAssetSourceGallery\n client={client}\n query={query}\n fetcher={fetcher}\n scrollContainerRef={scrollContainerRef}\n onSelect={onSelect}\n initialDataPromise={fetcher(query, 1)}\n />\n </Suspense>","<Stack\n ref={scrollContainerRef}\n gap={1}\n paddingLeft={3}\n height=\"stretch\"\n style={{overflow: 'hidden scroll', overflowX: 'clip', overflowY: 'scroll'}}\n >\n <Box style={{position: 'sticky', top: 0, zIndex: 1}}>\n <SearchInput changeAction={setQuery} value={query} />\n </Box>\n <Suspense fallback={<Loader />}>\n <UnsplashAssetSourceGallery\n client={client}\n query={query}\n fetcher={fetcher}\n scrollContainerRef={scrollContainerRef}\n onSelect={onSelect}\n initialDataPromise={fetcher(query, 1)}\n />\n </Suspense>\n </Stack>","<StyledDialog\n animate\n id=\"unsplash-asset-source\"\n header=\"Select image from Unsplash\"\n onClose={() => onClose()}\n open\n height=\"100%\"\n width={4}\n >\n <Stack\n ref={scrollContainerRef}\n gap={1}\n paddingLeft={3}\n height=\"stretch\"\n style={{overflow: 'hidden scroll', overflowX: 'clip', overflowY: 'scroll'}}\n >\n <Box style={{position: 'sticky', top: 0, zIndex: 1}}>\n <SearchInput changeAction={setQuery} value={query} />\n </Box>\n <Suspense fallback={<Loader />}>\n <UnsplashAssetSourceGallery\n client={client}\n query={query}\n fetcher={fetcher}\n scrollContainerRef={scrollContainerRef}\n onSelect={onSelect}\n initialDataPromise={fetcher(query, 1)}\n />\n </Suspense>\n </Stack>\n </StyledDialog>","_c"],"sources":["../src/components/Icon.tsx","../src/components/SearchInput.tsx","../src/components/UnsplashAssetSource.tsx","../src/index.ts"],"sourcesContent":["/**\n * @public\n */\nexport function UnsplashIcon(): React.JSX.Element {\n return (\n <svg\n // oxlint-disable-next-line prefer-tag-over-role\n role=\"img\"\n viewBox=\"0 0 25 25\"\n width=\"1em\"\n height=\"1em\"\n fill=\"currentColor\"\n >\n <title>Unsplash</title>\n <path d=\"M9 9V4h7v5H9Zm7 3h5v9H4v-9h5v5h7v-5Z\" />\n </svg>\n )\n}\n","import {SearchIcon} from '@sanity/icons/Search'\nimport {SpinnerIcon} from '@sanity/icons/Spinner'\nimport {TextInput} from '@sanity/ui'\nimport {startTransition, useOptimistic} from 'react'\nimport {styled, keyframes} from 'styled-components'\n\nconst rotate = keyframes`\n from {\n transform: rotate(0deg);\n }\n\n to {\n transform: rotate(360deg);\n }\n`\n\nconst AnimatedSpinnerIcon = styled(SpinnerIcon)`\n animation: ${rotate} 500ms linear infinite;\n`\n\nexport function SearchInput({\n value,\n changeAction,\n}: {\n value: string\n changeAction: (value: string) => Promise<void> | void\n}) {\n const [inputValue, setInputValue] = useOptimistic(value)\n const isPending = inputValue !== value\n function handleChange(newValue: string) {\n startTransition(async () => {\n setInputValue(newValue)\n await changeAction(newValue)\n })\n }\n\n return (\n <TextInput\n clearButton={inputValue.length > 0 && !isPending}\n icon={SearchIcon}\n onChange={(event) => handleChange(event.currentTarget.value)}\n onClear={() => handleChange('')}\n placeholder=\"Search by topics or colors\"\n value={inputValue}\n iconRight={isPending && AnimatedSpinnerIcon}\n />\n )\n}\n","import {Dialog, Stack, Box} from '@sanity/ui'\nimport memoize from 'lodash-es/memoize.js'\nimport {lazy, Suspense, useMemo, useRef, useState} from 'react'\nimport {type AssetSourceComponentProps, useClient} from 'sanity'\nimport {styled} from 'styled-components'\n\nimport type {FetcherResult, UnsplashPhoto} from '../types'\nimport {Loader} from './Loader'\nimport {SearchInput} from './SearchInput'\n\nconst RESULTS_PER_PAGE = 42\n\nconst StyledDialog = styled(Dialog)`\n & > [data-ui='DialogCard'] > [data-ui='Card'] {\n height: 100%;\n }\n`\n\nconst UnsplashAssetSourceGallery = lazy(() => import('./UnsplashPhotoGallery'))\n\nexport function UnsplashAssetSource({onClose, onSelect}: AssetSourceComponentProps) {\n const client = useClient({apiVersion: '2022-09-01'})\n const fetcher = useMemo(\n () =>\n memoize(\n async function fetcher(query: string, page: number): Promise<FetcherResult> {\n const searchParams = new URLSearchParams({\n page: `${page}`,\n per_page: `${RESULTS_PER_PAGE}`,\n })\n if (query.trim()) {\n searchParams.set('query', query.trim())\n return client.request<{\n results: UnsplashPhoto[]\n total: number\n total_pages: number\n }>({\n url: `/addons/unsplash/search/photos?${searchParams}`,\n withCredentials: true,\n method: 'GET',\n })\n }\n searchParams.set('order_by', 'popular')\n return client\n .request<UnsplashPhoto[]>({\n url: `/addons/unsplash/photos?${searchParams}`,\n withCredentials: true,\n method: 'GET',\n })\n .then((results) => ({\n results,\n total: results.length,\n total_pages: Math.ceil(results.length / RESULTS_PER_PAGE),\n }))\n },\n (query, page) => JSON.stringify({query, page}),\n ),\n [client],\n )\n\n const [query, setQuery] = useState('')\n const scrollContainerRef = useRef<HTMLDivElement>(null)\n\n return (\n <StyledDialog\n animate\n id=\"unsplash-asset-source\"\n header=\"Select image from Unsplash\"\n onClose={() => onClose()}\n open\n height=\"100%\"\n width={4}\n >\n <Stack\n ref={scrollContainerRef}\n gap={1}\n paddingLeft={3}\n height=\"stretch\"\n style={{overflow: 'hidden scroll', overflowX: 'clip', overflowY: 'scroll'}}\n >\n <Box style={{position: 'sticky', top: 0, zIndex: 1}}>\n <SearchInput changeAction={setQuery} value={query} />\n </Box>\n <Suspense fallback={<Loader />}>\n <UnsplashAssetSourceGallery\n client={client}\n query={query}\n fetcher={fetcher}\n scrollContainerRef={scrollContainerRef}\n onSelect={onSelect}\n initialDataPromise={fetcher(query, 1)}\n />\n </Suspense>\n </Stack>\n </StyledDialog>\n )\n}\n","import '@sanity/ui/styles.css'\nimport {type AssetSource, definePlugin, type Plugin} from 'sanity'\n\nimport {UnsplashIcon} from './components/Icon'\nimport {UnsplashAssetSource} from './components/UnsplashAssetSource'\n\nexport type {Asset, AssetDocument, UnsplashPhoto} from './types'\n\n/**\n * @public\n */\nexport const unsplashAssetSource: AssetSource = {\n name: 'unsplash',\n // oxlint-disable-next-line no-deprecated -- `i18nKey` requires a locale bundle; a plain title is intentional here\n title: 'Unsplash',\n component: UnsplashAssetSource,\n icon: UnsplashIcon,\n}\n\n/**\n * @public\n */\nexport const unsplashImageAsset: Plugin = definePlugin({\n name: 'asset-source-unsplash-plugin',\n\n form: {\n image: {\n assetSources: [unsplashAssetSource],\n },\n },\n})\n\nexport {UnsplashIcon}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","names":["<svg\n // oxlint-disable-next-line prefer-tag-over-role\n role=\"img\"\n viewBox=\"0 0 25 25\"\n width=\"1em\"\n height=\"1em\"\n fill=\"currentColor\"\n >\n <title>Unsplash</title>\n <path d=\"M9 9V4h7v5H9Zm7 3h5v9H4v-9h5v5h7v-5Z\" />\n </svg>","_c","{\n value,\n changeAction,\n}: {\n value: string\n changeAction: (value: string) => Promise<void> | void\n}","function handleChange(newValue: string) {\n startTransition(async () => {\n setInputValue(newValue)\n await changeAction(newValue)\n })\n }","(event) => handleChange(event.currentTarget.value)","() => handleChange('')","<TextInput\n clearButton={inputValue.length > 0 && !isPending}\n icon={SearchIcon}\n onChange={(event) => handleChange(event.currentTarget.value)}\n onClear={() => handleChange('')}\n placeholder=\"Search by topics, colors, or image ID\"\n value={inputValue}\n iconRight={isPending && AnimatedSpinnerIcon}\n />","inputValue.length > 0 && !isPending","isPending && AnimatedSpinnerIcon","_c","{onClose, onSelect}: AssetSourceComponentProps","{apiVersion: '2022-09-01'}","memoize(\n (query: string, page: number) => fetchUnsplashPhotos(client, query, page),\n (query, page) => JSON.stringify({query, page}),\n )","(query, page) => JSON.stringify({query, page})","useMemo(\n () =>\n memoize(\n (query: string, page: number) => fetchUnsplashPhotos(client, query, page),\n (query, page) => JSON.stringify({query, page}),\n ),\n [client],\n )","query","() => onClose()","{overflow: 'hidden scroll', overflowX: 'clip', overflowY: 'scroll'}","{position: 'sticky', top: 0, zIndex: 1}","<Box style={{position: 'sticky', top: 0, zIndex: 1}}>\n <SearchInput changeAction={setQuery} value={query} />\n </Box>","<Loader />","fetcher(query, 1)","<Suspense fallback={<Loader />}>\n <UnsplashAssetSourceGallery\n client={client}\n query={query}\n fetcher={fetcher}\n scrollContainerRef={scrollContainerRef}\n onSelect={onSelect}\n initialDataPromise={fetcher(query, 1)}\n />\n </Suspense>","<Stack\n ref={scrollContainerRef}\n gap={1}\n paddingLeft={3}\n height=\"stretch\"\n style={{overflow: 'hidden scroll', overflowX: 'clip', overflowY: 'scroll'}}\n >\n <Box style={{position: 'sticky', top: 0, zIndex: 1}}>\n <SearchInput changeAction={setQuery} value={query} />\n </Box>\n <Suspense fallback={<Loader />}>\n <UnsplashAssetSourceGallery\n client={client}\n query={query}\n fetcher={fetcher}\n scrollContainerRef={scrollContainerRef}\n onSelect={onSelect}\n initialDataPromise={fetcher(query, 1)}\n />\n </Suspense>\n </Stack>","<StyledDialog\n animate\n id=\"unsplash-asset-source\"\n header=\"Select image from Unsplash\"\n onClose={() => onClose()}\n open\n height=\"100%\"\n width={4}\n >\n <Stack\n ref={scrollContainerRef}\n gap={1}\n paddingLeft={3}\n height=\"stretch\"\n style={{overflow: 'hidden scroll', overflowX: 'clip', overflowY: 'scroll'}}\n >\n <Box style={{position: 'sticky', top: 0, zIndex: 1}}>\n <SearchInput changeAction={setQuery} value={query} />\n </Box>\n <Suspense fallback={<Loader />}>\n <UnsplashAssetSourceGallery\n client={client}\n query={query}\n fetcher={fetcher}\n scrollContainerRef={scrollContainerRef}\n onSelect={onSelect}\n initialDataPromise={fetcher(query, 1)}\n />\n </Suspense>\n </Stack>\n </StyledDialog>","_c"],"sources":["../src/components/Icon.tsx","../src/components/SearchInput.tsx","../src/components/UnsplashAssetSource.tsx","../src/index.ts"],"sourcesContent":["/**\n * @public\n */\nexport function UnsplashIcon(): React.JSX.Element {\n return (\n <svg\n // oxlint-disable-next-line prefer-tag-over-role\n role=\"img\"\n viewBox=\"0 0 25 25\"\n width=\"1em\"\n height=\"1em\"\n fill=\"currentColor\"\n >\n <title>Unsplash</title>\n <path d=\"M9 9V4h7v5H9Zm7 3h5v9H4v-9h5v5h7v-5Z\" />\n </svg>\n )\n}\n","import {SearchIcon} from '@sanity/icons/Search'\nimport {SpinnerIcon} from '@sanity/icons/Spinner'\nimport {TextInput} from '@sanity/ui'\nimport {startTransition, useOptimistic} from 'react'\nimport {styled, keyframes} from 'styled-components'\n\nconst rotate = keyframes`\n from {\n transform: rotate(0deg);\n }\n\n to {\n transform: rotate(360deg);\n }\n`\n\nconst AnimatedSpinnerIcon = styled(SpinnerIcon)`\n animation: ${rotate} 500ms linear infinite;\n`\n\nexport function SearchInput({\n value,\n changeAction,\n}: {\n value: string\n changeAction: (value: string) => Promise<void> | void\n}) {\n const [inputValue, setInputValue] = useOptimistic(value)\n const isPending = inputValue !== value\n function handleChange(newValue: string) {\n startTransition(async () => {\n setInputValue(newValue)\n await changeAction(newValue)\n })\n }\n\n return (\n <TextInput\n clearButton={inputValue.length > 0 && !isPending}\n icon={SearchIcon}\n onChange={(event) => handleChange(event.currentTarget.value)}\n onClear={() => handleChange('')}\n placeholder=\"Search by topics, colors, or image ID\"\n value={inputValue}\n iconRight={isPending && AnimatedSpinnerIcon}\n />\n )\n}\n","import {Dialog, Stack, Box} from '@sanity/ui'\nimport memoize from 'lodash-es/memoize.js'\nimport {lazy, Suspense, useMemo, useRef, useState} from 'react'\nimport {type AssetSourceComponentProps, useClient} from 'sanity'\nimport {styled} from 'styled-components'\n\nimport {fetchUnsplashPhotos} from '../datastores/unsplash'\nimport {Loader} from './Loader'\nimport {SearchInput} from './SearchInput'\n\nconst StyledDialog = styled(Dialog)`\n & > [data-ui='DialogCard'] > [data-ui='Card'] {\n height: 100%;\n }\n`\n\nconst UnsplashAssetSourceGallery = lazy(() => import('./UnsplashPhotoGallery'))\n\nexport function UnsplashAssetSource({onClose, onSelect}: AssetSourceComponentProps) {\n const client = useClient({apiVersion: '2022-09-01'})\n const fetcher = useMemo(\n () =>\n memoize(\n (query: string, page: number) => fetchUnsplashPhotos(client, query, page),\n (query, page) => JSON.stringify({query, page}),\n ),\n [client],\n )\n\n const [query, setQuery] = useState('')\n const scrollContainerRef = useRef<HTMLDivElement>(null)\n\n return (\n <StyledDialog\n animate\n id=\"unsplash-asset-source\"\n header=\"Select image from Unsplash\"\n onClose={() => onClose()}\n open\n height=\"100%\"\n width={4}\n >\n <Stack\n ref={scrollContainerRef}\n gap={1}\n paddingLeft={3}\n height=\"stretch\"\n style={{overflow: 'hidden scroll', overflowX: 'clip', overflowY: 'scroll'}}\n >\n <Box style={{position: 'sticky', top: 0, zIndex: 1}}>\n <SearchInput changeAction={setQuery} value={query} />\n </Box>\n <Suspense fallback={<Loader />}>\n <UnsplashAssetSourceGallery\n client={client}\n query={query}\n fetcher={fetcher}\n scrollContainerRef={scrollContainerRef}\n onSelect={onSelect}\n initialDataPromise={fetcher(query, 1)}\n />\n </Suspense>\n </Stack>\n </StyledDialog>\n )\n}\n","import '@sanity/ui/styles.css'\nimport {type AssetSource, definePlugin, type Plugin} from 'sanity'\n\nimport {UnsplashIcon} from './components/Icon'\nimport {UnsplashAssetSource} from './components/UnsplashAssetSource'\n\nexport type {Asset, AssetDocument, UnsplashPhoto} from './types'\n\n/**\n * @public\n */\nexport const unsplashAssetSource: AssetSource = {\n name: 'unsplash',\n // oxlint-disable-next-line no-deprecated -- `i18nKey` requires a locale bundle; a plain title is intentional here\n title: 'Unsplash',\n component: UnsplashAssetSource,\n icon: UnsplashIcon,\n}\n\n/**\n * @public\n */\nexport const unsplashImageAsset: Plugin = definePlugin({\n name: 'asset-source-unsplash-plugin',\n\n form: {\n image: {\n assetSources: [unsplashAssetSource],\n },\n },\n})\n\nexport {UnsplashIcon}\n"],"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": "7.0.
|
|
3
|
+
"version": "7.0.30",
|
|
4
4
|
"description": "Use images from Unsplash.com in your Sanity Studio",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"assets",
|
|
@@ -32,20 +32,20 @@
|
|
|
32
32
|
},
|
|
33
33
|
"dependencies": {
|
|
34
34
|
"@sanity/icons": "^5.2.3",
|
|
35
|
-
"@sanity/ui": "^4.4.
|
|
35
|
+
"@sanity/ui": "^4.4.9",
|
|
36
36
|
"lodash-es": "^4.18.1",
|
|
37
37
|
"react-photo-album": "^3.6.0"
|
|
38
38
|
},
|
|
39
39
|
"devDependencies": {
|
|
40
40
|
"@sanity/tsconfig": "^2.2.1",
|
|
41
|
-
"@sanity/tsdown-config": "^0.
|
|
41
|
+
"@sanity/tsdown-config": "^0.31.1",
|
|
42
42
|
"@types/lodash-es": "^4.17.12",
|
|
43
43
|
"@types/node": "^24.19.2",
|
|
44
44
|
"@types/react": "^19.3.0",
|
|
45
|
-
"oxc-transform-react": "^0.
|
|
46
|
-
"react": "^19.3.
|
|
47
|
-
"sanity": "^6.
|
|
48
|
-
"styled-components": "^6.
|
|
45
|
+
"oxc-transform-react": "^0.154.0",
|
|
46
|
+
"react": "^19.3.1",
|
|
47
|
+
"sanity": "^6.19.0",
|
|
48
|
+
"styled-components": "^6.6.0",
|
|
49
49
|
"tsdown": "^0.23.1"
|
|
50
50
|
},
|
|
51
51
|
"peerDependencies": {
|
package/dist/Loader-BKAt74MR.js
DELETED
|
@@ -1,15 +0,0 @@
|
|
|
1
|
-
import { c } from "react/compiler-runtime";
|
|
2
|
-
import { jsx } from "react/jsx-runtime";
|
|
3
|
-
import { Flex, Spinner } from "@sanity/ui";
|
|
4
|
-
function Loader() {
|
|
5
|
-
let $ = c(1), t0;
|
|
6
|
-
return $[0] === Symbol.for("react.memo_cache_sentinel") ? (t0 = /* @__PURE__ */ jsx(Flex, {
|
|
7
|
-
align: "center",
|
|
8
|
-
justify: "center",
|
|
9
|
-
padding: 3,
|
|
10
|
-
children: /* @__PURE__ */ jsx(Spinner, { muted: !0 })
|
|
11
|
-
}), $[0] = t0) : t0 = $[0], t0;
|
|
12
|
-
}
|
|
13
|
-
export { Loader as t };
|
|
14
|
-
|
|
15
|
-
//# sourceMappingURL=Loader-BKAt74MR.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"Loader-BKAt74MR.js","names":["<Flex align=\"center\" justify=\"center\" padding={3}>\n <Spinner muted />\n </Flex>","_c"],"sources":["../src/components/Loader.tsx"],"sourcesContent":["import {Flex, Spinner} from '@sanity/ui'\n\nexport function Loader() {\n return (\n <Flex align=\"center\" justify=\"center\" padding={3}>\n <Spinner muted />\n </Flex>\n )\n}\n"],"mappings":";;;AAEA,SAAgB,SAAS;eAErBA;CADF,2DACG,KAAA,oBAAA,MAAD;EAAM,OAAM;EAAS,SAAQ;EAAS,SAAS;EAC7C,UAAA,oBAAC,SAAD,EAAS,OAAA,GAAO,CAAA;CACZ,CAAA,2BAFNA;AAIJ"}
|