sanity-plugin-asset-source-unsplash 4.0.0 → 4.0.1

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/lib/index.d.ts CHANGED
@@ -1,4 +1,5 @@
1
1
  import { AssetSource } from 'sanity'
2
+ import { JSX } from 'react'
2
3
  import { Plugin as Plugin_2 } from 'sanity'
3
4
 
4
5
  /**
@@ -43,6 +44,11 @@ export declare interface AssetDocument {
43
44
  */
44
45
  export declare const unsplashAssetSource: AssetSource
45
46
 
47
+ /**
48
+ * @public
49
+ */
50
+ export declare function UnsplashIcon(): JSX.Element
51
+
46
52
  /**
47
53
  * @public
48
54
  */
package/lib/index.js CHANGED
@@ -322,6 +322,7 @@ const unsplashAssetSource = {
322
322
  }
323
323
  });
324
324
  export {
325
+ UnsplashIcon,
325
326
  unsplashAssetSource,
326
327
  unsplashImageAsset
327
328
  };
package/lib/index.js.map CHANGED
@@ -1 +1 @@
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":["export 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 { type BehaviorSubject, concat, defer, type Observable } from 'rxjs'\nimport { debounceTime, distinctUntilChanged, map, switchMap, withLatestFrom } from 'rxjs/operators'\nimport type { SanityClient } from 'sanity'\n\nimport type { 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 // eslint-disable-next-line @typescript-eslint/no-explicit-any\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 // eslint-disable-next-line @typescript-eslint/no-explicit-any\n }) as any,\n )\n\nconst fetchList = (\n client: SanityClient,\n type: string,\n page: number,\n perPage: number,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\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 // eslint-disable-next-line @typescript-eslint/no-explicit-any\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 // eslint-disable-next-line @typescript-eslint/no-explicit-any\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 } from '@sanity/ui'\nimport { styled } from 'styled-components'\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: ${({ theme }) => `1px solid ${theme.sanity.color.card.enabled.border}`};\n box-sizing: content-box;\n -webkit-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 -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","import { Text } from '@sanity/ui'\nimport { useCallback, useEffect } from 'react'\n\nimport type { 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 // eslint-disable-next-line @typescript-eslint/no-explicit-any\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 // eslint-disable-next-line @typescript-eslint/no-explicit-any\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 // eslint-disable-next-line @typescript-eslint/no-explicit-any\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 return (\n <Root\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 { TextInput } from '@sanity/ui'\nimport { styled } from 'styled-components'\n\nexport const SearchInput = styled(TextInput)`\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 { SearchIcon } from '@sanity/icons'\nimport { Dialog, Flex, Spinner, Stack, Text } from '@sanity/ui'\nimport React from 'react'\nimport InfiniteScroll from 'react-infinite-scroll-component'\nimport PhotoAlbum from 'react-photo-album'\nimport { BehaviorSubject, type Subscription } from 'rxjs'\nimport {\n type AssetFromSource,\n type AssetSourceComponentProps,\n type SanityClient,\n useClient,\n} from 'sanity'\n\nimport { fetchDownloadUrl, search } from '../datastores/unsplash'\nimport type { UnsplashPhoto } from '../types'\nimport Photo from './Photo'\nimport { SearchInput } 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 override 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 override 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 override 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 // eslint-disable-next-line @typescript-eslint/no-explicit-any\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 handleSearchTermCleared = () => {\n this.setState({ query: '', page: 1, searchResults: [[]], isLoading: true, cursor: 0 })\n this.pageSubject$.next(1)\n this.searchSubject$.next('')\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 // eslint-disable-next-line @typescript-eslint/no-explicit-any\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 // eslint-disable-next-line @typescript-eslint/no-explicit-any\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 override render() {\n const { query, searchResults, isLoading } = this.state\n\n return (\n <Dialog\n animate\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} paddingX={4} paddingBottom={4}>\n <SearchInput\n clearButton={query.length > 0}\n icon={SearchIcon}\n onChange={this.handleSearchTermChanged}\n onClear={this.handleSearchTermCleared}\n placeholder=\"Search by topics or colors\"\n value={query}\n />\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 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 { type 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":["Unsplash","Icon"],"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":["/**\n * @public\n */\nexport 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 { type BehaviorSubject, concat, defer, type Observable } from 'rxjs'\nimport { debounceTime, distinctUntilChanged, map, switchMap, withLatestFrom } from 'rxjs/operators'\nimport type { SanityClient } from 'sanity'\n\nimport type { 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 // eslint-disable-next-line @typescript-eslint/no-explicit-any\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 // eslint-disable-next-line @typescript-eslint/no-explicit-any\n }) as any,\n )\n\nconst fetchList = (\n client: SanityClient,\n type: string,\n page: number,\n perPage: number,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\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 // eslint-disable-next-line @typescript-eslint/no-explicit-any\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 // eslint-disable-next-line @typescript-eslint/no-explicit-any\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 } from '@sanity/ui'\nimport { styled } from 'styled-components'\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: ${({ theme }) => `1px solid ${theme.sanity.color.card.enabled.border}`};\n box-sizing: content-box;\n -webkit-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 -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","import { Text } from '@sanity/ui'\nimport { useCallback, useEffect } from 'react'\n\nimport type { 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 // eslint-disable-next-line @typescript-eslint/no-explicit-any\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 // eslint-disable-next-line @typescript-eslint/no-explicit-any\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 // eslint-disable-next-line @typescript-eslint/no-explicit-any\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 return (\n <Root\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 { TextInput } from '@sanity/ui'\nimport { styled } from 'styled-components'\n\nexport const SearchInput = styled(TextInput)`\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 { SearchIcon } from '@sanity/icons'\nimport { Dialog, Flex, Spinner, Stack, Text } from '@sanity/ui'\nimport React from 'react'\nimport InfiniteScroll from 'react-infinite-scroll-component'\nimport PhotoAlbum from 'react-photo-album'\nimport { BehaviorSubject, type Subscription } from 'rxjs'\nimport {\n type AssetFromSource,\n type AssetSourceComponentProps,\n type SanityClient,\n useClient,\n} from 'sanity'\n\nimport { fetchDownloadUrl, search } from '../datastores/unsplash'\nimport type { UnsplashPhoto } from '../types'\nimport Photo from './Photo'\nimport { SearchInput } 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 override 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 override 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 override 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 // eslint-disable-next-line @typescript-eslint/no-explicit-any\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 handleSearchTermCleared = () => {\n this.setState({ query: '', page: 1, searchResults: [[]], isLoading: true, cursor: 0 })\n this.pageSubject$.next(1)\n this.searchSubject$.next('')\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 // eslint-disable-next-line @typescript-eslint/no-explicit-any\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 // eslint-disable-next-line @typescript-eslint/no-explicit-any\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 override render() {\n const { query, searchResults, isLoading } = this.state\n\n return (\n <Dialog\n animate\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} paddingX={4} paddingBottom={4}>\n <SearchInput\n clearButton={query.length > 0}\n icon={SearchIcon}\n onChange={this.handleSearchTermChanged}\n onClear={this.handleSearchTermCleared}\n placeholder=\"Search by topics or colors\"\n value={query}\n />\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 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 { type AssetSource, definePlugin } from 'sanity'\n\nimport { UnsplashIcon } 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: UnsplashIcon,\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\nexport { UnsplashIcon }\n"],"names":["Unsplash"],"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": "4.0.0",
3
+ "version": "4.0.1",
4
4
  "description": "Use images from Unsplash.com in your Sanity Studio",
5
5
  "keywords": [
6
6
  "sanity",
@@ -1,4 +1,7 @@
1
- export default function UnsplashIcon() {
1
+ /**
2
+ * @public
3
+ */
4
+ export function UnsplashIcon() {
2
5
  return (
3
6
  <svg role="img" viewBox="0 0 25 25" width="1em" height="1em" fill="currentColor">
4
7
  <title />
package/src/index.ts CHANGED
@@ -1,6 +1,6 @@
1
1
  import { type AssetSource, definePlugin } from 'sanity'
2
2
 
3
- import Icon from './components/Icon'
3
+ import { UnsplashIcon } from './components/Icon'
4
4
  import Unsplash from './components/UnsplashAssetSource'
5
5
 
6
6
  export type { Asset, AssetDocument, UnsplashPhoto } from './types'
@@ -12,7 +12,7 @@ export const unsplashAssetSource: AssetSource = {
12
12
  name: 'unsplash',
13
13
  title: 'Unsplash',
14
14
  component: Unsplash,
15
- icon: Icon,
15
+ icon: UnsplashIcon,
16
16
  }
17
17
 
18
18
  /**
@@ -29,3 +29,5 @@ export const unsplashImageAsset = definePlugin({
29
29
  },
30
30
  },
31
31
  })
32
+
33
+ export { UnsplashIcon }