sanity-plugin-asset-source-unsplash
7.0.247.0.25
dist/UnsplashPhotoGallery-95ChILH4.js.map+
dist/UnsplashPhotoGallery-95ChILH4.js.mapNew file+1
Index: package/dist/UnsplashPhotoGallery-95ChILH4.js.map
===================================================================
--- package/dist/UnsplashPhotoGallery-95ChILH4.js.map
+++ package/dist/UnsplashPhotoGallery-95ChILH4.js.map
@@ -0,0 +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()","{\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 </>"],"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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"}
\ No newline at end of file